如何从Spark

时间:2017-04-04 23:31:41

标签: json apache-spark apache-spark-sql spark-dataframe

我正在尝试将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)

1 个答案:

答案 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: _*)