我在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的值。这些值可能会发生变化,一周后这些值可能会有所不同。我想捕捉新旧值(value)观。结果应存储在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脚本来实现这一目标吗?

任何帮助深表感谢。

最佳答案

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

  • 第一次使用Scan表并获取其输出。也有其他优化的变体。Scan scan = new Scan();ResultScanner scanner = table.getScanner(scan);for (Result result = scanner.next(); result != null; result = scanner.next()){
    //Create required format}
  • 对于下一次使用表中的Scan过滤器提供RangestartTime过滤器对表进行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}将包含更新记录的版本。您可以使用最新和最近的版本详细信息并生成输出。
    ojit_code
    我不确定Hive或Pig的处理方式。希望这可以帮助!
  • 关于hadoop - 如何从HBase表中获取值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43086986/

    10-16 21:30