元组的RDD和行差异的RDD

时间:2018-05-08 12:43:58

标签: apache-spark

我有两个不同的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 internals?

1 个答案:

答案 0 :(得分:1)

您可以看到数据类型的差异

第一个是RDD[(String, Int)] 这是RDD Tuple2,其中包含(String, Int),因此您可以val prod = x._1将其作为String的第一个值和第二个x._2进行访问{1}}值。

由于它是元组,因此您无法以Integer

进行访问

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

我希望这有帮助!