我正在尝试将JSON文档转换为Parquet,来自我无法控制的来源。架构是自我描述和发展的。
需要从嵌套节点中的字段名称中删除空格,以便从spark数据帧转换/写入Parquet。
Spark(在python上)如何从嵌套模式中的字段名称中删除空格?
以下似乎适用于平面架构,但似乎不适用于嵌套树。
exprs = [col(column).alias(column.replace(' ', '_')) for column in jsonDF.columns]
newDF = jsonDF.select(*exprs)
newDF.write \
.format("parquet") \
.mode("overwrite") \
.save("/path/to/parquet_test1")
这是一个代表性的组成架构。请注意节点树中不同深度的字段名称中的空格。
root
|-- Browser Info: struct (nullable = true)
| |-- Operating System: struct (nullable = true)
| | |-- Android: double (nullable = true)
| | |-- BlackBerryOS: double (nullable = true)
| | |-- ChromeOS: double (nullable = true)
| | |-- Linux: double (nullable = true)
| | |-- Mac OS X: double (nullable = true)
| | |-- Windows: double (nullable = true)
| | |-- iOS: double (nullable = true)
| |-- Browser Types: struct (nullable = true)
| | |-- Chrome: double (nullable = true)
| | |-- Firefox: double (nullable = true)
| | |-- IE 10: double (nullable = true)
| | |-- IE 8: double (nullable = true)
| | |-- IE 9: double (nullable = true)
| | |-- Opera: double (nullable = true)
| | |-- Safari 5: double (nullable = true)
| | |-- Safari 6: double (nullable = true)
| | |-- Safari 7: double (nullable = true)
答案 0 :(得分:1)
我可以在Scala中提供代码我希望有所帮助。 这有点肮脏的方式来实现你所要求的,但是会做到这一点。
import sqlContext.implicits._
import scala.collection.mutable.ListBuffer
val jsonDF = sqlContext.read.json("path")
val oldSchema = jsonDF.columns.toIterator
val newSchema = oldSchema.map(x => x.replaceAll(" ", "")).toIterator
val schema = new ListBuffer[String]()
while (oldSchema.hasNext) {
val oldSchemValue = oldSchema.next()
val newSchemaValue = newSchema.next()
schema += s"${oldSchemValue} as ${newSchemaValue}"
}
val newJsonDF = jsonDF.selectExpr(schema.toList.head, schema.toList.tail: _*)