首页 > 解决方案 > 如果选择条件基于 RDD 转换,火花是否会将整个表加载到内存中?

问题描述

DataSet<Row> a = spark.read().format("com.memsql.spark.connector").option("query", "select * from a");
a = a.filter((row)-> row.x = row.y)
Sring xstring = "...select all values of x from a and make comma separated string"
DataSet<Row> b = spark.read().format("com.memsql.spark.connector").option("query", "select * from b where x in " + xstring);
b.show()

在这种情况下,spark 会将整个 b 表加载到内存中,然后过滤掉 xstring 行,或者它实际上创建该 xstring,然后在我们调用 show 时将表 b 的子集加载到内存中

标签: apache-sparkapache-spark-sqldirected-acyclic-graphs

解决方案


当使用option("query", "select * from .......")整个结果(不是表)查询 memsql 时,将从 memsql 读取到执行程序中。MemSQL Spark 连接器 2.0 支持 SQL 需要具有过滤器和连接条件的列和过滤器下推,而不是在数据帧上应用过滤器和连接。在您的示例中,将使用谓词下推。在您的示例中-将读取整个表“a”,因为没有过滤条件,将构建 xstring,然后仅读取与x in (...)条件匹配的表“b”部分。

这是解释这一点的 memsql 文档。


推荐阅读