pyspark 为什么AWS Athena在查询大型数据集中字符串列的MAX时完全优于AWS Glue?

qrjkbowd  于 2023-05-06  发布在  Spark
关注(0)|答案(1)|浏览(124)

我有一个来自物联网输入的大型数据集,大约有50亿行。数据集以parquet格式存储在S3的单个目录中。对应于一天的每个行子集存储在不同的parquet中,所有这些都在同一个目录中。数据集本质上看起来像这样:
| 列1|col2|col3|datestring(类型:对象)|
| --------------|--------------|--------------|--------------|
| 价值1|价值观2|价值观3|2023年4月24日|
| ......这是什么?|......这是什么?|......这是什么?|......这是什么?|
然后,该数据集每天都会爬到Glue目录中。请注意,我知道有一百万种方法可以改善这种存储方法;然而,这不是我问题。
因此:在Glue Pipeline的上下文中,需要从整个数据集中的datestring列查询最大日期。我的惊讶来自于Glue执行上下文中这两个方法之间的差异:

  • 使用createDynamicFrame阅读spark Dataframe ,无论是fromOptions还是fromCatalog。使用pyspark.sql.functions.max查询datestring列的最大值(在这种情况下,由于字典顺序是模拟的,因此它将成为最大日期)。
  • 使用Athena从目录查询SQL语句,如“SELECT MAX(datestring)FROM table”。

第一种方法需要10个标准工人20分钟。第二种方法需要2秒。这怎么可能?这背后的原因是什么?我对此很好奇。
我首先猜测这是因为Athena利用了爬虫存储的元数据。但是,为什么在使用createDynamicFrame.fromCatalog时也需要20分钟?

pgky5nke

pgky5nke1#

create_dynamic_frame.from_catalog()方法将比使用Athena查询慢。这是因为Glue作业需要将整个数据集加载到内存中(如果它适合,如果不适合,其他对象将在队列中等待)。这取决于在应用max()函数之前的资源分配(例如10个DPU)。相比之下,Athena query可以直接在S3中的数据集上执行max()函数,而无需将其加载到内存中。
我只知道这些,但可能还有其他原因。

相关问题