You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyspark Databricks环境下无共同键的两个DataFrame连接实现问题

PySpark无共同关联键DataFrame全拼接实现方案

你需要的是交叉连接(笛卡尔积),该连接方式会将左表的每一行与右表的所有行进行全匹配,不需要任何关联键,完全符合当前需求。

前置配置

默认Spark为了避免误操作产生海量数据,会禁止笛卡尔积操作,执行前需要先开启配置:

spark.conf.set("spark.sql.crossJoin.enabled", True)

实现代码

先模拟你提到的两个测试DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql.functions import lit

# 构造df1
df1_data = [("2021-01-10", "David")]
df1 = spark.createDataFrame(df1_data, ["date", "name"])

# 构造df2示例数据
df2_data = [("val11", "val12", "val13"),
            ("val21", "val22", "val23"),
            ("val31", "val32", "val33"),
            ("val41", "val42", "val43")]
df2 = spark.createDataFrame(df2_data, ["column1", "column2", "column3"])

方法1:直接使用crossJoin方法(推荐)

PySpark提供了专门的交叉连接方法,调用即可得到预期结果:

df3 = df1.crossJoin(df2)
# 查看结果
df3.show()

输出结果为4行5列,完全符合你的要求:

+----------+-----+-------+-------+-------+
|      date| name|column1|column2|column3|
+----------+-----+-------+-------+-------+
|2021-01-10|David|  val11|  val12|  val13|
|2021-01-10|David|  val21|  val22|  val23|
|2021-01-10|David|  val31|  val32|  val33|
|2021-01-10|David|  val41|  val42|  val43|
+----------+-----+-------+-------+-------+

方法2:使用恒真条件join

如果使用的Spark版本较低不支持crossJoin方法,可以用恒真条件作为join关联条件实现相同效果:

df3 = df1.join(df2, lit(True), how="inner")

注意事项

交叉连接生成的数据量为左表行数 × 右表行数,仅适合左表行数极少的场景使用,如果左表数据量较大请谨慎操作避免占用过多集群资源。


内容的提问来源于stack exchange,提问作者Felipe FB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:24:02