我有一个pysparkDataframe,其中1列由字符串列表组成。我想计算所有行中每个字符串列表中每个元素的示例数。伪代码:
counter = Counter()
for attr_list in df['attr_list']:
counter.update(attr_list)
另一种方法是将所有行中的所有列表连接起来,并从单个巨大的列表中构建一个计数器。在pyspark中有没有一种有效的方法可以做到这一点?
正确的输出应该是一个 collections.Counter()
对象,该对象填充了所有列中所有列表中每个项的出现次数,即,如果对于给定列,第1行具有该列表 ['a', 'b', 'c']
第2行有一个列表 ['b', 'c', 'd']
,我们会得到一个看起来像 {'a': 1, 'b': 2, 'c': 2, 'd': 1}
.
3条答案
按热度按时间q35jwt9p1#
如果你知道
elements
你要数数,然后你可以用这个spark2.4+.
而且会很快higher order function filter
以及structs
)from pyspark.sql import functions as F
a=df.withColumn("atr", F.expr("""transform(array_distinct(atr_list),x->aggregate(atr_list,0,(acc,y)->
IF(y=x, acc+1,acc)))"""))
.withColumn("zip", F.explode(F.arrays_zip(F.array_distinct("atr_list"),("atr"))))
.select("zip.*").withColumnRenamed("0","elements")
.groupBy("elements").agg(F.sum("atr").alias("sum"))
.collect()
{a[i][0]: a[i][1] for i in range(len(a))}
v8wbuo2f2#
转换为rdd的一种方法是将所有数组合并为一个数组,然后使用
Counter
上面有东西。另一个选择是
explode
以及groupBy
并将结果合并到dictionary
.bpsygsoo3#
你可以试着用
distinct
以及flatMap
方法,为此只需将列转换为和rdd并执行这些操作。