gpt4 book ai didi

apache-spark - 如何在 spark 中启用分区修剪

转载 作者:行者123 更新时间:2023-12-04 04:24:39 24 4
gpt4 key购买 nike

我正在阅读 Parquet 数据,我看到它列出了驱动程序端的所有目录

Listing s3://xxxx/defloc/warehouse/products_parquet_151/month=2016-01 on driver
Listing s3://xxxx/defloc/warehouse/products_parquet_151/month=2014-12 on driver

我在 where 子句中指定了 month=2014-12 。
我曾尝试使用 spark sql 和数据框 API,看起来两者都没有修剪分区。

使用数据框 API
df.filter("month='2014-12'").show()

使用 Spark SQL
sqlContext.sql("select name, price from products_parquet_151 where month = '2014-12'")

我已经在 1.5.1、1.6.1 和 2.0.0 版本上尝试过上述方法

最佳答案

Spark 需要先在驱动中加载分区元数据,才能知道分区是否存在。 Spark 会查询目录以查找现有分区,以了解在扫描数据期间是否可以修剪该分区。

我已经在 Spark 2.0 上对此进行了测试,您可以在日志消息中看到。

16/10/14 17:23:37 TRACE ListingFileCatalog: Listing s3a://mybucket/reddit_year on driver
16/10/14 17:23:37 TRACE ListingFileCatalog: Listing s3a://mybucket/reddit_year/year=2007 on driver

这并不意味着我们要扫描每个分区中的文件,而是 Spark 会存储分区的位置以供将来在表上查询。

您可以看到它实际传入分区过滤器以修剪数据的日志:
16/10/14 17:23:48 TRACE ListingFileCatalog: Partition spec: PartitionSpec(StructType(StructField(year,IntegerType,true)),ArrayBuffer(PartitionDirectory([2012],s3a://mybucket/reddit_year/year=2012), PartitionDirectory([2010],s3a://mybucket/reddit_year/year=2010), ...PartitionDirectory([2015],s3a://mybucket/reddit_year/year=2015), PartitionDirectory([2011],s3a://mybucket/reddit_year/year=2011)))
16/10/14 17:23:48 INFO ListingFileCatalog: Selected 1 partitions out of 9, pruned 88.88888888888889% partitions.

如果您运行 explain(True),您可以在逻辑计划中看到这一点。关于您的查询: spark.sql("select created_utc, score, name from reddit where year = '2014'").explain(True)
这将向您显示计划,您可以看到它正在计划底部进行过滤:
+- *BatchedScan parquet [created_utc#58,name#65,score#69L,year#74] Format: ParquetFormat, InputPaths: s3a://mybucket/reddit_year, PartitionFilters: [isnotnull(year#74), (cast(year#74 as double) = 2014.0)], PushedFilters: [], ReadSchema: struct<created_utc:string,name:string,score:bigint>

关于apache-spark - 如何在 spark 中启用分区修剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39898067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com