当前位置: 首页 > 知识库问答 >
问题:

Spark SQL/Hive查询永远使用Join

卫嘉泽
2023-03-14

所以我在做一些应该很简单的事情,但显然不是在Spark SQL中。

SELECT ua.address_id
FROM user u
inner join user_address ua on ua.address_id = u.user_address_id
WHERE u.user_id = 123;
    null

表有外键字段,但数据库中没有定义显式fk关系。我在用Innodb。

Spark中的执行计划:

计划:

==物理计划==TungstenProject[Address_ID#0L]

共有1个答案

卫宁
2023-03-14

首先,您执行的查询类型效率极低。就目前而言(Spark 1.5.0*),要执行这样的联接,每次执行查询时都必须对两个表进行洗牌/哈希分区。在users表中,user_id=123谓词很可能是下推的,但仍然需要对user_address进行完全洗牌,这应该不成问题。

此外,如果表只注册而不缓存,那么每次执行该查询都会从MySQL中获取整个user_address表到Spark。

我不确定我在这里做错了什么,我如何才能加快速度。

如果单个表/数据帧小得多,可以尝试广播。

import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions.broadcast

val user: DataFrame = ???
val user_address: DataFrame = ???

val userFiltered = user.where(???)

user_addresses.join(
  broadcast(userFiltered), $"address_id" === $"user_address_id")

*这应该在Spark 1.6.0的SPARK-11410中有所改变,它应该启用持久的表分区。

 类似资料:
  • 问题内容: 我有一个MySQL UPDATE查询,需要很长时间才能完成。我是否错过了一种更简单的方法来获得相同的结果? 包含的所有可能值,每个值仅包含一条记录。 包含的一些值,但是有多个记录有一些值。 我需要更新记录中显示的相应值的出现次数中。上面的查询完成了该工作,但是当table1包含500条记录和30,000条记录时,大约需要3分钟。我有更大的表要处理,所以这太长了:) 提前致谢。 问题答案

  • 问题内容: 我有一些关于永久使用Node.js的问题,可能很琐碎。根据我的阅读,永远可以通过编程使用,并且它维护了一个列表,其中包含所有永远使用的脚本。该进程终止后,它会自动产生一个新的进程,直到停止为止。 但是,我的问题是,如何永远做到这一点?是否还会添加这些脚本以在启动时启动? 问题答案: 您可以像这样永久性地使用程序: 在node.js脚本中使用Forever实例: 您应该花一点时间阅读一下

  • 有什么让我怀念的吗?如果我必须手动关闭连接,是不是至少可以从Javers那里收到一个不再需要连接的通知?

  • 这些查询是:select*from t1 where col1='123'[t1由col1 bucketted]select*from t1 where col2='123'[col2不是bucketting列]我的问题是 > 如何确定在查询执行期间正在进行全表扫描还是正在进行相关的部分表扫描? 我能从DAG或物理计划中得到任何信息吗?我两个都看过,但我看不出有什么不同,就像我在物理计划中看到的那

  • 我试图在hive中执行偏移量查询,试图排除特定记录,但总是得到以下错误: 环境:

  • 一、数据准备 为了演示查询操作,这里需要预先创建三张表,并加载测试数据。 数据文件 emp.txt 和 dept.txt 可以从本仓库的resources 目录下载。 1.1 员工表 -- 建表语句 CREATE TABLE emp( empno INT, -- 员工表编号 ename STRING, -- 员工姓名 job STRING, --