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

Posted

技术标签:

【中文标题】将 RDD 保存到 Scala 中的文本文件【英文标题】:Saving a RDD to a text file in Scala 【发布时间】:2018-01-20 07:22:29 【问题描述】:

我想做两件事:

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

下面的第 3 行 scala 代码打印出密钥,但我正在寻找值。

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

【问题讨论】:

能否请您添加 splitRDD 的架构。 不确定“下面的第 3 行 scala 代码打印出密钥”是什么意思。 split 方法输出一个数组,其toString 方法实际上不会打印数组本身的任何成员。如果您只想打印第二项(例如),您应该执行以下操作:splitRDD.foreach(row => row(1)) 你为什么要line => line.split(".")?你能给出示例文件输入和你预期的打印输出吗? 感谢您的帮助。我正在对电子邮件消息(文本文件)进行拆分,并尝试将发件人、收件人、日期和主题分开。所以,我正在寻找诸如“主题:”和“收件人:”之类的词。 【参考方案1】:

我会假设你的文件看起来像这样

key1.value1
key2.value2

并且您想以其他格式打印和保存 valuespairs

如果您只想打印和保存值,您可以将 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()

【讨论】:

非常好,正是我需要的。 太棒了!如果有帮助,您可以接受并投票赞成答案。干杯@SteveMcAffer 没问题,只要关注这个accept guide 和upvote guide。 @SteveMcAffer【参考方案2】:

你说的第三行是打印不是关键。它实际上是打印数组对象,像这样

[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(" ")))

【讨论】:

感谢您的帮助。这太棒了!

以上是关于将 RDD 保存到 Scala 中的文本文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在文本文件中保存 rdd 操作?斯卡拉/火花

Eclipse MyEclipse Scala IDEA for Eclipse里如何将控制台console输出的过程记录全程保存到指定的文本文件(图文详解)

写一个Linux C程序,将一个文本文件中的所有小写字母转换为大写字母。

Spark Scala 将文本文件读入 DataFrame

Spark 使用 Python:将 RDD 输出保存到文本文件中

spark - 将RDD保存到RMDB(MYSQL)数据库中