【发布时间】:2018-05-01 20:18:20
【问题描述】:
我有两个数据框df1
+---+---+----------+
| n|val| distances|
+---+---+----------+
| 1| 1|0.27308652|
| 2| 1|0.24969208|
| 3| 1|0.21314497|
+---+---+----------+
和df2
+---+---+----------+
| x1| x2| w|
+---+---+----------+
| 1| 2|0.03103427|
| 1| 4|0.19012526|
| 1| 10|0.26805446|
| 1| 8|0.26825935|
+---+---+----------+
我想向df1 添加一个名为gamma 的新列,其中将包含df2 时df1.n == df2.x1 OR df1.n == df2.x2 时w 值的总和
我尝试使用 udf,但显然从不同的数据框中选择将不起作用,因为值应该在计算之前确定
gamma_udf = udf(lambda n: float(df2.filter("x1 = %d OR x2 = %d"%(n,n)).groupBy().sum('w').rdd.map(lambda x: x).collect()[0]), FloatType())
df1.withColumn('gamma1', gamma_udf('n'))
有什么方法可以在不使用循环的情况下使用join 或groupby 来实现吗?
【问题讨论】:
-
df1.join(df2, (df1.n == df2.x1) | (df1.n == df2.x2)).groupBy(df1.n).sum("w")?
标签: apache-spark pyspark pyspark-sql