我想做两件事:
下面第三行scala代码打印出密钥,但我正在寻找值。
val emailMsg = sc.textFile(file);`
val splitRDD = emailMsg.map( line => line.split("."));
splitRDD.foreach(println);
splitRDD.coalesce(1).saveAsTextFile("newfile")
答案 0 :(得分:1)
我认为你的文件看起来像这样
key1.value1
key2.value2
您希望以其他格式打印并保存值或对。
如果您只想打印并保存值,可以将splitRDD
转换为仅值RDD。
val valRDD = splitRDD.map( _( 1 ) )
valRDD.foreach( println )
请注意,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()
答案 1 :(得分:1)
你所说的第三行是打印不是关键。它实际上是打印数组对象,就像这样
[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(" ")))