分区未在Amazon Athena中返回任何结果

时间:2017-11-08 23:28:49

标签: mysql csv amazon-s3 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之后:手动加载分区(我的订单日期格式为mm / dd / yy hrs min)

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

它说分区已经成功创建但是当我查询这个时我没有得到任何结果。我是否以错误的方式创建分区?为什么它没有返回结果?感谢任何帮助。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

一个有趣的观点,S3中的文件夹是not actually folders,我倾向于将它们视为标签。至于约翰的观点,你需要对数据进行切片和切块,然后将其标记为:

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/)的所有文件视为位于同一分区中。所以,对于雅典娜来说,这些是等价的:

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

有时,像这样分割数据可能非常有用。