Athena 中用于 Glue 爬虫处理的空列用双引号括起来的 CSV 数据

Empty columns in Athena for Glue crawler processed CSV data enclosed in double quotes

我在 AWS S3 中有按月和年分区的每日 csv 文件。 csv 文件的所有数据都用双引号括起来,例如

"Time","ItemCode","Volume","Available"
"1/07/2019 12:00:00 AM","12148A","71","True"
"1/07/2019 12:00:00 AM","12149Z","23","False"

当我针对此数据创建标准爬虫时,架构解释了以下数据类型:

Time:      string
ItemCode:  string
Volume:    bigint
Available: boolean

Input format:            org.apache.hadoop.mapred.TextInputFormat
Output format:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Serde serialization lib: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Serde parameters:        field.delim ,

然而,当我通过“select * ...”在 Athena 中查询此数据时,我只能看到 Time 和 ItemCode 列(和分区列)中的数据。所有其他列都是空的。所以我得到了结果:

Time                      ItemCode   Volume   Available   Month   Year
"1/07/2019 12:00:00 AM"   "12148A"                        07      2019
"1/07/2019 12:00:00 AM"   "12149Z"                        07      2019

我不确定发生了什么。 Athena 里面好像只有字符串数据显示。

我还希望 'Time' 具有类型 'timestamp'。我不确定如何纠正这一切。我每个月都必须重新运行爬虫,因此手动编辑架构没有意义,因为重新运行将重置架构。

我是否必须创建一个 Glue 作业来去除 csv 文件中的所有双引号并将它们保存到新的 csv 文件,然后爬取这些新文件?

感谢您提供有关如何解决此问题或如何以最佳方式处理此问题的任何建议。

我不知道为什么 Glue 会这样做,但不幸的是,Glue Crawlers 常常不善于做正确的事情。问题是 LazySimpleSerDe,Glue 选择的 serde(数据 serializer/deserializer) 不支持引用字段

您可能会通过手动将 table 更改为使用 OpenCSVSerDe 来使其工作 – 但我猜 Glue 会在下次运行爬虫时将其翻转回来。

我的建议是停止使用 Glue Crawlers。最近推出了一项名为 Partition Projection 的功能,我认为它可以更方便地解决您的问题。如果您 post 您的分区之一的 S3 URI,我可以告诉您如何设置它。


您的第二个问题是您希望 Time 列成为 TIMESTAMP。不幸的是,这只有在数据采用受支持的 date/time 格式时才有可能,不幸的是你的格式不是。有关详细信息,请参阅 Supported Data Types

您必须在查询中使用例如 date_parse 来解析字符串。为避免在所有查询中都必须执行此操作,您可以创建一个视图来解析日期并供查询使用。