spark 是否将整个 hive table 带入内存

Does spark bring entire hive table to memory

我正在学习 Apache Spark 的工作原理并且有一些基本的疑问。假设我有一个连接到 Hive table 的 Spark 应用程序 运行ning。 我的蜂巢table如下:

Name Age Marks
A 50 100
B 50 100
C 75 200

当我运行下面的代码片段时,在执行过程中哪些行和列会被加载到内存中? rows/columns的过滤会不会在整个table加载到内存后进行?

1. spark_session.sql("SELECT name, age from table").collect()
2. spark_session.sql("SELECT * from table WHERE age=50").collect()
3. spark_session.sql("SELECT * from table").select("name", "age").collect()
4. spark_session.sql("SELECT * from table").filter(df.age = 50).collect()

如果数据源支持谓词下推,则 spark 在过滤数据时不会将整个数据加载到内存。

让我们用 parquet 作为文件格式检查 hive table 的 spark 计划:

>>> df = spark.createDataFrame([('A', 25, 100),('B', 30, 100)], ['name', 'age', 'marks'])
>>> df.write.saveAsTable('table')
>>> spark.sql('select * from table where age=25').explain(True)

== Physical Plan ==
*(1) Filter (isnotnull(age#1389L) AND (age#1389L = 25))
+- *(1) ColumnarToRow
   +- FileScan parquet default.table[name#1388,age#1389L,marks#1390L] Batched: true, DataFilters: [isnotnull(age#1389L), (age#1389L = 25)], 
    Format: Parquet, Location: InMemoryFileIndex[file:/Users/mohan/spark-warehouse/table], 
    PartitionFilters: [], PushedFilters: [IsNotNull(age), EqualTo(age,25)], ReadSchema: struct<name:string,age:bigint,marks:bigint>

您可以通过查看 PushedFilters: [IsNotNull(age), EqualTo(age,25)]

来验证过滤器是否被推送到底层存储