[英]python double list comprehension to scala equivalent
試圖將一些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 *)。 由於您不使用第一個元組項,因此可以在其中使用undescore來“將其丟棄”。
* FWIW,您可以將Python稍微整潔一些:
lambda (_,v): [(x, y) for x in v for y in v if x < y]
雖然Nick B提供的答案可以直接翻譯您的代碼,但在此處使用combinations
更有意義:
rdd.values.flatMap(_.toSeq.distinct.sorted.combinations(2))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.