【发布时间】:2018-07-24 02:25:45
【问题描述】:
我正在使用 spark sql 连接多个表。其中一张表非常大,其他表很小(10-20 条记录)。真的我想用其他包含键值对的表来替换最大表中的值。
即 大表:
| Col 1 | Col 2 | Col 3 | Col 4 | ....
--------------------------------------
| A1 | B1 | C1 | D1 | ....
| A2 | B1 | C2 | D2 | ....
| A1 | B1 | C3 | D2 | ....
| A2 | B2 | C3 | D1 | ....
| A1 | B2 | C2 | D1 | ....
.
.
.
.
.
表2:
| Col 1 | Col 2
----------------
| A1 | 1a
| A2 | 2a
表3:
| Col 1 | Col 2
----------------
| B1 | 1b
| B2 | 2b
表3:
| Col 1 | Col 2
----------------
| C1 | 1c
| C2 | 2c
| C3 | 3c
表4:
| Col 1 | Col 2
----------------
| D1 | 1d
| D2 | 2d
预期的表是
| Col 1 | Col 2 | Col 3 | Col 4 | ....
--------------------------------------
| 1a | 1b | 1c | 1d | ....
| 2a | 1b | 2c | 2d | ....
| 1a | 1b | 3c | 2d | ....
| 2a | 2b | 3c | 1d | ....
| 1a | 2b | 2c | 1d | ....
.
.
.
.
.
我的问题是; 这是加入表格的最佳方式。 (想想有100个或更多的小桌子) 1)收集小数据帧,将其转换为地图,广播地图和转换大数据帧只需一步
bigdf.transform(ds.map(row => (small1.get(row.col1),.....)
2) 广播表格并使用 select 方法进行连接。
spark.sql("
select *
from bigtable
left join small1 using(id1)
left join small2 using(id2)")
3) 广播表和连接多个连接
bigtable.join(broadcast(small1), bigtable('col1') ==small1('col1')).join...
提前致谢
【问题讨论】:
标签: scala apache-spark apache-spark-sql