【问题标题】:Spark 2.2 optimal read partitioned parquet file [duplicate]Spark 2.2 最佳读取分区拼花文件 [重复]
【发布时间】:2023-03-18 19:37:01
【问题描述】:

我有按国家和日期划分的镶木地板数据文件。

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. 手动构建目录并将每个子目录传递给parquet读取:

    spark.read.parquet("/sales/country=USA/asOfDate=2016-01-01", ""/sales/country=USA/asOfDate=2016-01-02",...)
    

选项2非常繁琐,但我不确定选项1是否会导致Spark扫描所有目录中的所有文件。

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

【问题讨论】:

  • 你能解决这个问题吗?我真的很想知道您是如何阅读文件的?我正在尝试spark.read.parquet(basepath).filter($"exp_start_date.geq("2018-02-08")),但它对我不起作用。 :( "exp_start_date" 是我的分区名称
  • @jimseeve 顺便解决了这个问题吗?
  • @jimseeve,选项 1 对我有用。我可以在信息日志中看到 Spark 如何只从正确的目录中选择文件。

标签: apache-spark hive apache-spark-sql parquet


【解决方案1】:

绝对是 1。

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

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

【讨论】:

    【解决方案2】:

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

    文件将存储在单独的文件夹中,但 hive 元存储将为您管理它

    【讨论】:

    • 是否可以在没有 Hive 的情况下执行此操作,而只是通过 Spark SQL?
    猜你喜欢
    • 2021-07-23
    • 2016-02-12
    • 2022-07-31
    • 2017-04-29
    • 2017-09-29
    • 2020-11-01
    • 2019-10-09
    • 2019-10-28
    • 2019-12-11
    相关资源
    最近更新 更多