记一次·Spark读Hbase
一 、背景
过年回来,数仓发现hive的一个表丢数据了,需要想办法补数据。这个表是flume消费kafka写hive。但是kafka里只保存最近7天数据,有部分数据kafka里已经没有了。不过这份数据会同时被消费到HBase内存储一份,并且HBase内的数据是正常的。所以这次任务是读HBase数据写Hive表。
- HBase表内,只有一个列族info,列族内只有一个列value。
- value为“|”分割的字段字符串。
- “|”切割字符串得到最后一个字段为数据的时间戳,记为ts。
- hive根据ts转换后的yyyyMMdd作为分区。
二、计划
- 计划使用Spark,通过newAPIHadoopRDD的方式读HBase数据到内存。
- 按照HBase中的timestamp过滤数据,取20220127到20220201之间的数据。
- 写入hdfs文件
三、代码
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.hadoop.hbase.util.Bytes
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession
object SparkScanHBase {
def main(args: Array[String]): Unit = {
println(args)
val startTS: String = args(0)
val endTS: String = args(1)
val path: String = args(2)
val spark: SparkSession =
SparkSession.builder().appName("SparkHBaseRDD")
.config("spark.kryoserializer.buffer"