Я пишу пользовательский Hive SerDe, который может читать данные, хранящиеся как ORC.
Базовая таблица содержит MAP столбца event_map. SerDe считывает данные из столбца event_map и разбивает их на отдельные столбцы после некоторой дополнительной обработки. Например: карта будет {'key1': 'val1', 'key2': 'val2'}.
Затем я создам внешнюю таблицу, например:
ADD JAR hdfs:///user/my-serde.jar;
CREATE EXTERNAL TABLE IF NOT EXISTS dev_db.expand_data_using_serde (
key1 STRING,
key2 STRING
) PARTITIONED BY (
ds STRING
)
ROW FORMAT SERDE 'com.....MySerDeClass'
WITH SERDEPROPERTIES (
"key1" = "extract_json",
"key2" = "multiply_by_5"
)
STORED AS ORC
LOCATION 'hdfs://dev.db/underlying_table_stored_as_orc';
USE dev_db;
MSCK REPAIR TABLE expand_data_using_serde;
Тогда SerDe найдет столбцы 'key1' и 'key2' и извлечет их из базовой карты и отобразит их как отдельные столбцы вместо MAP. Я знаю, что мы можем разбить этот столбец с помощью запроса улья, но предоставив этот пример для простоты. Т.е. SerDe проверит, имеет ли таблица DDL ключ key1 в качестве столбца, и извлечет ключ key1 из карты событий и использует его для этого столбца.
Большая часть обработки находится в функции десериализации () serde. Но я заметил, что мой метод initialize () вызывается 8 раз.
Почему это? Десериализация вызывается один раз в строке, что имеет смысл, но инициализация вызывается неоднократно.
Кроме того, SerDe имеет доступ к схеме выходной таблицы через свойство «columns», может ли он также обращаться к запросу?
Например: если мой запрос
SELECT key1 FROM dev_db.expand_data_using_serde;
Может ли serde знать, что нам нужно только прочитать key1 и пропустить обработку для key2?
Заранее спасибо!