繁体   English   中英

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

[英]Saving a RDD to a text file in Scala

我想做两件事:

  1. 显示RDD splitRDD的内容到控制台。
  2. 将结果保存到文本文件。

下面第三行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM