加入大数据帧和小数据帧时广播数据帧和过滤器

时间:2021-04-19 13:13:30

标签: scala apache-spark apache-spark-sql

我有一个包含 user_iduser_address 列和多个用户相关列(还有 10-12 个)的大数据框和一个包含 user_id 和 {{ 列的小 (< 2MB) 数据框1}}。每个用户可以有很多电话号码/电子邮件地址。

我正在尝试广播较小的数据帧并将其数据传递给 UDF。但是,我无法获得每个执行程序中存在的所有数据。因为如果未找到该 user_id 的联系方式,UDF 将返回 user_contact

我尝试通过 No match found 过滤 broadcastDF,但似乎这不起作用。有人可以在这里指导我吗?

user_id

1 个答案:

答案 0 :(得分:1)

加入这两个Dataframe时可以使用join hint来广播较小的Dataframe,不需要自己专门广播。您的代码可能如下所示:

val bigDf = ... // has columns user_id, user_address
val smallDf = ... // has columns user_id and user_contact

// define your join expression and join those tables using column user_id
import org.apache.spark.sql.functions.broadcast
val joinExpr = bigDf.col("user_id") === smallDf.col("user_id")
val joinedDF = bigDf.join(broadcast(smallDf), joinExpr)

如果您的小数据帧小于 10MB,并且您没有更改配置 spark.sql.autoBroadcastJoinThreshold,默认为 10MB,您甚至不需要在加入中提及广播提示。

配置 spark.sql.autoBroadcastJoinThreshold 描述为:

<块引用>

"配置表的最大大小(以字节为单位),该表将在执行加入时广播到所有工作节点。通过将此值设置为 -1 可以禁用广播。请注意,当前仅支持 Hive Metastore 表的统计信息,其中命令 ANALYZE TABLE COMPUTE STATISTICS noscan 已运行,基于文件的数据源表直接在数据文件上计算统计信息。”

相关问题