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

how to format scala's output from JSON to text file format

我正在使用以下版本的 Scala 和 Spark。

Scala - 2.10.4 火花 - 1.2.0

下面说一下我的情况。

我有一个带有嵌套元组的 RDD(Say - JoinOp)(大小写 classes),例如 -

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

此 RDD 是从包含两个文件的 Join 创建的。

现在,我的要求是将此 JSON 格式转换为没有任何 "Null" 和任何大小写 class 名称(此处为 'employeeDetails')的文本文件格式。

我想要的输出是=

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

我已经尝试过使用字符串插值来实现相同但部分成功。

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

如果我打印 textOp,那么它会给我下面的输出。

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

现在,如果我尝试使用字符串插值访问 "employeeDetails" 案例 class 中的嵌套元素,它将抛出如下错误。

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

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

在这里我可以理解,使用上面的语法,它无法访问 "employeeDetails" 情况 class 的嵌套元素。

此问题的解决方案可能是什么。任何帮助或转发都会有很大帮助。

非常感谢, 普拉莱

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

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

你会访问它

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

你可以这样做:

case class EmployeeDetails(var0: String, var1: String, var2: String)
val data = List((123,(null, EmployeeDetails("Smith", "NY", "DW"))))

data.map {case (num, (sth, EmployeeDetails(var0, var1, var2))) =>
  s"$num,$var0,$var1,$var2"}

如果只需要打印caseclass的所有字段,可以使用productIterator遍历字段列表

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