преобразование метки времени в паркет int96 в дату / время через python - PullRequest
0 голосов
/ 16 марта 2020

TL; DR

Я бы хотел преобразовать значение int96, такое как ACIE4NxJAAAKhSUA , в читаемый формат отметки времени, такой как 2020-03-02 14: 34: 22 * ​​1008 * или что-либо еще, что обычно можно интерпретировать ... Я в основном использую python, поэтому я ищу для создания функции, которая выполняет это преобразование. Если есть другая функция, которая может сделать обратное - даже лучше.

Фон

Я использую parquet-tools для преобразования необработанного файла паркета (с мгновенным сжатием) в raw JSON с помощью этой команды:

C:\Research> java -jar parquet-tools-1.8.2.jar cat --json original-file.snappy.parquet > parquet-output.json

Внутри JSON я вижу эти значения как метки времени:

{... "_id":"101836","timestamp":"ACIE4NxJAAAKhSUA"}

Я определил, что значение метки времени "ACIE4NxJAAAKhSUA" действительно int96 (это также подтверждается чтением схемы файла паркета ....

message spark_schema {
 ...(stuff)...
  optional binary _id (UTF8);
  optional int96 timestamp;
}

Я думаю, что это также известно как Impala Timestamp (по крайней мере, это то, что я собрал) )

Дальнейшие исследования проблем

Я всюду искал какую-либо функцию или информацию о том, как "прочитать" значение int96 (в python - я хотел бы сохранить его на этом языке, так как я больше всего с ним знаком) и выведите временную метку - я ничего не нашел.

Вот статьи, которые я уже изучил (которые связаны с этой темой):

  • Исследование ParquetWriter в S O здесь
  • Приведение int96 через golan в SO здесь ПРИМЕЧАНИЕ: у меня есть функция, которую я мог бы изучить, но я не уверен, как погружаться слишком глубоко

Что касается устаревшей временной метки int96

Пожалуйста, не просите меня прекратить использовать старый / устаревший формат временной метки в файле паркета, я хорошо знаю об этом в исследовании, которое я сделали до сих пор. Я получатель файла / данных - я не могу изменить формат, использованный при создании.

Если есть другой способ управления начальным выводом JSON для выдачи значения "не int96" - - Я бы тоже заинтересовался этим.

Большое спасибо за вашу помощь ТАК сообщество!

1 Ответ

1 голос
/ 16 марта 2020

parquet-tools не сможет изменить тип формата с INT96 на INT64. В выводе json вы наблюдаете строковое представление временной метки, хранящейся в INT96 TimestampType. Вам понадобится spark, чтобы переписать этот паркет с меткой времени в INT64 TimestampType, и тогда вывод json выдаст метку времени (в нужном формате).

Вам нужно будет задать спецификацию c config в Spark -

spark-shell --conf spark.sql.parquet.outputTimestampType=TIMESTAMP_MICROS

2020-03-16 11:37:50 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://192.168.0.20:4040
Spark context available as 'sc' (master = local[*], app id = local-1584383875924).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_91)
Type in expressions to have them evaluated.
Type :help for more information.

val sourceDf = spark.read.parquet("original-file.snappy.parquet")
2020-03-16 11:38:31 WARN  Utils:66 - Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
sourceDf: org.apache.spark.sql.DataFrame = [application: struct<name: string, upgrades: struct<value: double> ... 3 more fields>, timestamp: timestamp ... 16 more fields]

scala> sourceDf.repartition(1).write.parquet("Downloads/output")

Parquet-tools покажет правильный TimestampType

parquet-tools schema Downloads/output/part-00000-edba239b-e696-4b4e-8fd3-c7cca9eea6bf-c000.snappy.parquet 

message spark_schema {
  ...
  optional binary _id (UTF8);
  optional int64 timestamp (TIMESTAMP_MICROS);
  ...
}

И json dump дает -

parquet-tools cat --json Downloads/output/part-00000-edba239b-e696-4b4e-8fd3-c7cca9eea6bf-c000.snappy.parquet

{..."_id":"101836", "timestamp":1583973827000000}

Записанная метка времени указана в нано секундах. Надеюсь, это поможет!

...