【发布时间】:2016-07-07 08:51:11
【问题描述】:
我正在使用 Spark 并尝试将 RDD 写入 HBase 表。
这里是示例代码:
public static void main(String[] args) {
// ... code omitted
JavaPairRDD<ImmutableBytesWritable, Put> hBasePutsRDD = rdd
.javaRDD()
.flatMapToPair(new MyFunction());
hBasePutsRDD.saveAsNewAPIHadoopDataset(job.getConfiguration());
}
private class MyFunction implements
PairFlatMapFunction<Row, ImmutableBytesWritable, Put> {
public Iterable<Tuple2<ImmutableBytesWritable, Put>> call(final Row row)
throws Exception {
List<Tuple2<ImmutableBytesWritable, Put>> puts = new ArrayList<>();
Put put = new Put(getRowKey(row));
String value = row.getAs("rddFieldName");
put.addColumn("CF".getBytes(Charset.forName("UTF-8")),
"COLUMN".getBytes(Charset.forName("UTF-8")),
value.getBytes(Charset.forName("UTF-8")));
return Collections.singletonList(
new Tuple2<>(new ImmutableBytesWritable(getRowKey(row)), put));
}
}
如果我像这样手动设置时间戳:
put.addColumn("CF".getBytes(Charset.forName("UTF-8")),
"COLUMN".getBytes(Charset.forName("UTF-8")),
manualTimestamp,
value.getBytes(Charset.forName("UTF-8")));
一切正常,我在 HBase 列“COLUMN”中的单元格版本与 RDD 中不同值的数量一样多。
但如果我不这样做,那么只有一个单元格版本。
换句话说,如果有多个Put对象具有相同列族和列,不同值和默认时间戳,唯一一个值将被插入,另一个值将被忽略(可能被覆盖)。
您能否帮助我了解它在这种情况下的工作原理(尤其是saveAsNewAPIHadoopDataset)以及如何修改代码以插入值而不是手动设置时间戳。
【问题讨论】:
标签: java hadoop apache-spark hbase