尝试将一些 pySpark 转换为等效的 scala,但我对双列表理解的正确语法有疑问。该代码采用键值列表,并以元组形式返回同一键出现的值列表。意思是 (2, ('user1','user2','user3')) 会返回 (('user1','user2'),('user1','user3'),('user2','user3') ).
#source rdd
[(2, ['user1', 'user3']), (1, ['user1', 'user2', 'user1']), (3, ['user2', 'user4', 'user4', 'user3'])]
#current list comprehension in pySpark
rdd2 = rdd.flatMap(lambda kv: [(x, y) for x in kv[1] for y in kv[1] if x < y])
//scala attempt to make equivelent is currently throwing errors for syntax issues
val rdd2 = rdd.flatMap((x,y) => for (x <- _(1)) yield x for(y <- _(1)) yield y if x < y)
请您参考如下方法:
Scala 在理解中支持多个迭代器。
试试这个
val rdd2 = rdd.flatMap {
case (_, v) => for {
x <- v
y <- v if x < y
} yield (x,y)
}
注意事项
下划线不会像您那样工作(两次);无论哪种方式,使用 Scala 的模式匹配展开元组都更加清晰(并且更接近 Python*)。由于您不使用第一个元组项,您可以在那里使用下划线来“丢弃它”。
*FWIW,您可以使 Python 稍微整洁一些:
lambda (_,v): [(x, y) for x in v for y in v if x < y]
