[英]Saving a RDD to a text file in Scala
我想做两件事:
下面第三行scala代码打印出密钥,但我正在寻找值。
val emailMsg = sc.textFile(file);`
val splitRDD = emailMsg.map( line => line.split("."));
splitRDD.foreach(println);
splitRDD.coalesce(1).saveAsTextFile("newfile")
我认为你的文件看起来像这样
key1.value1
key2.value2
并且您希望以其他格式打印并保存值或对 。
如果要打印并仅保存值,可以将splitRDD
转换为仅值RDD。
val valRDD = splitRDD.map( _( 1 ) )
valRDD.foreach( println )
请注意, saveAsTextFile
不会以易于使用的格式保存文件,因此您可能需要一个简单的文本saveAsTextFile
器(Java PrintWriter
会做得很好)。
以两种不同格式打印和保存splitRDD
示例
import org.apache.spark._
import java.io.{ PrintWriter, File, FileOutputStream }
...
val pwText = new PrintWriter(
new File( "emailMsgValues.txt" )
)
val pwCSV = new PrintWriter(
new File( "emailMsgPair.csv" )
)
val emailMsg = sc.textFile( "data/emailMsg.txt" )
val splitRDD = emailMsg.map( line => line.split( '.' ) )
println( "Printing and writing values in text" )
val valRDD = splitRDD.map( _( 1 ) ).collect()
valRDD.foreach( value => {
println( value )
pwText.write( value + "\n" )
} )
println( "Printing and writing pairs in csv" )
splitRDD.collect().foreach( pair => {
println( pair.mkString( "," ) )
pwCSV.write( pair.mkString( "," ) + "\n" )
} )
pwText.close()
pwCSV.close()
你所说的第三行是打印不是关键。 它实际上是打印数组对象,就像这样
[Ljava.lang.String;@384efaf
[Ljava.lang.String;@5bc8b97c
[Ljava.lang.String;@18194125
[Ljava.lang.String;@364838ab
[Ljava.lang.String;@254b1df2
您需要做的是将该Array对象转换为spark sql的Row对象。 所以使用
import org.apache.spark.sql.Row
并像这样更改代码的第二行
val splitRDD = emailMsg.map( line => Row.fromSeq(line.split(" ")))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.