HBase массивы и Hive - PullRequest
       4

HBase массивы и Hive

2 голосов
/ 11 февраля 2020

Я пытаюсь записать массивы в HBase, используя класс ArrayWritable oop. Я сериализую список в ArrayWritable, а затем использую WritableUtils.toByteArray для получения байтов. Во время чтения я восстанавливаю List из ArrayWritable. Добавили код для этой операции ниже. Я могу правильно читать / записывать список в базу данных HBase.

Однако, когда мы пытаемся создать внешнюю таблицу поверх записанных данных, мы не можем увидеть сохраненные массивы в ожидаемом формате. Список строк отображается в виде сцепленных строк без разделителя и, конечно, не в виде массивов или строк.

ПРОБЛЕМА : нам нужно, чтобы массивы HBase были видны в Hive в допустимом формате, который мы можем использовать. Мы также будем экспортировать эти данные для запросов в Redshift, и, следовательно, потребуется что-то работающее. Как я могу изменить свой подход чтения / записи, чтобы он работал как для Java приложения, так и для Hive / Redshift.

Метод, используемый для сериализации и десериализации:

public static ArrayWritable getWritableFromArray(List<String> stringList) {
    Writable[] writables = new Writable[stringList.size()];

    for (int i = 0; i < writables.length; i++) {
        writables[i] = new Text(stringList.get(i));
    }

    return new ArrayWritable(Text.class, writables);
}

public static List<String> getListFromWritable(ArrayWritable arrayWritable) {
    Writable[] writables = arrayWritable.get();
    List<String> list = new ArrayList<>(writables.length);
    for (Writable writable : writables) {
        list.add(((Text) writable).toString());
    }
    return list;
}

Метод для создание таблицы Hive:

create external table testdata(
uid bigint
,city array<string>
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, d:city")
TBLPROPERTIES("hbase.table.name" = "testdata");

Запрос из таблицы Hive возвращает следующее:

select * from testdata;
OK
23821975838576221       ["\u0000\u0000\u0000\u0001\u0006raipur\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"]
808554262192775221      ["\u0000\u0000\u0000","\u0006indore\u0006raipur\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"]
2361689275801875221     ["\u0000\u0000\u0000","\u0006indore\u0006raipur\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"]
4897772799782875221     ["\u0000\u0000\u0000","\nchandigarh\u0006indore\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"]

Когда эти данные экспортируются в Redshift, города выглядят объединенными, как

indoreraipur
chandigarhindore

Как я могу это исправить? Пытается ли написать Список непосредственно в HBase - плохая идея? Должен ли я попытаться вручную сериализовать и десериализовать его и записать в виде String вместо типа Array?

...