【问题标题】:Lazy Evaluation in SparkSQLSparkSQL 中的惰性求值
【发布时间】:2016-10-11 08:32:10
【问题描述】:

Spark Programming Guide的这段代码中,

# The result of loading a parquet file is also a DataFrame.
parquetFile = sqlContext.read.parquet("people.parquet")

# Parquet files can also be registered as tables and then used in SQL statements.
parquetFile.registerTempTable("parquetFile");
teenagers = sqlContext.sql("SELECT name FROM parquetFile WHERE age >= 13 AND age <= 19")
teenagers.collect()

每行执行时,Java 堆中究竟发生了什么(Spark 内存是如何管理的)?

我特别有这些问题

  1. sqlContext.read.parquet 是懒惰的吗?是否会导致整个 parquet 文件加载到内存中?
  2. 执行收集操作时,对于要应用的 SQL 查询,

    一个。是整个parquet首先存储为RDD,然后处理或

    b. parquet 文件是否首先处理为仅选择 name 列,然后存储为 RDD,然后由 Spark 根据 age 条件进行过滤?

【问题讨论】:

    标签: apache-spark apache-spark-sql lazy-evaluation


    【解决方案1】:

    sqlContext.read.parquet 是懒惰的吗?

    是的,默认情况下,spark 中的所有转换都是惰性的。

    执行收集操作时,要应用的 SQL 查询

    一个。是整个parquet首先存储为RDD,然后处理或

    b. parquet文件是先处理成只选择name列,然后存储为RDD,然后Spark根据年龄条件过滤吗?

    在每个动作上,spark 都会生成新的 RDD。 Parquet 也是一种列格式,Parquet 阅读器使用下推过滤器来进一步减少磁盘 IO。 下推过滤器允许在数据被读入 Spark 之前做出早期的数据选择决策。 所以只有部分文件会被加载到内存中。

    【讨论】:

    • DataFrameReader 操作通常不会偷懒。它们需要元数据或数据访问,具体取决于来源。
    • 请为您的评论提供参考
    • 参考在DataFrame的代码源@atulgupta
    • @eliasah 就在这里。最好检查您使用的特定输入源的代码。如果您更喜欢经验方法,只需检查 SQLContext.read.jsonRDD[String] 的默认行为。详细信息取决于上下文和参数,但在更糟糕的情况下DataFrameReader.load 可能需要完整的数据扫描。但 Parquet 并非如此。
    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 2013-12-30
    • 2020-05-19
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多