为了账号安全,请及时绑定邮箱和手机立即绑定

Athena 为镶木地板文件中的时间戳字段返回错误值

Athena 为镶木地板文件中的时间戳字段返回错误值

眼眸繁星 2023-04-18 16:21:12
我主要在这里重现我在forum.aws上看到的一个问题,希望 stackoverflow 社区的答案/解释比论坛上的讨论更彻底、更有启发性。这是我对这个问题的经验:我使用 pandas 从 python 中的数据帧制作了一个镶木地板文件,并将一个字段/列说生日作为datetime64[ns]使用pandas.to_datetime. 这部分过程似乎完美无缺,因为我可以使用读取镶木地板文件pandas.read_parquet并获得我期望的结果,即在日期时间中输入的日期。但是,当我将所述镶木地板文件加载到 AWS 并在athena其上放置一个表格时,读取相同的生日列会产生与镶木地板文件中的日期完全不匹配的垃圾日期。例如t = pandas.DataFrame([['Haiti',pandas.to_datetime('1804-01-01')]],columns=['Country','Independence'])t.to_parquet("s3://<mybucket>/tmp/t.parquet")|Country | Independence||--------|-------------||Haiti   | 1804-01-01  |CREATE EXTERNAL TABLE IF NOT EXISTS default.mytable (  `Country` string,  `Independence` timestamp )ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'WITH SERDEPROPERTIES (  'serialization.format' = '1') LOCATION 's3://<mybucket>/tmp/'TBLPROPERTIES ('has_encrypted_data'='false');SELECT * FROM "default"."mytable" limit 10;|Country | Independence             ||--------|--------------------------||Haiti   |-164033-12-18 00:00:00.000|
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以使用“coerce_timestamps”强制 to_parquet 以 Athena 可以理解的格式写入:


t = pandas.DataFrame([['Haiti',pandas.to_datetime('1804-01-01')]],columns=['Country','Independence'])

t.to_parquet("s3://<mybucket>/tmp/t.parquet", coerce_timestamps='ms')

|Country | Independence|

|--------|-------------|

|Haiti   | 1804-01-01  |

CREATE EXTERNAL TABLE IF NOT EXISTS default.mytable (

  `Country` string,

  `Independence` timestamp 

)

ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'

WITH SERDEPROPERTIES (

  'serialization.format' = '1'

) LOCATION 's3://<mybucket>/tmp/'

TBLPROPERTIES ('has_encrypted_data'='false');


SELECT * FROM "default"."mytable" limit 10;

|Country | Independence          |

|--------|-----------------------|

|Haiti   |1804-01-01 00:00:00.000|


查看完整回答
反对 回复 2023-04-18
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信