如何使用 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|
+---+----+-------+-----------+----+----+
如何在 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|
+---+----+-------+-----------+----+----+