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