基于另一个数据帧在火花数据帧中创建一个新列

时间:2021-02-18 01:40:53

标签: apache-spark pyspark apache-spark-sql

我有两个数据框:

df1:

c1    c2   c3
1    192    1
3    192    2
4    193    3
5    193    3
7    193    5
9    194    7

df2:

v1
192 
193
194

我想在df2中添加新列,结果是:

df2:

v1     v2
192    2
193    2
194    1

说明:v1=193,在df1中有3行,对应的c3为3\3\5 不同的值是 3 和 5,计数是 2,所以 df2 中的 v2 是 2

谢谢,python版本最好。

2 个答案:

答案 0 :(得分:2)

您可以尝试如下:

from pyspark.sql.types import *
from pyspark.sql.functions import *
sdf1 = spark.createDataFrame([
(1,192,1),
(3,192,2),
(4,193,3),
(5,193,3),
(7,193,5),
(9,194,7)
], ["c1", "c2", "c3"])

df2 = spark.createDataFrame([
(192,),
(193,),
(194,)
], ["v1"])

df1 = sdf1.groupBy("c2").agg(countDistinct("c3").alias("cnt"))
df2.join(df1, df1.c2 == df2.v1).select(df2.v1,df1.cnt).show()

答案 1 :(得分:2)

您可以加入,按 v1 分组并获得 c3 的不同计数。

import pyspark.sql.functions as F

result = (df1.join(df2, df1.c2 == df2.v1)
             .groupBy('v1')
             .agg(F.countDistinct('c3').alias('v2'))
         )

result.show()
+---+---+
| v1| v2|
+---+---+
|193|  2|
|192|  2|
|194|  1|
+---+---+