pyspark:在数据框的每一列中获取唯一项目

Posted

技术标签:

【中文标题】pyspark:在数据框的每一列中获取唯一项目【英文标题】:pyspark: get unique items in each column of a dataframe 【发布时间】: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 包含所有分类变量的列名

有什么办法可以优化吗?

【问题讨论】:

check number of unique values in each column of a matrix in spark的可能重复 【参考方案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

【讨论】:

以上是关于pyspark:在数据框的每一列中获取唯一项目的主要内容,如果未能解决你的问题,请参考以下文章

在没有数据重复的情况下爆炸数据框的每一列

如何为熊猫数据框的每一列应用具有不同时间常数的一阶过滤器?

如何获取 HIVE/PySpark 表中每一列的唯一值?

熊猫在巨大的csv的每一列中找到独特元素的数量

Pyspark - 从每列中选择不同的值

从 Python 数据框的一列中的每一行中删除前 x 个字符