gpt4 book ai didi

scala - 在 Spark SQL 中将多个小表与一个大表连接起来的最佳方法

转载 作者:行者123 更新时间:2023-12-05 05:17:47 26 4
gpt4 key购买 nike

我正在使用 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张或更多的小 table ) 1) 收集小数据帧,将其转换为 map ,广播 map ,一步到位转换大数据帧

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...

提前致谢

最佳答案

你可能会这样做:

  1. 广播所有小表(通过设置spark.sql.autoBroadcastJoinThreshold略优于小表行数自动完成)
  2. 运行一个连接大表的sql查询

    val df = spark.sql("
    select *
    from bigtable
    left join small1 using(id1)
    left join small2 using(id2)")

编辑:在 sql 和 spark “dataframe” 语法之间进行选择:sql 语法比 spark 语法更易读,也更简洁(从数据库用户的角度来看)。从开发人员的角度来看,数据框语法可能更具可读性。

使用“数据集”语法的主要优点是编译器将能够跟踪一些错误。使用任何字符串语法,如 sql 或列名称 (col("mycol")) 将在运行时被发现。

关于scala - 在 Spark SQL 中将多个小表与一个大表连接起来的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48771517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com