前言
在公司遇到一个业务场景需要spark同时读取hive和hbase的数据进行关联数据分析。起初开发完在测试系统测试的时候,能够稳定运行,但是用到真实数据的时候很快就暴露了问题,报NullException空指针异常。根本原因是需求要关系型数据和非关系型数据进行关联,而hbase本身是列式存储,列信息是可动态扩展的,在spark转换hbase数据的时候没有提前获知完整的表字段schema,导致读取的时候某些字段丢失,以至于不能成功与关系型数据关联。
故,对于此次遇到的问题特此记录!!!
方案的选择
以下分别介绍spark读取hbase数据进行转换Dataset并创建临时关系表结构的三个方案,第一个方案是最不稳定的,不建议;后两者视情况而定。
方案一
此方案的思想是:获取hbase列信息的rdd—>获取hbase数据rdd(Row)—>取列rdd的第一条列信息构建schema
弊端:不难理解,取第一条列信息不一定是完整的schema
public static void getHbaseDataset(SparkSession sparkSession, JavaSparkContext jsc, String hbaseTableName){
Configuration hbaseConfiguration = new SparkHbaseUtils().getConfiguration();
hbaseConfiguration.set(TableInputFormat.INPUT_TABLE,hbaseTableName);
JavaPairRDD<ImmutableBytesWritable, Result> hbaseRDD = jsc.newAPIHadoopRDD(hbaseConfiguration, TableInputFormat.class, ImmutableBytesWritable.cla