PySpark:将DataFrame单行值作为常量列添加到另一DataFrame
实现方案
核心需求是把df1中单条记录的values值作为全局常量,追加到df2的所有行上,两种常用实现方式如下:
方式1:提取常量后用lit函数追加(推荐)
这个方式逻辑最直观,先取出df1里的固定值,再通过Spark内置的lit函数将值包装为常量列追加到df2,不会产生冗余shuffle。
PySpark 代码
from pyspark.sql.functions import lit # 提取df1中的固定values值,df1仅1行时collect的开销可以忽略 const_val = df1.collect()[0]["values"] result_df = df2.withColumn("values", lit(const_val))
Scala 代码
import org.apache.spark.sql.functions.lit val constVal = df1.collect()(0).getAs[Seq[String]]("values") val resultDf = df2.withColumn("values", lit(constVal))
提示:如果df1可能为空,建议先做行数校验再提取值,避免数组角标越界报错。
方式2:单行笛卡尔积关联
如果不想主动把值拉取到Driver端,可以直接用交叉连接,因为df1只有1行数据,关联后不会出现数据膨胀:
# 直接交叉连接两个DataFrame,df1仅1行时结果符合预期 result_df = df2.crossJoin(df1)
注意:这个方式必须严格保证df1有且仅有1行数据,如果df1存在多行,会导致结果行数按df1的行数倍数增长,不符合固定常量列的需求。
执行后输出的结果和预期完全一致:
+---+---------+---------------+ | id| number| values| +---+---------+---------------+ | 1| 34523|[a, b, c, d, ..| | 2| 56438|[a, b, c, d, ..| | 5| 90342|[a, b, c, d, ..| +---+---------+---------------+
内容的提问来源于stack exchange,提问作者red_quark
相关产品推荐
相关产品推荐

