【问题标题】:Get all elements of List without iteration scala在没有迭代scala的情况下获取List的所有元素
【发布时间】:2018-01-29 14:01:32
【问题描述】:

我在 spark 中工作,我必须从 List 的元素创建一个 RDD[(Double, Double)]

我有

val list1: List[Double] = List(16.0,5.0)

当我这样做时

val rdd = sc.parallelize (Seq(list1))

我得到一个 RDD[List[Double]] 类型的 RDD 但我想要一个RDD[(Double, Double)] 类型的RDD,我可以通过这样做来实现:

val rdd = sc.parallelize (Seq((16.0,5.0)))

所以基本上,我如何在Seq() 中列出我列表中的所有元素而不进行迭代并执行类似的操作:

val rdd = sc.parallelize (Seq((list1(*))))

【问题讨论】:

  • 我很困惑。在这种情况下,您的预期输出是什么? RDD[(16.0, 5.0)] 如果你有 3, 4, or n 元素会怎样?
  • (Seq((16.0,5.0))) 不是包含List 的Seq。这是一个 Seq 元组(在本例中为 Tuple2)。
  • 这是另一个关于我详细用法的问题:stackoverflow.com/questions/48502410/…

标签: scala list apache-spark rdd


【解决方案1】:

您要做的就是将List[Double] 转换成RDD[(Double, Double)] 成对使用:

sc.paralelize(
    list.sliding(2, 2)
        .filter(_.size == 2)
        .map(tup => (tup.head, tup.last))
)

您也可以使用 .grouped(2) 代替 cmets 中提到的 .sliding(2, 2)。

【讨论】:

  • 如果这是 OP 真正想要的,那么grouped(2) 可能比sliding(2,2) 更好
  • @SergGr 不确定除了缩短几个字符之外是否有任何区别 -> 在引擎盖下它是相同的GroupedIterator
  • 如果我的列表包含两个以上的元素怎么办? (这是我的情况)我想要一个 RDD [(双,双,双)]? tup.head, tup.last 的替代方法是什么
  • @greenshade,我相信grouped更好,因为它更好地传达了开发者的意图。 @AhlAhl,您可以使用索引访问,例如list.grouped(3).filter(_.size == 3).map(seq => (seq(0), seq(1), seq(2))。
  • 如果我在执行之前知道我的列表的大小,但是如果我不知道它并且想要获取我的问题的列表中的所有元素,例如我可以有一个包含 3 个元素的列表,当我再次执行时它是 4 个元素,因此执行 (seq(0), seq(1), seq(2) 无济于事
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多