【问题标题】:Number of unique elements in all columns of a pyspark dataframe [duplicate]pyspark数据框所有列中唯一元素的数量[重复]
【发布时间】:2019-05-14 18:17:15
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这样更快:

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

    【讨论】:

      【解决方案3】:

      试试这个:

      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)

      【讨论】:

        猜你喜欢
        • 2019-10-08
        • 2020-03-26
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        相关资源
        最近更新 更多