如何使用 scala/spark 正确 iterate/print 镶木地板?

How to properly iterate/print a parquet using scala/spark?

如何在 spark/scala 中打印包含嵌套对象数组的镶木地板的各个元素?

{"id" : "1201", "name" : "satish", "age" : "25", "path":[{"x":1,"y":1},{"x":2,"y":2}]}
{"id" : "1202", "name" : "krishna", "age" : "28", "path":[{"x":1.23,"y":2.12},{"x":1.23,"y":2.12}]}

具体来说,我希望能够遍历对象并打印出 id、名称和年龄...然后是路径中的每个项目。然后继续打印下一条记录等等。假设我已经阅读了 parquet 文件并拥有数据框,我想执行如下操作(伪代码):

val records = dataframe.map {
  row => {
    val id = row.getString("id")
    val name = row.getString("id")
    val age = row.getString("age")
    println("${id} ${name} ${age}")
    row.getArray("path").map {
         item => {
              val x = item.getValue("x")
              val y = item.getValue("y")
              println("${x} ${y}")
         }
    }
  }
}

不确定上述方法是否正确,但它应该让您了解我正在尝试做什么。

您可以完全使用 Dataframe 来做到这一点 API;无需使用 map

以下是您可以通过投影要使用的字段轻松扁平化架构的方法:

val records = dataframe.select("id", "age", "path.x", "path.y")

然后您可以使用 show:

打印您的数据
records.show()
  val spark = SparkSession
    .builder()
    .master("local")
    .appName("ParquetAppendMode")
    .getOrCreate()

  import spark.implicits._


  val data1 = spark.read.json("/home/sakoirala/IdeaProjects/SparkSolutions/src/main/resources/explode.json")

  val result = data1.withColumn("path", explode($"path"))

  result.withColumn("x", result("path.x"))
  .withColumn("y", result("path.y")).show()

输出:

+---+----+-------+-----------+----+----+
|age|  id|   name|       path|   x|   y|
+---+----+-------+-----------+----+----+
| 25|1201| satish|  [1.0,1.0]| 1.0| 1.0|
| 25|1201| satish|  [2.0,2.0]| 2.0| 2.0|
| 28|1202|krishna|[1.23,2.12]|1.23|2.12|
| 28|1202|krishna|[1.23,2.12]|1.23|2.12|
+---+----+-------+-----------+----+----+