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



我有一个火花数据框架,其中包含100万行和560列。我需要在数据框的每一列中找到唯一项目的计数。我已经编写了以下代码来实现这一目标,但是它被卡住了,花了太多时间来执行:

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包含所有分类变量的列名

有什么方法可以优化?

尝试使用approxCountDistinctcountDistinct

from pyspark.sql.functions import approxCountDistinct, countDistinct
counts = df.agg(approxCountDistinct("col1"), approxCountDistinct("col2")).first()

但是计数不同的元素很昂贵。

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

您可以使用

的每一列的每个元素获取每个元素
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()

计数的一部分,从此处获取:在Spark

中检查矩阵每列中的唯一值的数量

相关内容

  • 没有找到相关文章

最新更新