我在亚马逊雅典娜创造了一张桌子。我将我的数据作为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
执行此操作后,我仍然无法使用日期范围来分区和查询数据。
答案 0 :(得分: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
答案 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
有时,像这样分割数据可能非常有用。