【问题标题】:How to get the values from HBase table?如何从 HBase 表中获取值?
【发布时间】:2017-03-29 07:24:35
【问题描述】:

我在 Hbase 中有一个表,其中有一个名为 a 的列族,其中大约有 30 列。下面是一个显示两个行键的单元格值的示例-

ROW                                  COLUMN+CELL
 00:001000574                        column=a:aasbig, timestamp=1486493154559, value=true
 00:001000574                        column=a:aasdel, timestamp=1486493154559, value=true
 00:001000574                        column=a:aasdhq, timestamp=1486493154559, value=false
 00:001000574                        column=a:aasfsc, timestamp=1486493154559, value=true
 00:001000574                        column=a:aasgbm, timestamp=1486493154559, value=true
 00:001000574                        column=a:aasgbr, timestamp=1486493154559, value=true
 00:001000574                        column=a:aasmcu, timestamp=1486493154559, value=true
 00:001000574                        column=a:aasser, timestamp=1486493154559, value=true
 00:001000574                        column=a:aastlp, timestamp=1486493154559, value=true
 00:001000574                        column=a:aasvia, timestamp=1486493154559, value=true
 00:001000707                        column=a:aasbig, timestamp=1486493154559, value=false
 00:001000707                        column=a:aasdel, timestamp=1486493154559, value=false
 00:001000707                        column=a:aasdhq, timestamp=1486493154559, value=true
 00:001000707                        column=a:aasfsc, timestamp=1486493154559, value=false
 00:001000707                        column=a:aasgbm, timestamp=1486493154559, value=false
 00:001000707                        column=a:aasgbr, timestamp=1486493154559, value=false
 00:001000707                        column=a:aasmcu, timestamp=1486493154559, value=false
 00:001000707                        column=a:aasser, timestamp=1486493154559, value=false
 00:001000707                        column=a:aastlp, timestamp=1486493154559, value=false
 00:001000707                        column=a:aasvia, timestamp=1486493154559, value=false

每一列都有一个带有truefalse 的值。这些值可能会发生变化,一周后这些值可能会有所不同。我想捕捉旧值和新值。结果应存储在 CSV 文件中。

我的要求是,当我第一次运行代码时,我应该看到 OLDVALUE 为 NULL,并且 HBase 表中的所有值都应该是 NEWVALUE 的一部分。

以下是我第一次运行时希望在 CSV 文件中看到的输出。

NUM,PRODUCT,OLDVALUE,NEWVALUE
001000574,aasbig,NULL,true
001000574,aasdel,NULL,true
001000574,aasdhq,NULL,false
001000574,aasfsc,NULL,true
001000574,aasgbm,NULL,true
001000574,aasgbr,NULL,true
001000574,aasmcu,NULL,true
001000574,aasser,NULL,true
001000574,aastlp,NULL,true
001000574,aasvia,NULL,true
001000707,aasbig,NULL,false
001000707,aasdel,NULL,false
001000707,aasdhq,NULL,true
001000707,aasfsc,NULL,false
001000707,aasgbm,NULL,false
001000707,aasgbr,NULL,false
001000707,aasmcu,NULL,false
001000707,aasser,NULL,false
001000707,aastlp,NULL,false
001000707,aasvia,NULL,false

从第二次开始,当我运行代码时,上一次运行的 NEWVALUES 中的所有值现在应该在 OLDVALUES 之下,NEWVALUES 应该从 HBase 表中获取当前值。像下面的示例输出

NUM,PRODUCT,OLDVALUE,NEWVALUE
001000574,aasbig,true,true
001000574,aasdel,true,true
001000574,aasdhq,false,false
001000574,aasfsc,true,true
001000574,aasgbm,true,false
001000574,aasgbr,true,true
001000574,aasmcu,true,false
001000574,aasser,true,false
001000574,aastlp,true,true
001000574,aasvia,true,true
001000707,aasbig,false,true
001000707,aasdel,false,true
001000707,aasdhq,true,true
001000707,aasfsc,false,false
001000707,aasgbm,false,false
001000707,aasgbr,false,false
001000707,aasmcu,false,true
001000707,aasser,false,true
001000707,aastlp,false,false
001000707,aasvia,false,true

我尝试了什么: 我创建了一个 Hive-on-Hbase 表,在查询表时,我只能得到 NUMvalue。我无法获取 HBase 列名。除非我实施一些连接操作,否则我在获取旧值和新值方面也遇到了挑战。

我们可以编写 Pig 脚本来实现这一点吗?

非常感谢任何帮助。

【问题讨论】:

    标签: hadoop hbase apache-pig


    【解决方案1】:

    这可以通过以下步骤以编程方式轻松完成:

    1. 第一次Scan 表并获取其输出。还有其他优化的变体。 Scan scan = new Scan(); ResultScanner scanner = table.getScanner(scan); for (Result result = scanner.next(); result != null; result = scanner.next()){
      //Create required format }
    2. 下次Scan 使用Range 过滤器在API 中提供startTime 部分时间的表。它将获取特定时间段后更新的所有记录。 Result 将包含更新记录的版本。您可以使用最新版本和最新版本详细信息并生成输出。 Scan scan = new Scan(); scan.setTimeRange(startTime, endTime); ResultScanner scanner = table.getScanner(scan); for (Result result = scanner.next(); result != null; result = scanner.next()){ NavigableMap<byte[],NavigableMap<byte[],NavigableMap<Long,byte[]>>> allVersions=result.getMap(); //allVersions map will give all versions of the record. //Create required format } 我不确定 Hive 或 Pig 的过程。希望这会有所帮助!

    【讨论】:

    • 你能编辑你的答案并用一些例子来说明吗?
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2011-07-17
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多