繁体   English   中英

向 PySpark 中的每一行添加不同的列计数

[英]Add distinct count of a column to each row in PySpark

我需要为 PySpark dataframe 中的每一行添加不同的列计数。

例子:如果原来的dataframe是这样的:

+----+----+
|col1|col2|
+----+----+
|abc |   1|
|xyz |   1|
|dgc |   2|
|ydh |   3|
|ujd |   1|
|ujx |   3|
+----+----+

然后我想要这样的东西:

+----+----+----+
|col1|col2|col3|
+----+----+----+
|abc |   1|   3|
|xyz |   1|   3|
|dgc |   2|   3|
|ydh |   3|   3|
|ujd |   1|   3|
|ujx |   3|   3|
+----+----+----+

我试过df.withColumn('total_count', f.countDistinct('col2'))但它给出了错误。

您可以计算列中的不同元素并使用以下值创建新列:

distincts = df.dropDuplicates(["col2"]).count()
df = df.withColumn("col3", f.lit(distincts))

交叉连接到不同的计数如下:

df2 = df.crossJoin(df.select(F.countDistinct('col2').alias('col3')))

df2.show()
+----+----+----+
|col1|col2|col3|
+----+----+----+
| abc|   1|   3|
| xyz|   1|   3|
| dgc|   2|   3|
| ydh|   3|   3|
| ujd|   1|   3|
| ujx|   3|   3|
+----+----+----+

您可以使用Windowcollect_setsize

from pyspark.sql import functions as F, Window

df = spark.createDataFrame([("abc", 1), ("xyz", 1), ("dgc", 2), ("ydh", 3), ("ujd", 1), ("ujx", 3)], ['col1', 'col2'])

window = Window.orderBy("col2").rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)

df.withColumn("col3", F.size(F.collect_set(F.col("col2")).over(window))).show()

+----+----+----+
|col1|col2|col3|
+----+----+----+
| abc|   1|   3|
| xyz|   1|   3|
| dgc|   2|   3|
| ydh|   3|   3|
| ujd|   1|   3|
| ujx|   3|   3|
+----+----+----+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM