簡體   English   中英

將帶有默認時間戳的Spark RDD中的值放入同一HBase列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM