镶木地板字符串到配置单元中的时间戳转换
Parquet String to timestamp conversion in hive
我有一些代码生成的镶木地板文件。我为该数据创建了一个 DDL,在 hive 中添加了 table 并指向了 hdfs 中的那些 parquet 文件。当我尝试查询 table 时,所有字段看起来都很完美。但是,对于时间戳字段,hive 给出了一个例外。
HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.serde2.io.TimestampWritable
实际上,时间戳字段在 parquet 中存储为字符串,但我的配置单元 table 字段是时间戳类型。我认为这是导致问题的原因,但正确的方法是什么?
这是 Hive 中的一个未解决的错误。
我找到了解决我自己问题的方法。我将 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;
使用上面的查询,我能够获得带有时间戳值的正确日期。
注意: 您将需要转换包含时间戳数据的每一列。
这是我唯一能想到的技巧。我希望这可以帮助你或其他人!
我有一些代码生成的镶木地板文件。我为该数据创建了一个 DDL,在 hive 中添加了 table 并指向了 hdfs 中的那些 parquet 文件。当我尝试查询 table 时,所有字段看起来都很完美。但是,对于时间戳字段,hive 给出了一个例外。
HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.serde2.io.TimestampWritable
实际上,时间戳字段在 parquet 中存储为字符串,但我的配置单元 table 字段是时间戳类型。我认为这是导致问题的原因,但正确的方法是什么?
这是 Hive 中的一个未解决的错误。
我找到了解决我自己问题的方法。我将 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;
使用上面的查询,我能够获得带有时间戳值的正确日期。
注意: 您将需要转换包含时间戳数据的每一列。
这是我唯一能想到的技巧。我希望这可以帮助你或其他人!