【发布时间】:2015-12-02 06:31:21
【问题描述】:
所以我正在做一些应该很简单的事情,但显然它不在 Spark SQL 中。
如果我在 MySQL 中运行以下查询,查询会在几分之一秒内完成:
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;
但是,在 Spark (1.5.1) 下的 HiveContext 中运行相同的查询需要超过 13 秒。添加更多连接会使查询运行很长时间(超过 10 分钟)。我不确定我在这里做错了什么以及如何加快速度。
这些表是作为临时表加载到 Hive 上下文中的 MySQL 表。它在单个实例中运行,数据库位于远程计算机上。
- user 表有大约 480 万行。
- user_address 表有 350,000 行。
这些表有外键字段,但在 db.xml 中没有定义明确的 fk 关系。我正在使用 InnoDB。
Spark 中的执行计划:
计划:
扫描 JDBCRelation(jdbc:mysql://.user,[Lorg.apache.spark.Partition;@596f5dfc, {user=, 密码=, url=jdbc:mysql://, dbtable=user}) [address_id#0L,user_address_id#27L]
过滤器 (user_id#0L = 123) 扫描 JDBCRelation(jdbc:mysql://.user_address, [Lorg.apache.spark.Partition;@2ce558f3,{user=, 密码=, url=jdbc:mysql://, dbtable=user_address})[address_id#52L]
ConvertToUnsafe 转换为Unsafe
TungstenExchange hashpartitioning(address_id#52L) TungstenExchange hashpartitioning(user_address_id#27L) TungstenSort [address_id#52L ASC],假,0 TungstenSort [user_address_id#27L ASC],假,0
SortMergeJoin [user_address_id#27L], [address_id#52L]
== 物理计划 == TungstenProject [address_id#0L]
【问题讨论】:
-
请添加物理计划,以及针对数据库运行的有效 SQL 查询。进一步添加创建数据框和查询的代码。
-
你缓存了那些表吗?
标签: mysql apache-spark apache-spark-sql