【问题标题】:RDD of Tuple and RDD of Row differencesTuple 的 RDD 和 Row 差异的 RDD
【发布时间】:2018-05-08 12:43:57
【问题描述】:

我有两个不同的 RDD,并对它们都应用了 foreach,并注意到我无法解决的差异。

第一个:

val data = Array(("CORN",6), ("WHEAT",3),("CORN",4),("SOYA",4),("CORN",1),("PALM",2),("BEANS",9),("MAIZE",8),("WHEAT",2),("PALM",10))
val rdd = sc.parallelize(data,3) // NOT sorted

rdd.foreach{ x => {      
             println (x)
                  }}

rdd: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[103] at parallelize at command-325897530726166:8

在这个意义上工作得很好。

第二个:

rddX.foreach{ x => {      
              val prod = x(0)
              val vol = x(1)
              val prt = counter
              val cnt = counter * 100
              println(prt,cnt,prod,vol)
                   }}

 rddX: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[128] at rdd at command-686855653277634:51

工作正常。

问题:为什么我不能像第一个例子的第二种情况那样做 val prod = x(0) ?我怎么能用 foreach 做到这一点?或者我们是否需要在第一种情况下总是使用地图?由于第二个示例中的 Row 内部结构?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    正如你所看到的数据类型的差异

    第一个是RDD[(String, Int)] 这是RDDTuple2,其中包含(String, Int),因此您可以将其作为val prod = x._1 访问第一个值作为Stringx._2 访问第二个Integer 值。

    由于它是一个元组,因此您无法以 val prod = x(0) 的身份访问

    第二个是RDD[org.apache.spark.sql.Row],可以访问 val prod = x.getString(0)val prod = x(0)

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2019-09-09
      相关资源
      最近更新 更多