【问题标题】:how to format scala's output from JSON to text file format如何将scala的输出从JSON格式化为文本文件格式
【发布时间】:2015-06-29 09:18:38
【问题描述】:

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

斯卡拉 - 2.10.4 火花 - 1.2.0

我在下面提到我的情况。

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

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

这个 RDD 是通过一个包含两个文件的 Join 创建的。

现在,我的要求是将此 JSON 格式转换为文本文件格式,不带任何“Null”和任何案例类名称(此处为“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”案例类中的嵌套元素,它将引发如下错误。

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

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

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

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

非常感谢, 普拉莱

【问题讨论】:

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


    【解决方案1】:

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

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

    你会访问它

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

    【讨论】:

    • 谢谢@lulian。有效。有什么方法可以引用“employeeDetails”案例类的所有字段而不明确提及它们的名称。任何特殊字符会获取所有字段吗?
    • 您可以使用productElement(n: Int): Any 来检索案例类的每个元素,但您会丢失所有类型信息(它返回任何)。通常人们更喜欢使用名称,因为代码更清晰。
    • 谢谢卢连。我还有另一种情况,我的 RDD 如下所示。 (123,(null,employeeDetails(credentails(XYZ,PASS),evaluationReport(80,100)))) 在这里,如果我使用以下语法,我无法使用以下代码访问“XYZ”值 joinOp.map( op => s “${op._2._2._1}”)。这里最后的 ._1 无法从 credendtails 案例类中获取值。嵌套案例类值无法访问的问题可能是什么。
    • 我让它使用以下语法。 joinOp.map(op => s"${op._2._2..}")。感谢您对路莲的帮助。
    • 很高兴,但我的名字是 Iulian,而不是 Lulian(实际上你第一次就猜对了 :))
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以这样做:

      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"}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        相关资源
        最近更新 更多