Apache spark 在一个spark命令中分割RDD文件后的FlatMap

Apache spark 在一个spark命令中分割RDD文件后的FlatMap,apache-spark,Apache Spark,我在这里找不到我的错误。我想用逗号分割文件,然后在一个命令中装入一个元组。我搜索了StackOverflow,但大多数答案都包含在多个命令中。我将感谢任何帮助:) 文件是: 1,testea,0,testeb,3 2,testea,0,testeb,0 3,testea,4,testeb,0 鉴于这一投入: 1,testea,0,testeb,3 2,testea,0,testeb,0 3,testea,4,testeb,0 几乎没有其他选择 1-保持你的方法: val yourFileP

我在这里找不到我的错误。我想用逗号分割文件,然后在一个命令中装入一个元组。我搜索了StackOverflow,但大多数答案都包含在多个命令中。我将感谢任何帮助:)

文件是:

1,testea,0,testeb,3
2,testea,0,testeb,0
3,testea,4,testeb,0
鉴于这一投入:

1,testea,0,testeb,3
2,testea,0,testeb,0
3,testea,4,testeb,0

几乎没有其他选择

1-保持你的方法:

val yourFilePath:String=//这里是您的路径值
val output=spark.sparkContext.textFile(yourFilePath).map(line=>{val array=line.split(“,”);(数组(0),数组(2).toInt,数组(4.toInt)})
输出
output.collect()
//输出:
输出:org.apache.spark.rdd.rdd[(String,Int,Int)]=MapPartitionsRDD[4]位于映射位置:18
res2:Array[(String,Int,Int)]=数组((1,0,3)、(2,0,0)、(3,4,0))
2-使用
.csv
直接阅读:

spark.read.csv(您的文件路径)。选择(“\u c0”、“\u c2”、“\u c4”).show()
//输出:
+---+---+---+
|_c0 | uC2 | uC4|
+---+---+---+
|  1|  0|  3|
|  2|  0|  0|
|  3|  4|  0|
+---+---+---+

为什么需要
.flatMap
?我认为,如果唯一的要求是基于每行返回一个元组,那么您可以用
.map
替换
flatMap
val testRDD=myFile.map(x=>{val str=x.split(',');(str(0),(str(2.toInt,str(4.toInt)))))collect()
谢谢您的评论!为什么我不能使用平面图?因为我想通过迭代来减少数据,我在flatMap上想的,不是吗?另外,我尝试了您建议的更改,得到了:“:25:error:value split不是Array[String]的成员”这里有几点。第一个是
flatMap
map
的区别。基本上,您将迭代df或rdd中的每个项,不同之处在于返回类型,而
flatMap
将期望List/Seq/etc,
map
将期望单个项,在本例中是元组;这就是为什么您可以在这个场景中使用它。这里的第二点是
myFile
的数据类型,您可以将
myFile.as[String]
添加到
map
之前,以便在
.map
中使用
拆分!!现在我明白了,谢谢!!很抱歉打扰您,但有一件事,将它给我的类型转换和错误,我认为它告诉我“as”操作符没有导入。试图找到如何做到这一点,但它说,这是scala原生的,所以应该已经导入;你知道吗?“错误:value as不是org.apache.spark.rdd.rdd[String]的成员”,这是因为
myFile
rdd
。as
用于
DataFrames
。在这种情况下,我认为您不需要使用
.split
。您需要验证
myFile
的数据类型,但我认为您可以使用:
myFile.map(I=>(I._1,I._2.toInt,I._3,I._4.toInt)).collect()
,它也会这样做。
1,testea,0,testeb,3
2,testea,0,testeb,0
3,testea,4,testeb,0