将RDD保存到Scala中的文本文件

时间:2018-01-20 07:22:30

标签: scala apache-spark

我想做两件事:

  1. 将RDD splitRDD的内容显示到控制台。
  2. 将结果保存为文本文件。
  3. 下面第三行scala代码打印出密钥,但我正在寻找值。

    val emailMsg = sc.textFile(file);`
    val splitRDD = emailMsg.map( line => line.split("."));
    splitRDD.foreach(println);
    splitRDD.coalesce(1).saveAsTextFile("newfile")
    

2 个答案:

答案 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(" ")))