如何格式化saveAsTextFile的输出?

时间:2015-12-29 11:37:43

标签: scala hadoop apache-spark

我正在Scala中处理ETL过程。我的原始日志文件有很多列(大约70个)。我尝试使用Row()对象将其保存到文件中:

val base_RDD = rawData.map{r => if(r(13) == null || r(13).trim.isEmpty) Row(
    r(2), r(3), r(4), "", r(6), r(7), r(8), r(9), r(10), r(11), r(12), r(13), r(14), r(15), r(16), 
    r(18), r(21), r(27), r(29), r(30), r(32), r(33), r(34), r(35), r(36), r(37), r(38), r(39), r(40),
    r(41), r(42), r(43), r(44), r(45), r(46), r(47), r(48), r(49), r(50), r(51), r(52), r(53), r(54),
    r(55), r(56), r(57), r(58), r(59), r(60), r(61), r(62), r(63), r(64), r(65), r(66), r(67), r(68),
    r(69), r(70), r(71), r(72), r(73), r(74), r(75), "", "", "", "", "", "", "", r(76), r(77), r(78), r(1))
  else Row(r(2), r(3), r(4), "", r(6), r(7), r(8), r(9), r(10), r(11), r(12), r(13), r(14), r(15), r(16), 
    r(18), r(21), r(27), r(29), r(30), r(32), r(33), r(34), r(35), r(36), r(37), r(38), r(39), r(40), r(41), 
    r(42), r(43), r(44), r(45), r(46), r(47), r(48), r(49), r(50), r(51), r(52), r(53), r(54), r(55), r(56), r(57), r(58), 
    r(59), r(60), r(61), r(62), r(63), r(64), r(65), r(66), r(67), r(68), r(69), r(70), r(71), r(72), r(73), r(74), r(75), 
    r(13).split("_")(0), r(13).split("_")(1), r(13).split("_")(2), r(13).split("_")(3), r(5), r(13).split("_")(5), 
    r(13).split("_")(6),r(76), r(77), r(78), r(1))}

现在异常消失了。但是在磁盘上保存数据后会观察到“[”和“]”base_RDD.saveAsTextFile("hdfs://nameservice1:8020/tmp/manish/tmpData")我的方法是否正确?请说明出了什么问题?如果有的话。

示例输出:

[6035233,500212680,50013723,,,ddd.com,,,,,,,1,0,0,0,,0,,,,,,,,,,0,0,0,0,0,0,-1x-1,,,0,0,0,0,0,0,0,0,,0,0,,0,0,0,0,,,,,0,0,,0,0,0,0,0,,,,,,,,,0,0,]
[6035233,500212680,50013723,,,d.com,,,,,,,1,0,0,0,,0,,,,,,,,,,0,0,0,0,0,0,-1x-1,,,0,0,0,0,0,0,0,0,,0,0,,0,0,0,0,,,,,0,0,,0,0,0,0,0,,,,,,,,,0,0,]

我不想要“[”和“]”

1 个答案:

答案 0 :(得分:4)

在致电Lists之前,只需使用普通saveAsTextFile并制作字符串:

rawData.map{r =>
  if(r(13) == null || r(13).trim.isEmpty) Seq(r(2), r(3), ...).mkString(",")
  else Seq(r(2), r(3), ...).mkString(",")
}