相关疑难解决方法(0)

Pyspark 对列中列表中的值进行联接和操作

我有两个数据框,即

df1 = sc.parallelize([
  ['u1', 'type1', ['a', 'b']],
  ['u2', 'type1', ['a', 'c', 'd']],
  ['u1', 'type2', ['d']]
]).toDF(('person', 'type', 'keywords'))

df2 = sc.parallelize([
  ['a', 2],
  ['b', 1],
  ['c', 0],
  ['d', 1],
  ['e', 3],
]).toDF(('keyword', 'score'))
Run Code Online (Sandbox Code Playgroud)

我需要计算每个person和 per的type平均值。因此,“type1”上的“u1”的平均值为 1.5 ,因为它具有关键字“a”和“b”,贡献为 2+1/2=1.5scorekeywordspersontype

我尝试过一种包含连接的方法:

df = df1.join(df2) \
  .select('person', 'type', 'keywords', 'keyword', 'score') \
  .groupBy('person', 'type') \
  .agg(avg('score'))
Run Code Online (Sandbox Code Playgroud)

但问题是,它是计算每个可能的关键字的平均值,而不仅仅是计算用户和类型所具有的关键字,因此我到处都得到 1.4,这是所有关键字的所有分数除以其数量的总和。我只需要总结keywords每个用户和类型列表中这些关键字的分数。

python join dataframe apache-spark pyspark

2
推荐指数
1
解决办法
8967
查看次数

标签 统计

apache-spark ×1

dataframe ×1

join ×1

pyspark ×1

python ×1