我在 shell 中创建了一个 HBase 表并添加了一些数据。在http://hbase.apache.org/book/dm.sort.html中写道,数据集首先按行键排序,然后按列排序。所以我在 HBase Shell 中尝试了一些东西:
hbase(main):013:0> put 'mytable', 'key1', 'cf:c', 'val'
0 row(s) in 0.0110 seconds
hbase(main):011:0> put 'mytable', 'key1', 'cf:d', 'val'
0 row(s) in 0.0060 seconds
hbase(main):012:0> put 'mytable', 'key1', 'cf:a', 'val'
0 row(s) in 0.0060 seconds
hbase(main):014:0> get 'mytable', 'key1'
COLUMN CELL
cf:a timestamp=1376468325426, value=val
cf:c timestamp=1376468328318, value=val
cf:d timestamp=1376468321642, value=val
3 row(s) in 0.0570 seconds
一切看起来都很好。我得到了正确的顺序 a -> c -> d 符合预期。
现在我用 Java 中的 Apache Pig 尝试了同样的方法:
pigServer.registerQuery("mytable_data = load 'hbase://mytable' using org.apache.pig.backend.hadoop.hbase.HBaseStorage('cf', '-loadKey true') as (rowkey:chararray, columncontent:map[]);");
printAlias("mytable_data"); // own function, which itereate over the keys
我得到了这个结果:
(key1,[c#val,d#val,a#val])
所以,现在的顺序是 c -> d -> a。这对我来说似乎有点奇怪,不应该和 HBase 一样吗?获得正确的顺序对我来说很重要,因为我之后将地图转换成一个袋子,然后将它与其他表连接起来。如果两个输入都已排序,我可以使用合并连接而不将它们排序到数据集?!那么现在有没有人如何获得列的排序图(或包)?