поиск в схеме датафрейма с использованием pyspark - PullRequest
1 голос
/ 11 октября 2019

У меня есть набор фреймов данных, dfs, с другой схемой, например:

      root
       |-- A_id: string (nullable = true)
       |-- b_cd: string (nullable = true)
       |-- c_id: integer (nullable = true)
       |-- d_info: struct (nullable = true)
       |    |-- eid: string (nullable = true)
       |    |-- oid: string (nullable = true)
       |-- l: array (nullable = true)
       |    |-- m: struct (containsNull = true)
       |    |    |-- n: string (nullable = true)
       |    |    |-- o: string (nullable = true)
        ..........

Я хочу проверить, если, например, в одном из столбцов указано «oid» (здесь подстолбец d_info). Как я могу искать внутри схемы набор данных и различать их. Pyspark или Scala предложение оба полезны. Спасибо

1 Ответ

1 голос
/ 11 октября 2019

Словарь / карта [узел, путь от корня к узлу] может быть создан для DataFame StructType (включая вложенный StructType) с использованием рекурсивной функции.

val df = spark.read.json("nested_data.json")
val path = searchSchema(df.schema, "n", "root")

def searchSchema(schema: StructType, key: String, path: String): String = {
  val paths = scala.collection.mutable.Map[String, String]()
  addPaths(schema, path, paths)
  paths(key)
}

def addPaths(schema: StructType, path: String, paths: scala.collection.mutable.Map[String, String]): Unit = {
for (field <- schema.fields) {
  val _path = s"$path.${field.name}"
  paths += (field.name -> _path)
  field.dataType match {
    case structType: StructType => addPaths(structType, _path, paths)
    case arrayType: ArrayType => addPaths(arrayType.elementType.asInstanceOf[StructType], _path, paths)
    case _ => //donothing
  }
 }
}

Ввод и вывод

Input = {"A_id":"A_id","b_cd":"b_cd","c_id":1,"d_info":{"eid":"eid","oid":"oid"},"l":[{"m":{"n":"n1","o":"01"}},{"m":{"n":"n2","o":"02"}}]}

Output = Map(n -> root.l.m.n, b_cd -> root.b_cd, d_info -> root.d_info, m -> root.l.m, oid -> root.d_info.oid, c_id -> root.c_id, l -> root.l, o -> root.l.m.o, eid -> root.d_info.eid, A_id -> root.A_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...