我有两个数据框,即
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每个用户和类型列表中这些关键字的分数。