【发布时间】:2020-09-25 21:27:32
【问题描述】:
我正在尝试将一百万行数据框与 30 行数据框进行内部连接,并且两个表都具有相同的连接键,spark 正在尝试执行排序合并连接,因此我的所有数据最终都在同一个执行程序和作业中例如,永远不会结束
DF1(million rows dataframe registered as TempView DF1)
+-------+-----------+
| id | price |
+-------+-----------+
| 1 | 30 |
| 1 | 10 |
| 1 | 12 |
| 1 | 15 |
+-------+-----------+
DF2(30 rows dataframe registered as TempView DF2)
+-------+-----------+
| id | Month |
+-------+-----------+
| 1 | Jan |
| 1 | Feb |
+-------+-----------+
我试过了
广播
spark.sql("Select /*+ BROADCAST(Df2) */ Df1.* from Df1 inner join Df2 on Df1.id=Df2.id").createTempView("temp")
重新分区
Df1.repartition(200)
查询执行计划
00 Project [.......................]
01 +- SortMergeJoin [.............................],Inner
02 :- Project [.............................]
03 : +-Filter is notnull[JoinKey]
04 : +- FileScan orc[..........................]
05 +-Project [.............................]
06 +-BroadcastHashJoin [..........................], LeftOuter, BuildRight
07 :- BroadCastHashJoin [......................],LeftSemi, BuildRight
分区数的输出
spark.table("temp").withColumn("partition_id",spark_partition_id).groupBy
("partition_id").count
+-------+---------------+
| 21 |300,00,000 |
+-------+---------------+
即使我重新分区/广播数据,spark 在加入时会将所有数据带到一个执行器,并且数据会在一个执行器处出现偏差。我还尝试将 spark.sql.join.preferSortMergeJoin 关闭为 false。但我仍然看到我的数据在一位执行人身上出现了偏差。谁能帮帮我?
【问题讨论】:
-
join之后你想做什么?我的意思是如何使用month列后加入? -
没有给我太多的数据。
-
@SomeshwarKale 这个下的输出在后续阶段进一步加入,目前工作正好卡在这个阶段
-
@sri,你能在大数据框上使用列 id 尝试
def repartitionByRange(numPartitions: Int, partitionExprs: Column*): Dataset[T] = {。另外,如果可能,请输入execution plan加入。想要检查火花在内部选择的连接类型。又一阙。你在使用 hive 元存储吗? -
这是一个不寻常的连接,不是吗?
标签: scala apache-spark apache-spark-sql