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

