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

时间:2016-11-29 08:48:45

标签: pyspark spark-dataframe

我有一个包含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包含所有分类变量

的列名

有没有办法优化这个?

3 个答案:

答案 0 :(得分:1)

尝试使用approxCountDistinctcountDistinct

from pyspark.sql.functions import approxCountDistinct, countDistinct

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

但计算不同的元素是昂贵的。

答案 1 :(得分:0)

你可以这样做,但如上所述,不同的元素计数是昂贵的。 single *将每个值作为参数传递,因此返回值将为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))

答案 2 :(得分:0)

您可以使用

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

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

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