如何将 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(",")}"""
}
我正在使用以下版本的 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(",")}"""
}