apache-spark - 如果选择条件基于 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 的子集加载到内存中
解决方案
当使用option("query", "select * from .......")
整个结果(不是表)查询 memsql 时,将从 memsql 读取到执行程序中。MemSQL Spark 连接器 2.0 支持 SQL 需要具有过滤器和连接条件的列和过滤器下推,而不是在数据帧上应用过滤器和连接。在您的示例中,将使用谓词下推。在您的示例中-将读取整个表“a”,因为没有过滤条件,将构建 xstring,然后仅读取与x in (...)
条件匹配的表“b”部分。
这是解释这一点的 memsql 文档。
推荐阅读
- mongodb - 看不到 mongo 集合
- spring - 如何使用 @RestController 和 HttpEntity 映射请求包含 Rest 服务中的文件和数据
作为输入参数 - c++ - 如何创建类似于 QVariant 的 Variant 类
- vba - VBA 评估功能不起作用。错误 2015
- vagrant - vagrant visualbox ubuntu16.04 上的只读文件系统
- python - 检查numpy数组是否在范围内
- java - 在 IntelliJ IDEA 中将注解注解为入口点而不修改配置文件
- php - Wordpress 管理员可以登录,但 wp-admin 和其他管理页面无法打开
- python - 如何获取从另一个模块调用的函数的结果对象?
- javascript - 将字符串与数组进行比较的快速方法