【问题标题】:How to find out the number of unique elements for a column in a group in PySpark?如何在 PySpark 中找出组中列的唯一元素数?
【发布时间】:2021-01-07 07:04:35
【问题描述】:

我有一个 PySpark 数据框-

df1 = spark.createDataFrame([
    ("u1", 1),
    ("u1", 2),
    ("u2", 1),
    ("u2", 1),
    ("u2", 1),
    ("u3", 3),
    ],
    ['user_id', 'var1'])

print(df1.printSchema())
df1.show(truncate=False)

输出-

root
 |-- user_id: string (nullable = true)
 |-- var1: long (nullable = true)

None
+-------+----+
|user_id|var1|
+-------+----+
|u1     |1   |
|u1     |2   |
|u2     |1   |
|u2     |1   |
|u2     |1   |
|u3     |3   |
+-------+----+

现在我想对所有唯一用户进行分组,并在新列中显示他们的唯一 var 数量。所需的输出看起来像-

+-------+---------------+
|user_id|num_unique_var1|
+-------+---------------+
|u1     |2              |
|u2     |1              |
|u3     |1              |
+-------+---------------+

我可以使用 collect_set 并制作一个 udf 来查找集合的长度。但我认为必须有更好的方法来做到这一点。 如何在一行代码中实现这一点?

【问题讨论】:

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


    【解决方案1】:
    df1.groupBy('user_id').agg(F.countDistinct('var1').alias('num')).show()
    

    countDistinct 正是我所需要的。

    输出-

    +-------+---+
    |user_id|num|
    +-------+---+
    |     u3|  1|
    |     u2|  1|
    |     u1|  2|
    +-------+---+
    

    【讨论】:

      【解决方案2】:

      countDistinct 肯定是最好的方法,但为了完整起见,您在问题中所说的内容也可以不使用 UDF。可以使用size获取collect_set的长度:

      df1.groupBy('user_id').agg(F.size(F.collect_set('var1')).alias('num'))
      

      如果您想在窗口函数中使用它,这很有帮助,因为窗口函数不支持countDistinct

      例如

      df1.withColumn('num', F.countDistinct('var1').over(Window.partitionBy('user_id')))
      

      会失败,但是

      df1.withColumn('num', F.size(F.collect_set('var1')).over(Window.partitionBy('user_id')))
      

      会起作用的。

      【讨论】:

      • 我曾尝试使用 F.len 而不是 F.size,但没有成功。感谢您提供新信息
      • @n0obcoder 没有 F.len 这样的东西。您可以在docs 中看到所有可用的功能(有很多!)
      • 其实有一个F.length,不过是用来测量字符串的长度的。
      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多