【问题标题】:Parquet String to timestamp conversion in hive镶木地板字符串到蜂巢中的时间戳转换
【发布时间】:2019-03-22 22:10:06
【问题描述】:

我有一些代码生成的镶木地板文件。我为该数据创建了一个 DDL,在 hive 中添加了表并指向 hdfs 中的那些镶木地板文件。当我尝试查询表时,所有字段看起来都很完美。但是,对于时间戳字段,hive 给出了一个例外。

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

实际上,时间戳字段在 parquet 中存储为字符串,但我的配置单元表字段是时间戳类型。我认为这会导致问题,但是这样做的正确方法是什么?

【问题讨论】:

    标签: hadoop hive parquet


    【解决方案1】:

    我想出了一个替代我自己问题的方法。我将TIMESTAMP 列的列类型更改为STRING,并在获取数据时使用from_unixtime 方法将该特定列转换为预期的日期格式并且能够获取它。
    但是,这里的问题是,如果我的日期值是 2020-02-27 15:40:22,当我通过 Hive 获取此列的数据时,它返回 EpochSeconds,即 15340232000000
    因此,我通过以下查询在 Hive 中解决了这个问题:

    select *, from_unixtime(cast(SOURCE_LOAD_DATE as BIGINT) DIV 1000000) as SOURCE_LOAD_DATE from table_name;   
    

    使用上面的查询,我能够得到带有时间戳值的正确日期。

    注意:您需要强制转换具有时间戳数据的每一列。

    这是我能想到的唯一技巧。我希望这可以帮助你或其他人!

    【讨论】:

    【解决方案2】:

    这是 Hive 中的一个开放错误。

    并记录在https://issues.apache.org/jira/browse/HIVE-15079

    【讨论】:

    • 检查我的回答,如果你觉得有帮助就接受它
    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多