我有两个不同的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?
答案 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)
我希望这有帮助!