繁体   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