PySpark数据框中所有列中独特元素的数量

13

如何在pyspark dataframe中计算每列独特元素的数量:

import pandas as pd
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()
df = pd.DataFrame([[1, 100], [1, 200], [2, 300], [3, 100], [4, 100], [4, 300]], columns=['col1', 'col2'])
df_spark = spark.createDataFrame(df)
print(df_spark.show())
# +----+----+
# |col1|col2|
# +----+----+
# |   1| 100|
# |   1| 200|
# |   2| 300|
# |   3| 100|
# |   4| 100|
# |   4| 300|
# +----+----+

# Some transformations on df_spark here

# How to get a number of unique elements (just a number) in each columns?

我只知道下面这个解决方案,但它非常慢,这两行代码用的时间一样:

col1_num_unique = df_spark.select('col1').distinct().count()
col2_num_unique = df_spark.select('col2').distinct().count()

df_spark中大约有1000万行。


2
可能是[Spark DataFrame:计算每列不同值的数量](https://dev59.com/v1gR5IYBdhLWcg3ww_s0)的重复问题。基本上,您可以执行`df_spark.select(* [countDistinct(c).alias(c)for c in df_spark.columns]),但您应该记住这是一个昂贵的操作,并考虑是否适合使用[pyspark.sql.functions.approxCountDistinct()`](http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.approxCountDistinct)。 - pault
3个回答

13

试试这个:

from pyspark.sql.functions import col, countDistinct

df_spark.agg(*(countDistinct(col(c)).alias(c) for c in df_spark.columns))

编辑: 正如@pault建议的那样,这是一项昂贵的操作,你可以使用approx_count_distinct(),他建议的那个目前已经弃用(spark版本>= 2.1)


7

@Manrique解决了这个问题,但是只有稍微修改后的解决方案对我起作用:

expression = [countDistinct(c).alias(c) for c in df.columns]
df.select(*expression).show()

5

这样会更快速:

df_spark.select(F.countDistinct("col1")).show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接