在Spark编程指南的这段代码中,
# 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内存)中究竟发生了什么?
我有这些问题
- sqlContext.read.parquet 懒惰吗?它是否会导致整个镶木地板文件加载到内存中?
执行收集操作时,对于要应用的 SQL 查询,
a. 整个镶木地板是否首先存储为 RDD,然后进行处理或
b. 是否先处理拼花地板文件以仅选择
name
列,然后存储为 RDD,然后由 Spark 根据age
条件进行过滤?
sqlContext.read.parquet 懒惰吗?
是的,默认情况下,Spark 中的所有转换都是懒惰的。
执行收集操作时,要应用 SQL 查询
a. 整个镶木地板是否首先存储为 RDD,然后进行处理或
b. 是否先处理镶木地板文件以仅选择名称列,然后存储为 RDD,然后由 Spark 根据年龄条件进行过滤?
在每个动作上,火花都会产生新的RDD。此外,Parquet 是一种列式格式,Parquet 读卡器使用下推过滤器来进一步减少磁盘 IO。 下推过滤器允许在数据读入 Spark 之前做出早期数据选择决策。因此,只有部分文件将被加载到内存中。