我有一个包含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())
有没有办法优化这个?
答案 0 :(得分:1)
尝试使用approxCountDistinct
或countDistinct
:
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