Scala 是否将数组(行)的RDD转换为行的RDD?

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

我在一个文件中有这样的数据,我想用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,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])