Spark 2.2最佳读取分区镶木地板文件

时间:2017-09-30 15:33:27

标签: apache-spark hive apache-spark-sql 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
...

使用Spark 2.x读取此数据的最佳方法是什么,这会阻止Spark扫描整个数据集?我有几个选择:

  1. 只需使用过滤器:

    filter("(country = "USA" AND asOfDate >= "2016-01-01" AND asOfDate <= "2016-03-31") OR (....)")
    
  2. 手动构建目录并将每个子目录传递给镶木地板读取:

    spark.read.parquet("/sales/country=USA/asOfDate=2016-01-01", ""/sales/country=USA/asOfDate=2016-01-02",...)
    
  3. 选项2非常繁琐,但我不确定选项1是否会导致Spark扫描所有目录中的所有文件。

    更新:这不是重复,因为另一个问题是关于修剪,而这个是关于如何通过Spark API最好地读取分区的镶木地板文件。

2 个答案:

答案 0 :(得分:1)

绝对是1.

您可以在数据集的查询中使用.explain(extended = true)自行查看(或  直接在Spark UI SQL页面内部查看您的读取内容。您想要查找 PushDown Predicate 。下推意味着在存储时进行评估,因此这将读取所需的数据。

更多详情:https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-Optimizer-PushDownPredicate.html

答案 1 :(得分:0)

您可以将数据存储在按日期和国家/地区划分的配置单元表中。

文件将存储在单独的文件夹中,但是hive Metastore会为您管理