gpt4 book ai didi

hadoop - 如何从 HBase 表中获取值?

转载 作者:可可西里 更新时间:2023-11-01 15:56:24 24 4
gpt4 key购买 nike

我在 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 中的所有值现在应该位于 OLDVALUESNEWVALUES 应该从 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 脚本来实现这一点吗?

非常感谢任何帮助。

最佳答案

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

  1. 第一次Scan表并得到它的输出。还有其他优化的变体。
    Scan scan = new Scan();
    ResultScanner scanner = table.getScanner(scan);
    for (Result result = scanner.next(); result != null; result = scanner.next()){<br/>
    //Create required format
    }
  2. 下次Scan使用 Range 的表格过滤器提供startTime在 API 中兼职。它将获取特定时间段后更新的所有记录。 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 的处理过程。希望这对您有所帮助!

关于hadoop - 如何从 HBase 表中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43086986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com