【问题标题】:Iterate RDD and Stored value in Array Or Any other Collection in scala spark迭代RDD和存储值在数组或Scala火花中的任何其他集合
【发布时间】:2017-06-19 03:17:49
【问题描述】:

我是 scala 的新手。我正在迭代 RDD 并将每个值存储在数组或任何其他集合中。但是值没有存储在数组中。

val ItrRdd = sqlContext.sql("select district,state FROM world ").rdd
var ItrRdd_data = ItrRdd.map { x =>
       (x.getString(0), x.getString(1))
    }

var district = Array[String]()

ItrRdd_data.map{ x => 
      district.+:(x._1)
    }   

如果我打印 district 那么它将是空白的。 有人可以帮我做这个或其他类似的。

提前致谢。

【问题讨论】:

  • 1. +: 不会改变district,它会创建一个新数组; 2.阅读spark.apache.org/docs/latest/…
  • 不管它是什么......但我希望该数组应该填充值。
  • 解决问题 1 后,它仍然无法工作,因为这是 Spark - OP 不能使用变量 district 并期望它将分布在整个作品中。 OP:您需要为district(然后是collect())生成一个RDD,或者(通常不是一个很好的解决方案)使用一个累加器。
  • @DarshanManek,然后按照第 2 点进行操作。您需要了解 Spark 如何实现这一目标
  • 谢谢,但你能告诉我如何使用 Accumulator 来做到这一点。

标签: arrays scala hadoop apache-spark rdd


【解决方案1】:

使用下面来计算district

val district = ItrRdd_data.map({ case(x,y) => x -> y }).collect()

【讨论】:

  • 嗨@rogue-one 这也可以,但我希望两列都以相同的顺序存储记录。然后,如果我使用上述方式,那么两个数组中的数据顺序可能会有所不同,因为它不在主表中。
  • @DarshanManek 我已经更新了答案以使两列都有..如果您担心列的顺序会发生变化..它们不会改变..或者您想要行的顺序保持不变?
  • 如果我有两个以上的字段。那么我该怎么做呢?
  • case(x1,x2,x3,x4,...) => (x1,x2,x3,x4...) 等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2015-10-26
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多