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
相关产品推荐
相关产品推荐

