用于在Spark应用程序中检索HBase数据的newAPIHadoopRDD如何工作?

时间:2018-07-12 14:26:04

标签: java apache-spark input hbase rdd

我有一个Spark应用程序,该应用程序读取HBase表并创建RDD。 稍后,我将从RDD中创建一个元组列表,以便打印出所有行的键和值。

 Configuration config = HBaseConfiguration.create();
 config.set(TableInputFormat.INPUT_TABLE, "test_table");
 config.set(TableInputFormat.SCAN_COLUMN_FAMILY, "cf");
 config.set(TableInputFormat.SCAN_COLUMNS, "cf:column");


JavaPairRDD<ImmutableBytesWritable, Result> hBaseRDD = 
       javaSparkContext.newAPIHadoopRDD(config, TableInputFormat.class, 
       ImmutableBytesWritable.class, Result.class);

   List<Tuple2<ImmutableBytesWritable, Result>> resultList = hBaseRDD.collect();

    for (Tuple2<ImmutableBytesWritable, Result> item : resultList) {
        System.out.println(new String(item._1.get())); //Converts a byte array to a String and prints it out

        Result result = (Result) item._2;
        String value = Bytes.toString(result.getValue(Bytes.toBytes("cf"),Bytes.toBytes("column")));
        System.out.println(value);
    }

HBase表:

hbase(main):016:0>扫描'test_table' 行列+单元格
   rowid1 column = cf:列,时间戳= 1531401488632,value = value
   rowid2 column = cf:列,时间戳= 1531401529183,值= value2
   rowid3 column = cf:column,时间戳= 1531401538563,值= value3
0.0480秒内有3行

循环的输出如下: rowid3 值 rowid3 值2 rowid3 值3

我希望每个rowid都与其对应的value字段相关。出于某种原因,始终仅应用最后扫描的一个。

有人知道原因是什么吗?特别是引擎盖下发生了什么?我想这可能是由于为了从Hbase获取数据而进行的一些内部map-reduce处理所致。

使用: Java 8 哈多普2.7.3, HBase 1.3.1, Spark 2.2.1

1 个答案:

答案 0 :(得分:-1)

代码似乎正常。 应该可以。