[英]Put values from Spark RDD to the same HBase column with default timestamp
我正在使用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 ),以及如何修改代碼以插入值而無需手動設置時間戳。
不使用時間戳記時,它們將被覆蓋。 Hbase對於每個值都需要一個唯一的鍵,因此每個值的真實鍵是
rowkey + column family + column key + timestamp => value
當您不使用時間戳記並且將它們作為批量插入時,它們中的許多都將獲得相同的時間戳記,因為hbase可以在同一毫秒內插入多行。 因此,您需要為每個相同的列鍵值設置自定義時間戳。
我不明白您為什么不想使用自定義時間戳,因為您說它已經可以使用了。 如果您認為它將在數據庫中使用額外的空間,則即使您不輸入Put命令,hbase也已經使用了時間戳。 因此,當您使用手動時間戳記時,沒有任何變化,請使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.