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

我主要在这里重现我在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|


眼眸繁星
浏览 74回答 1
1回答

翻过高山走不出你

您可以使用“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&nbsp; &nbsp;| 1804-01-01&nbsp; |CREATE EXTERNAL TABLE IF NOT EXISTS default.mytable (&nbsp; `Country` string,&nbsp; `Independence` timestamp&nbsp;)ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'WITH SERDEPROPERTIES (&nbsp; 'serialization.format' = '1') LOCATION 's3://<mybucket>/tmp/'TBLPROPERTIES ('has_encrypted_data'='false');SELECT * FROM "default"."mytable" limit 10;|Country | Independence&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ||--------|-----------------------||Haiti&nbsp; &nbsp;|1804-01-01 00:00:00.000|
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python