使用Spark 2.3写入HBase时,如何按Dataset列指定行时间戳?
解决方案:用Dataset列值指定HBase行时间戳
要实现用Dataset中date列的值作为HBase行的时间戳,核心是在HBase列映射里把date列指定为特殊的:timestamp标识符,而非映射成普通列。之前的尝试错误地将时间戳当作普通列处理,导致未生效。
正确代码示例
case class Person(name: String, email: String, date: Long) import spark.implicits._ val personDS = Seq( Person("alice", "alice@alice.com", 1577836800000L), Person("bob", "bob@bob.com", 1609459200000L) ).toDS() personDS.write .format("org.apache.hadoop.hbase.spark") .option("hbase.columns.mapping", "name STRING :key, email STRING c:email, date LONG :timestamp") .option("hbase.table", "person") .option("hbase.spark.use.hbasecontext", false) .save()
关键说明
date LONG :timestamp是核心配置:告知HBase-Spark连接器,使用Dataset中date列的数值作为该行所有列的时间戳,替换默认的系统时间。- 无需将
date映射为普通列(如之前的c:date_to_remove),除非你确实需要把时间戳值也存储为HBase的一个列。
验证结果
写入后查询HBase,会得到你期望的输出:
alice column=c:email, timestamp=1577836800000, value=alice@alice.com bob column=c:email, timestamp=1609459200000, value=bob@bob.com
可选:同时存储时间戳列
如果需要把date的值同时存储为HBase的列,可在映射中同时保留:timestamp和普通列配置:
.option("hbase.columns.mapping", "name STRING :key, email STRING c:email, date LONG :timestamp, date LONG c:date")
此时c:date列的时间戳也会使用date列的数值,而非系统时间。
内容的提问来源于stack exchange,提问作者jmjO
相关产品推荐
相关产品推荐

