Я пытаюсь записать массивы в 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?