pyspark数据框所有列中的唯一元素数

时间:2018-12-13 13:53:08

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

如何计算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万行。

3 个答案:

答案 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()