格式化(删除class / parens)Spark CSV saveAsTextFile输出?

时间:2015-05-06 15:50:33

标签: csv apache-spark rdd

我正在尝试从saveAsTextFile保存的CSV数据中删除包装类或数组文本,而不必进行非Spark后处理步骤。

我在大文件中有一些TSV数据,我将其提供给RDD。

 val testRdd = sc.textFile(_input).filter(!_.startsWith("unique_transaction_id")).map(x => x.toLowerCase).map(x => x.split('\t')).map(x => Test(x(0),x(1)))

testRdd.saveAsTextFile("test")

这将保存由类名包装的数据:

head -n 1 part-00000
Test("1969720fb3100608b38297aad8b3be93","active")

我也尝试将其用于未命名的类(?)而不是案例类。

val testRdd = sc.textFile(_input).filter(!_.startsWith("unique_transaction_id")).map(x => x.toLowerCase).map(x => x.split('\t')).map(x => (x(0),x(1)))

testRdd.saveAsTextFile( “test2的”)

这会产生

("1969720fb3100608b38297aad8b3be93","active")

仍然需要进行后处理才能移除包裹物。

为了剥离包裹字符,我尝试了flatMap(),但RDD显然不是正确的类型:

testRdd.flatMap(identity).saveAsTextFile("test3")
<console>:17: error: type mismatch;
 found   : ((String, String)) => (String, String)
 required: ((String, String)) => TraversableOnce[?]
              testRdd.flatMap(identity).saveAsTextFile("test3")

那么......我是否需要将RDD转换为其他类型的RDD,还是有另一种方法将RDD保存为CSV以便剥离包装文本?

谢谢!

4 个答案:

答案 0 :(得分:2)

val testRdd = sc.textFile(_input).filter(!_.startsWith("unique_transaction_id")).map(x => x.toLowerCase).map(x => x.split('\t')).map(x => x(0)+","+x(1))

这会将输出写为csv

答案 1 :(得分:1)

您可以尝试以下操作:

val testRdd = sc.textFile(_input).filter(!_.startsWith("unique_transaction_id"))
                                 .map(x => x.toLowerCase.split('\t'))
                                 .map(x => x(0)+","+x(1))

我们所听到的是在对标题进行过滤后,您可以在相同的地图段落中小写字符串,同时节省一些不必要的额外映射。

这将创建一个RDD [String],您可以将其保存为CSV格式。

PS:

  • 保存的rdd输出的扩展名不是csv,但格式是!

  • 这不是最佳和唯一的解决方案,但它会为您完成工作!

答案 2 :(得分:0)

您可以查看Spark CSV Library

答案 3 :(得分:0)

val logFile =&#34; /input.csv"

val conf = new SparkConf()。set(&#34; spark.driver.allowMultipleContexts&#34;,&#34; true&#34;)

val sc = new SparkContext(master =&#34; local&#34;,appName =&#34; Mi app&#34;,conf)

val logData = sc.textFile(logFile,2).cache()

val lower = logData.map(line =&gt; line.toLowerCase)