【问题标题】:create a new column in a spark dataframe based on another dataframe基于另一个数据帧在火花数据帧中创建一个新列
【发布时间】:2021-02-18 16:21:34
【问题描述】:

我有两个数据框:

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版本最好。

【问题讨论】:

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


    【解决方案1】:

    您可以加入,按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|
    +---+---+
    

    【讨论】:

      【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-29
        • 2015-12-16
        • 2020-09-18
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多