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

PySpark实现两个DataFrame的笛卡尔积(行全组合)

PySpark实现两个DataFrame的笛卡尔积(全连接)

你要实现的是两个DataFrame的笛卡尔积(全连接),也就是让Df1的每一行都和Df2的所有行进行组合,最终行数为count(Df1) * count(Df2)。以下是两种直接可行的解决方案:

步骤1:创建示例DataFrame

先把你给出的测试数据用PySpark代码生成,方便后续测试:

from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.builder.appName("CartesianProductDemo").getOrCreate()

# 创建Df1
data1 = [(1, 2, 3), (5, 6, 7), (8, 9, 1), (6, 2, 3)]
df1 = spark.createDataFrame(data1, ["A", "B", "C"])

# 创建Df2
data2 = [("a", "b"), ("c", "d"), ("e", "f")]
df2 = spark.createDataFrame(data2, ["D", "E"])

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

PySpark专门提供了crossJoin方法来生成笛卡尔积,一行代码就能搞定:

# 生成笛卡尔积结果
result_df = df1.crossJoin(df2)

# 查看结果
result_df.show()

执行后就能得到你需要的结构:每一行Df1数据对应所有Df2的行。

方法2:通过临时列+join实现(适合理解原理)

如果想通过join的逻辑实现,可以给两个DataFrame添加一个相同值的临时列,然后基于这个列做join,最后删掉临时列:

from pyspark.sql.functions import lit

# 给两个DataFrame添加临时列temp,值都为1
df1_temp = df1.withColumn("temp", lit(1))
df2_temp = df2.withColumn("temp", lit(1))

# 基于temp列join,再删除临时列
result_df = df1_temp.join(df2_temp, on="temp").drop("temp")

# 查看结果
result_df.show()

验证结果行数

你可以通过以下代码验证结果行数是否符合预期:

print(f"实际结果行数:{result_df.count()}")
print(f"预期行数(df1行数*df2行数):{df1.count() * df2.count()}")

内容的提问来源于stack exchange,提问作者Ayub Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:48:33