簡體   English   中英

python雙列表理解到scala等效

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM