avro时间戳字段上的配置单元外部表返回一样长

Posted

技术标签:

【中文标题】avro时间戳字段上的配置单元外部表返回一样长【英文标题】:hive external table on avro timestamp field returning as long 【发布时间】:2020-05-29 04:37:12 【问题描述】:

我有具有单列时间戳列的 avro 数据,现在我正在尝试在 avro 文件之上创建外部配置单元表。数据保存在 avro 中,我希望 avro 逻辑类型能够处理转换回来在我查询配置单元表时添加时间戳。但这并没有发生在它简单地返回 long 值。我怎样才能让它按预期工作?

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>

STEP1 : 将时间戳值存储到 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 数据上创建外部 HIVE 表

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】:

来自 Avro 规范:

timestamp-millis 逻辑类型注释 Avro long,其中 long 存储从 unix 纪元 1970 年 1 月 1 日 00:00:00.000 UTC 开始的毫秒数。

也许这个链接可以帮助你

Creating a Proper avro schema for timestamp record

另一种方法是从 hive 查询长值或将时间戳存储为 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"

我希望这会有所帮助。

【讨论】:

以上是关于avro时间戳字段上的配置单元外部表返回一样长的主要内容,如果未能解决你的问题,请参考以下文章

在 spark 中创建带有模式的配置单元外部表

分区 BigQuery 表,从 AVRO 加载

AWS EMR - 将数据帧保存到 S3 上的配置单元外部表中 - 出现内存泄漏错误

从两个配置单元表中删除重复数据

需要写访问权限的配置单元外部表

将外部分区表(带分区)与另一个没有分区的外部表在配置单元中连接