我知道运行已保存的 Athena 查询会根据查询名称和查询运行日期将结果存储在 Amazon S3 位置,如下所示:
QueryLocation}/{QueryName|Saved}/{yyyy}/{mm}/{dd}/{QueryID}/
是否可以覆盖它并将其存储在类似于
查询位置}/查询名称
每当运行查询时覆盖结果文件?
当然可以通过在 S3 上重命名(移动 + 删除)文件来完成,但想知道是否有更直接的方法。
我需要将一个缓慢变化的AWS DynamoDb定期转储到S3上,以便在Athena上进行查询。需要确保Athena可用的数据与DynamoDb上可用的数据相差不远(最大延迟为1小时)
我知道以下两种方法:
使用EMR(来自数据管道)导出整个DynamoDb
这种方法的优势在于,使用单个EMR脚本(每小时运行),可以在Athena上直接搜索的压缩Parquet文件可以转储到S3上。但是,此方法的一大缺点是,尽管一个小时内仅更改少量记录,但需要进行整个转储,这要求DynamoDb中的读取容量显着更高,而EMR资源也更高。
使用DynamoDB流可反映S3上DynamoDb中的任何更改。
这具有不需要在DynamoDb上处理不变数据的优点,从而减少了比正常操作所需的读取容量高得多的读取容量的需求。但是,将需要一个后续脚本(可能是另一个EMR作业)来整合DynamoDb流生成的每个记录文件,否则Athena的性能会因为文件数量过多而受到严重影响。
还有其他方法可以做得更好吗?
我将 parquet 数据存储在 S3 上,并以 Hive 理解的格式进行分区
s3://<base_path>/year=2019/month=11/day=08/files.pq
Run Code Online (Sandbox Code Playgroud)
表模式还指定year, month, day
为分区字段。
是否可以将查询(特别LIKE, IN, BETWEEN
是日期查询)与这种数据组织进行比较?AWS Athena 最佳实践博客似乎建议其可能 ( SELECT count(*) FROM lineitem WHERE l_shipdate >= '1996-09-01' AND l_shipdate < '1996-10-01'
),但我无法弄清楚如何l_shipdate
在表创建期间或查询期间指定复合字段(在查询中)。
我必须分两个步骤将JSON中的分析数据转换为实木复合地板。对于大量现有数据,我正在编写一个PySpark作业,并且正在做
df.repartition(*partitionby).write.partitionBy(partitionby).
mode("append").parquet(output,compression=codec)
Run Code Online (Sandbox Code Playgroud)
但是,对于增量数据,我计划使用AWS Lambda。PySpark可能对它来说是一个过大的杀伤力,因此我打算为此使用PyArrow(我知道它不必要地涉及到Pandas,但我找不到更好的替代方法)。因此,基本上:
import pyarrow.parquet as pq
pq.write_table(table, outputPath, compression='snappy',
use_deprecated_int96_timestamps=True)
Run Code Online (Sandbox Code Playgroud)
我想知道由PySpark和PyArrow编写的Parquet文件是否兼容(相对于Athena)?