【发布时间】:2018-11-30 17:13:24
【问题描述】:
我有一个 s3 存储桶,其中包含 Athena 底层的分区数据。使用 Athena,我看到我的表中有 1040 亿行。这是大约2年的数据。
我们就叫它big_table吧。
分区是按天,按小时,所以每天 07-12-2018-00,01,02 ... 24。 Athena 字段是partition_datetime。
在我的用例中,我只需要 1 个月的数据,大约 4 亿行。
所以问题出现了 - 直接从以下位置加载: 1. 文件
spark.load(['s3://my_bucket/my_schema/my_table_directory/07-01-2018-00/file.snappy.parquet',\
's3://my_bucket/my_schema/my_table_directory/07-01-2018-01/file.snappy.parquet' ],\
.
.
.
's3://my_bucket/my_schema/my_table_directory/07-31-2018-23/file.snappy.parquet'])
或 2. 通过 pyspark 使用 SQL
df = spark.read.parquet('s3://my_bucket/my_schema/my_table_directory')
df = df.registerTempTable('tmp')
df = spark.sql("select * from my_schema.my_table_directory where partition_datetime >= '07-01-2018-00' and partition_datetime < '08-01-2018-00'")
我认为 #1 更有效,因为我们只引入了相关时期的数据。
2 对我来说似乎效率低下,因为必须遍历整个 1040 亿行(或更准确地说是 partition_datetime 字段)才能满足 SELECT。我被告知这确实不是问题,因为执行延迟,并且从来没有一个包含所有 1040 亿行的 df。我仍然说在某些时候必须由 SELECT 访问每个分区,因此选项 1 更有效。
我对这方面的其他意见感兴趣。请插话
【问题讨论】:
标签: amazon-s3 pyspark amazon-athena