Scala 是否将数组(行)的RDD转换为行的RDD?
我在一个文件中有这样的数据,我想用Spark做一些统计 文件内容:Scala 是否将数组(行)的RDD转换为行的RDD?,scala,apache-spark,dataframe,rdd,Scala,Apache Spark,Dataframe,Rdd,我在一个文件中有这样的数据,我想用Spark做一些统计 文件内容: aaa|bbb|ccc ddd|eee|fff|ggg 我需要为每一行分配一个id。我将它们读取为rdd并使用zipWithIndex() 那么他们应该是这样的: (0, aaa|bbb|ccc) (1, ddd|eee|fff|ggg) 我需要使每个字符串与id关联。我可以获得数组(行)的RDD,但不能跳出数组 我应该如何修改我的代码 import org.apache.spark.sql.{Row,SparkSessio
aaa|bbb|ccc
ddd|eee|fff|ggg
我需要为每一行分配一个id。我将它们读取为rdd并使用zipWithIndex()
那么他们应该是这样的:
(0, aaa|bbb|ccc)
(1, ddd|eee|fff|ggg)
我需要使每个字符串与id关联。我可以获得数组(行)的RDD,但不能跳出数组
我应该如何修改我的代码
import org.apache.spark.sql.{Row,SparkSession}
val fileRDD=spark.sparkContext.textFile(文件路径)
val fileWithIdRDD=fileRDD.zipWithIndex()
//把线画成这样:(0,aaa),(0,bbb),(0,ccc)
//每行都是数组(行)的记录
fileWithIdRDD.map(x=>{
val id=x._1
val str=x._2
val strArr=str.split(“\\\\”)
val rowArr=strArr.map(y=>{
行(id,y)
})
罗瓦尔
})
现在看来:
[(0, aaa), (0, bbb), (0, ccc)]
[(1, ddd), (1, eee), (1, fff), (1, ggg)]
但最后我想:
(0, aaa)
(0, bbb)
(0, ccc)
(1, ddd)
(1, eee)
(1, fff)
(1, ggg)
您只需要展平您的
RDD
yourRDD.flatMap(array => array)
考虑您的代码(在内部映射以及id和str的分配中修复了一些错误)
此处的快速示例:
输入
fileWithIdRDD.collect
res30: Array[(Int, String)] = Array((0,aaa|bbb|ccc), (1,ddd|eee|fff|ggg))
scala> res31.collect
res32: Array[org.apache.spark.sql.Row] = Array([0,aaa], [0,bbb], [0,ccc], [1,ddd], [1,eee], [1,fff], [1,ggg])
执行
scala> fileWithIdRDD.map(x => {
val id = x._1
val str = x._2
val strArr = str.split("\\|")
val rowArr = strArr.map(y => {
Row(id, y)
})
rowArr
}).flatMap(array => array)
res31: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[17] at flatMap at <console>:35
您可能只想
flatMap
,而不是map
。
scala> res31.collect
res32: Array[org.apache.spark.sql.Row] = Array([0,aaa], [0,bbb], [0,ccc], [1,ddd], [1,eee], [1,fff], [1,ggg])