Обработка дат в Hadoop
Я новичок в экосистеме больших данных /Hadoop и заметил, что даты не всегда обрабатываются стандартным образом в разных технологиях. Я планирую загружать данные из Oracle в таблицы Hive на HDFS, используя Sqoop с форматами файлов Avro и Parquet. Hive продолжает импортировать мои даты в значения BIGINT, я бы предпочел TIMESTAMPS. Я пытался использовать переопределения "--map-column-hive"... но все равно не работает.
Ищете предложения по лучшему способу обработки дат для этого варианта использования.
1 ответ
Формат файла паркета
Если вы используете Sqoop для преобразования данных RDBMS в Parquet, будьте осторожны с интерпретацией любых результирующих значений из столбцов DATE, DATETIME или TIMESTAMP. Базовые значения представлены в виде типа Parquet INT64, который представлен как BIGINT в таблице Impala. Значения Parquet представляют время в миллисекундах, а Impala интерпретирует BIGINT как время в секундах. Поэтому, если у вас есть столбец BIGINT в таблице Parquet, который был импортирован таким образом из Sqoop, разделите значения на 1000 при интерпретации как тип TIMESTAMP.
Avro Формат файла
В настоящее время таблицы Avro не могут содержать столбцы TIMESTAMP. Если вам необходимо сохранить значения даты и времени в таблицах Avro, в качестве обходного пути вы можете использовать STRING-представление значений, преобразовать значения в BIGINT с помощью функции UNIX_TIMESTAMP() или создать отдельные числовые столбцы для отдельных полей даты и времени, используя функция EXTRACT().
Вы также можете использовать свой запрос Hive, чтобы получить результат в желаемом формате TIMESTAMP.
FROM_UNIXTIME(CAST(SUBSTR(timestamp_column, 1,10) AS INT)) AS timestamp_column;
Другой обходной путь - импорт данных с использованием --query
в команде sqoop, где вы можете привести ваш столбец в формат отметки времени.
пример
--query 'SELECT CAST (INSERTION_DATE AS TIMESTAMP) FROM tablename WHERE $CONDITIONS'
Если ваш запрос SELECT становится немного длиннее, вы можете использовать файлы конфигурации, чтобы сократить длину вызова командной строки. Вот ссылка