【问题标题】:Partitions not returning any results in Amazon Athena分区未在 Amazon Athena 中返回任何结果
【发布时间】:2017-11-08 23:28:49
【问题描述】:

我在 amazon athena 中创建了一个表。我的数据为 CSV 文件(一个包含 2010-2015 年数据的大文件)。它没有在 s3 中分区。我正在尝试在 athena 中创建分区,但分区没有得到任何结果。

第 1 步:在 athena 中创建表

CREATE EXTERNAL TABLE IF NOT EXISTS DATABASE.table1 (
NULL string,
OrderID string,
CustomerID string,
EmailAddress string
)
PARTITIONED BY (OrderDate STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
 'serialization.format' = ',',
  'quoteChar' = '"',
  'field.delim' = ','
) LOCATION 's3://XYZ/Orders/'
TBLPROPERTIES ('has_encrypted_data'='false');

在此步骤 2 之后:手动加载分区(我的 orderdate 格式是 mm/dd/yy hrs min)

ALTER TABLE table1 ADD PARTITION (orderdate='01/01/2010 00:00') location 's3://xyz/Orders/'

它说分区已成功创建,但是当我对此进行查询时,我没有得到任何结果。那么我是否以错误的方式创建分区?为什么它没有返回结果?任何帮助表示赞赏。

在尝试了下面的 cmets 后,当我使用订单日期查询数据时,我仍然无法检索任何结果。我再次将文件上传到 athena(两个单独的文件,为期两年),其中文件路径如下所示

s3://xyz/Orders/year/orders+2010.csv
 s3://xyz/Orders/year/orders+2014.csv

执行此操作后,我仍然无法使用日期范围进行分区和查询数据。

【问题讨论】:

    标签: mysql csv amazon-s3 amazon-athena


    【解决方案1】:

    分区是子目录。正确定义后,Athena 可以跳过不包含相关数据的子目录。

    例如,如果一个表按日期 (YYYY-MM-DD) 进行分区,则会有一个名为 date=2017-11-08 的目录仅包含当天的数据。

    鉴于您的所有数据都包含在单个 CSV 中,您不能使用分区。如果您在适当的目录结构中将文件分成单独的日常文件,Athena 会为您运行得更快,并且操作起来更便宜。

    Athena 无法为您生成分区 - 您必须向 Athena 提供已分区的数据。 ADD PARTITION 和 MSCK REPAIR TABLE 命令只是扫描并使用现有分区。

    请参阅 AWS 大数据博客:Analyzing Data in S3 using Amazon Athena

    【讨论】:

    • ..Thanku 解决了这个问题,现在我完全可以理解为什么我无法得到任何结果。我还有一个疑问,我的日期格式是 mm-dd-yyyy hrs-min,但 athena 采用另一种日期格式。如果我将所有内容重新加载到 s3,每年都有不同的日期范围,数据会有什么不同吗?
    • 您问题中的表定义似乎将日期字段视为字符串,因此您使用什么格式并不重要,只要您的查询与存储格式匹配即可。但是,如果您正在处理日期(例如选择最近 5 天的数据),最好将其定义为实际日期字段。
    • ...如果我使用除字符串以外的任何其他数据类型,则使用 opencsvserde 会给我带来解析错误。所以我不知道有什么解决办法。
    【解决方案2】:

    有趣的一点是,S3 中的文件夹是not actually folders,我倾向于将它们视为标签。就 John 而言,您需要对数据进行切片和切块,然后将其标记为:

    s3://mybucket/mydata/date_partition=2017-01-01/customer_partition=12345/somdedata.csv
    

    某些应用程序(例如 Web UI 和 S3 浏览器)将 S3“文件夹”显示为目录,但是当您开始进行 API 调用时,您会发现它们的行为并非如此。

    这种结构的优点之一是 Athena 会将所有带有特定“标签”(例如 date_partition=2017-01-01/customer_partition=12345/)的文件视为位于同一分区中。所以,对于 Athena,这些是等价的:

    s3://mystuff/data/date_partition=2017-01-01/customer_partition=12345/somehugefile.csv
    s3://mystuff/data/date_partition=2017-01-01/customer_partition=12345/asmallerfile.csv
    s3://mystuff/data/date_partition=2017-01-01/customer_partition=12345/anothersmallerfile.csv
    

    有时,像这样拆分数据非常有用。

    【讨论】:

    • @John Rotenstein 我仍然无法检索任何信息。请你帮帮我
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多