Hive SerDe initialize () вызывается 8 раз - PullRequest
0 голосов
/ 06 сентября 2018

Я пишу пользовательский 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?

Заранее спасибо!

...