我正在尝试从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以便剥离包装文本?
谢谢!
答案 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)