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】:尝试使用approxCountDistinct
或countDistinct
:
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:在数据框的每一列中获取唯一项目的主要内容,如果未能解决你的问题,请参考以下文章