【问题标题】:How to More Efficiently Load Parquet Files in Spark (pySpark v1.2.0)如何在 Spark 中更高效地加载 Parquet 文件(pySpark v1.2.0)
【发布时间】:2015-06-30 11:25:02
【问题描述】:

我正在加载高维拼花文件,但只需要几列。我当前的代码如下所示:

dat = sqc.parquetFile(path) \
          .filter(lambda r: len(r.a)>0) \
          .map(lambda r: (r.a, r.b, r.c))

我对正在发生的事情的心理模型是加载所有数据,然后丢弃我不想要的列。我显然更喜欢它甚至不阅读那些专栏,并且根据我对镶木地板的理解,这似乎是可能的。

所以有两个问题:

  1. 我的心智模型错了吗?还是 spark 编译器足够聪明,只能读取上面示例中的 a、b 和 c 列?
  2. 如何强制sqc.parquetFile() 更有效地读取数据?

【问题讨论】:

  • 我认为如果您map 之前 filter,您获得只读所需列的机会会更高

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


【解决方案1】:

您应该使用 Spark DataFrame API:https://spark.apache.org/docs/1.3.0/sql-programming-guide.html#dataframe-operations

有点像

dat.select("a", "b", "c").filter(lambda r: len(r.a)>0)

或者你可以使用 Spark SQL:

dat.regiserTempTable("dat")
sqc.sql("select a, b, c from dat where length(a) > 0")

【讨论】:

    【解决方案2】:

    Spark 总是以一种懒惰的方式做事,使用原生的 scala 功能。 scala 代码已经编译,它使运行时智能,我的意思是懒惰的决策。使用镶木地板,它应该只读取代码引用的必要数据。当然,这取决于特定 parquet 文件的结构。关键是它将利用列格式。我对 Python 了解不多,但它应该能够做同样的事情。也许检查 pyspark Row 类是否使用了某种惰性魔法。一种快速验证方法是进行受控实验,编写另一个引用更多字段但不输出它们的 rdd 操作。然后你可以比较两个操作之间的挂钟时间差。根据底层 parquet 文件的一些相关细节,即使执行延迟加载,您也可能看不到差异。

    【讨论】:

      【解决方案3】:

      是的,它只会从磁盘中选择字段。

      " 打开所有数据文件,但只读取每个文件中包含该列值的部分。列值连续存储,最大限度地减少处理单个列中的值所需的 I/O。"

      本文档适用于 impala,我认为 spark 的读取逻辑也相同 http://www.cloudera.com/documentation/archive/impala/2-x/2-1-x/topics/impala_parquet.html#parquet_data_files_unique_1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 2020-03-27
        • 2016-12-15
        • 2020-02-29
        • 2019-12-23
        • 2015-12-19
        • 2016-10-03
        相关资源
        最近更新 更多