如何计算pyspark数据帧的每一列中的唯一元素的数量:
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万行。
答案 0 :(得分:1)
尝试一下:
Object
编辑:
正如@pault所建议的那样,这是一项昂贵的操作,您可以使用from pyspark.sql.functions import col, countDistinct
df_spark.agg(*(countDistinct(col(c)).alias(c) for c in df_spark.columns))
,他建议的当前已被弃用(火花版本> = 2.1)
答案 1 :(得分:1)
@Manrique 解决了这个问题,但只有稍微修改的解决方案对我有用:
expression = [countDistinct(c).alias(c) for c in df.columns]
df.select(*expression).show()
答案 2 :(得分:0)
速度更快:
df_spark.select(F.countDistinct("col1")).show()