ColumnarToRow 如何在 Spark 中高效操作

kar*_*r09 8 mapreduce query-optimization apache-spark apache-spark-sql pyspark

在我的理解中,柱状格式更适合 Map Reduce 任务。即使对于某些列的选择,柱状也能很好地工作,因为我们不必将其他列加载到内存中。

但是在 Spark 3.0 中,我看到这个ColumnarToRow操作被应用于查询计划中,根据我从文档中可以理解的内容将数据转换为行格式。

它比柱状表示的效率如何,支配该规则应用的见解是什么?

对于以下代码,我附上了查询计划。

import pandas as pd

df = pd.DataFrame({
    'a': [i for i in range(2000)],
    'b': [i for i in reversed(range(2000))],
})

df = spark.createDataFrame(df)

df.cache()
df.select('a').filter('a > 500').show()

Run Code Online (Sandbox Code Playgroud)

查询计划

Den*_*din 0

我只简单地读过这一点,但似乎这个一般逻辑是成立的:

柱状格式可帮助您最有效地选择某些列。行格式可帮助您最有效地选择某些行。

因此,当您想要多次选择某些行“例如每个国家、每天……”时,采用基于行的格式并在过滤器列上设置索引通常是有意义的。

这也是一个参考,其中显示要定义索引:https://spark.apache.org/docs/3.0.0/sql-ref-syntax-qry-select-hints.html