Я создал таблицу HBase в оболочке и добавил некоторые данные. В http://hbase.apache.org/book/dm.sort.html записано, что наборы данных сначала сортируются по строке rowkey, а затем по столбцу. Поэтому я попробовал что-то в оболочке HBase:Порядок сортировки в HBase с Pig/Piglatin в Java
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, как ожидалось.
Теперь я попробовал то же самое с Apache Pig в Java:
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])
Итак, теперь порядок с -> d -> а. Это кажется мне немного странным, разве это не должно быть так же, как в HBase? Для меня важно получить правильный порядок, потому что впоследствии я преобразую карту в сумку, а затем присоединяю ее к другим столам. Если оба входа отсортированы, я могу использовать объединение слияния, не сортируя их по наборам данных! Так кто-нибудь теперь, как можно получить отсортированную карту (или сумку) столбцов?
Отсортировано по алфавиту или по заказу вставки? – mr2ert
Выход, похоже, сортируется по вставке –
Упс, это было немного неясно. Итак, в нужном вам виде значения карты нужно сортировать в алфавитном порядке? Почему бы просто не отсортировать значения в UDF? – mr2ert