внешняя таблица hive в поле временной метки avro, возвращающая столько же - PullRequest
3 голосов
/ 29 мая 2020

У меня есть данные avro, которые имеют столбец с меткой времени в один столбец, и теперь я пытаюсь создать внешнюю таблицу кустов поверх файлов avro. Данные сохраняются в avro до тех пор, пока я ожидаю, что тип avro logic обработает обратное преобразование для отметки времени, когда я запрашиваю таблицу улья. Но этого не происходит при простом возврате длинного значения. Как я могу заставить это работать должным образом?

PS: Я использую Spark 2.3 и databricks com.databrospark-avro_2.11

    <dependency>
        <groupId>com.databricks</groupId>
        <artifactId>spark-avro_2.11</artifactId>
        <version>4.0.0</version>
    </dependency>

ШАГ1: Сохраните значение временной метки в avro

val startTs=java.sql.Timestamp.valueOf("2020-05-11 14:17:57.188")
val df=Seq(startTs).toDF
df.write.avro("/test")
val avroDf=spark.read.avro("/test")
avroDf.show(false)

+-------------+
|value        |
+-------------+
|1589221077188|
+-------------+


AVSC file  generated using avro-tools from the avro data files 
test.avsc 
{
  "type" : "record",
  "name" : "topLevelRecord",
  "fields" : [ {
    "name" : "value",
    "type" :  "long", "logicalType": "timestamp-millis" 
  } ]
}

hdfs dfs -copyFromLocal -f test.avsc /tmp/test.avsc

ШАГ 2: СОЗДАТЬ ВНЕШНЮЮ ТАБЛИЦУ УЛОВА для данных AVRO

DROP TABLE IF EXISTS test_a;

CREATE EXTERNAL TABLE  test_a 
STORED AS AVRO
LOCATION '/tenants/gwm/idr/tmp/test'
TBLPROPERTIES ('avro.schema.url'='/tmp/test.avsc');

msck repair table test_a;
select * from  test_a;

+----------------+--+
|  test_a.value  |
+----------------+--+
| 1589221077188  |
+----------------+--+

Вместо этого длинного значения я пытаюсь получить метку времени значение.

1 Ответ

3 голосов
/ 29 мая 2020

Из спецификации Avro:

Логический тип timestamp-millis аннотирует long Avro, где long хранит количество миллисекунд с эпохи unix, 1 января 1970 г. 00 : 00: 00.000 UT C.

Возможно, эта ссылка может помочь вам

Создание правильной схемы avro для записи timestamp

Другой способ мог бы запросить длинное значение из куста или сохранить метку времени в виде строкового значения из приложения Spark:

SELECT CONCAT(FROM_UNIXTIME(CAST(SUBSTR(CAST(1589221077188 AS STRING),1,10) AS BIGINT)),'.', SUBSTR(CAST(1589221077188 AS STRING),11,13)) AS timestamp; 

SELECT CONCAT(FROM_UNIXTIME(CAST(SUBSTR(CAST(time AS STRING),1,10) AS BIGINT)),'.', SUBSTR(CAST(time AS STRING),11,13)) AS timestamp; 
"2020-05-11 14:17:57.188"

Надеюсь, это поможет.

...