【问题标题】:Spark: write timestamp to parquet and read it from Hive / ImpalaSpark:将时间戳写入镶木地板并从 Hive / Impala 读取
【发布时间】:2019-02-19 07:18:13
【问题描述】:

我需要在 parquet 中写入时间戳,然后使用 Hive 和 Impala 读取它。

为了写,我试过eg

my.select(
 ...,
 unix_timestamp() as "myts"
 .write
 .parquet(dir)

然后阅读我在 Hive 中创建了一个外部表:

CREATE EXTERNAL TABLE IF NOT EXISTS mytable (
  ...
  myts TIMESTAMP
) 

这样做,我得到了错误

HiveException: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.hive.serde2.io.TimestampWritable

我还尝试将 unix_timestamp() 替换为

to_utc_timestamp(lit("2018-05-06 20:30:00"), "UTC")

同样的问题。在 Impala 中,它返回给我:

 Column type: TIMESTAMP, Parquet schema: optional int64 

而时间戳应该是 int96。 将时间戳写入镶木地板的正确方法是什么?

【问题讨论】:

  • 我发现了一个相关问题:jira.pentaho.com/browse/PDI-17275寻找解决方法
  • 您可以先创建表,然后使用 SparkSQL INSERT 到该表中,自动管理兼容性问题...无意冒犯,但我相信 Spark 代码库会比你仓促的“解决方法”做得更好。

标签: apache-spark hive timestamp impala


【解决方案1】:

找到一个解决方法:一个返回 java.sql.Timestamp 对象的 UDF,没有强制转换,然后 spark 会将其保存为 int96。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多