中检查矩阵每列中的唯一值的数量
我有一个火花数据框架,其中包含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包含所有分类变量的列名
有什么方法可以优化?
尝试使用approxCountDistinct
或countDistinct
:
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