这个问题在这里已经有答案了:
spark是否支持使用Parquet文件进行分区修剪(3个答案)
三年前关门了。
我有Parquet数据文件分区的国家和日期。
sales
country=USA
asOfDate=2016-01-01
asofDate=2016-01-02
country=FR
....
我需要处理的数据,用户可以选择哪些国家的处理和每个国家的截止日期。
Country, Start Date, End Date
USA, 2016-01-01, 2016-03-31
FR, 2016-02-01, 2016-08-31
...
使用spark2.x读取这些数据的最佳方式是什么?这将阻止spark扫描整个数据集?我有几个选择:
只需使用过滤器:
filter("(country = "USA" AND asOfDate >= "2016-01-01" AND asOfDate <= "2016-03-31") OR (....)")
手动构造目录并将每个子目录传递给parquet read:
spark.read.parquet("/sales/country=USA/asOfDate=2016-01-01", ""/sales/country=USA/asOfDate=2016-01-02",...)
选项2非常乏味,但我不确定选项1是否会导致spark扫描所有目录中的所有文件。
更新:这不是重复,因为另一个问题是关于修剪,而这个问题是关于如何通过sparkapi最好地读取分区的parquet文件。
2条答案
按热度按时间tnkciper1#
肯定是1。
你可以通过使用
.explain(extended = true)
在数据集的查询中(或直接在spark ui sql页中),查看读取的结果。你想找一个下推 predicate 。下推意味着在存储时求值,因此这将读取所需的数据。更多详细信息:https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-optimizer-pushdownpredicate.html
huwehgph2#
您可以将数据存储在按日期和国家划分的配置单元表中。
这些文件将存储在不同的文件夹中,但配置单元元存储将为您管理它