【问题标题】:pyspark: get unique items in each column of a dataframepyspark:在数据框的每一列中获取唯一项目
【发布时间】:2016-11-29 08:48:44
【问题描述】:

我有一个包含 100 万行和 560 列的 spark 数据框。我需要在数据框的每一列中找到唯一项目的数量。 我编写了以下代码来实现这一点,但它被卡住并且需要花费太多时间来执行:

count_unique_items=[]

for j in range(len(cat_col)):
    var=cat_col[j]
    count_unique_items.append(data.select(var).distinct().rdd.map(lambda r:r[0]).count())

cat_col 包含所有分类变量的列名

有什么办法可以优化吗?

【问题讨论】:

标签: pyspark spark-dataframe


【解决方案1】:

尝试使用approxCountDistinctcountDistinct

from pyspark.sql.functions import approxCountDistinct, countDistinct

counts = df.agg(approxCountDistinct("col1"), approxCountDistinct("col2")).first()

但计算不同元素的成本很高。

【讨论】:

  • 我的数据中有很多属性,其中大部分是多余的,因为它们在整个数据中只有一个不同的值。因此,我需要删除这些列以进行分析。这就是为什么,我需要计算每列中不同的元素。还有其他有效的方法吗?
【解决方案2】:

你可以做这样的事情,但如上所述,不同的元素计数是昂贵的。单个 * 作为参数传入每个值,因此返回值将是 1 行 X N 列。我经常拨打.toPandas() 电话,以便以后更容易操作。

from pyspark.sql.functions import col, approxCountDistinct
distvals = df.agg(*(approxCountDistinct(col(c), rsd = 0.01).alias(c) for c in 
df.columns))

【讨论】:

    【解决方案3】:

    您可以使用

    获取每列的每个不同元素
    df.stats.freqItems([list with column names], [percentage of frequency (default = 1%)])
    

    这将为您返回一个具有不同值的数据框,但如果您想要一个只有每列不同计数的数据框,请使用:

    from pyspark.sql.functions import countDistinct
    
    df.select( [ countDistinct(cn).alias("c_{0}".format(cn)) for cn in df.columns ] ).show()
    

    计数部分,取自这里:check number of unique values in each column of a matrix in spark

    【讨论】:

      猜你喜欢
      • 2017-09-02
      • 2021-04-02
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多