如何将scala的输出格式从JSON格式化为文本文件格式

时间:2015-06-29 09:18:38

标签: json scala apache-spark file-format string-interpolation

我在下面的版本中使用Scala和Spark。

斯卡拉 - 2.10.4 Spark - 1.2.0

我在下面提到我的情况。

我有一个带有嵌套元组的RDD(Say - JoinOp)(例如,有案例类) -

(123,(null,employeeDetails(Smith,NY,DW))) 
(456,(null,employeeDetails(John,IN,CS)))

此RDD是通过两个文件的连接创建的。

现在,我的要求是将此JSON格式转换为文本文件格式,而不使用任何“Null”和任何案例类名称(此处为“employeeDetails”)。

我想要的输出是=

123,Smith,NY,DW
456,John,IN,CS

我尝试使用String Interpolation但是取得了部分成功。

val textOp = JoinOp.map{jm => s"${jm._1},${jm._2._2}"}

如果我打印textOp,它会给我低于输出。

123,employeeDetails(Smith,NY,DW)
456,employeeDetails(John,IN,CS)

现在,如果我尝试使用String插值访问“employeeDetails”案例类中的嵌套元素,它将抛出如下错误。

JoinOp.map{jm => s"${jm._1},${jm._2._2._1}"}.foreach(println)

<console> :23: Error : value _1 is not member of jm

在这里我可以理解,使用上面的语法,它无法访问“employeeDetails”案例类的嵌套元素。

这个问题的解决方案可能是什么。任何帮助或指出都会有很大帮助。

非常感谢, Pralay

3 个答案:

答案 0 :(得分:1)

案例类具有字段名称。因此,您需要使用该位置的字段名称,而不是._1。假设以下定义:

case class EmployeeDetails(name: String, state: String)

你会访问它

JoinOp.map{jm => s"${jm._1},${jm._2._2.name}"}.foreach(println)

答案 1 :(得分:1)

如果您只需打印案例类的所有字段,可以使用productIterator遍历字段列表。

val textOp = JoinOp.map { jm => 
    s"""${jm._1},${jm._2._2.productIterator.mkString(",")}"""
}

答案 2 :(得分:0)

你可以这样做:

dd/mm/yyyy