我有两个不同的RDD,并对它们应用了一个前景,并注意到一个我无法解决的差异。
第一项:
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 = x(0)?我怎么能用前额做这件事?或者,对于第一种情况,我们总是需要使用map吗?因为第二个例子的行内件?
发布于 2018-05-08 12:50:26
如您所见,数据类型的差异
第一个是RDD[(String, Int)],这是一个RDD of Tuple2,它包含(String, Int),所以您可以以val prod = x._1的形式访问第一个值,作为String访问x._2,对于第二个Integer值,可以以x._2的形式访问。
因为它是一个元组,所以不能以val prod = x(0)的形式访问
第二个是RDD[org.apache.spark.sql.Row],它可以访问val prod = x.getString(0)或val prod = x(0)
我希望这能帮上忙!
https://stackoverflow.com/questions/50233956
复制相似问题