【问题标题】:Does spark bring entire hive table to memory火花是否将整个蜂巢表带入记忆
【发布时间】:2021-11-10 16:12:49
【问题描述】:

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

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

当我运行以下代码sn-ps时,在执行过程中哪些行和列会被加载到内存中?是否会在整个表加载到内存后进行行/列的过滤?

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()

【问题讨论】:

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


    【解决方案1】:

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

    让我们检查一下以 parquet 为文件格式的 hive 表的 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)]

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

    【讨论】:

    • 谢谢@mohana。对 where/filter 子句的疑问清除了这一点。列呢? 1和3?
    • 只会加载所需的列。你可以检查我检查的物理计划。
    • 好的。谢谢@mohana
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2019-08-15
    • 1970-01-01
    • 2018-08-10
    相关资源
    最近更新 更多