У меня есть фрейм данных, который я преобразовал в файл JSON ниже, рекурсивно просматривая dataFrame.schema (). Полученный JSON выглядит следующим образом: http://pastie.org/p/2Oe1a3KJf212bveJVIEIyQ.
Я хочу найти пути для примитивного типа данных (StringType, IntegerType, а НЕ тот, у которого __Kind как «Запись ").
например, путь для contractType -" services.contract.contractType ".
Один из используемых мной подходов - это рекурсивный обход dataFrame.schema (). Я создал все пути, которые являются есть в JSON, используя этот фрагмент кода
def helperArrayType(inner: ArrayType, prefix: String): Seq[String] = {
val fullName: String => String = name => if (prefix.isEmpty) name else s"$prefix.$name"
inner match {
case ArrayType(inner: StructType, _) =>
fullName(prefix) +: helper(inner, fullName(prefix))
case ArrayType(_, _) => Seq(fullName(prefix))
}
}
def helper(schema: StructType, prefix: String): Seq[String] = {
val fullName: String => String = name => if (prefix.isEmpty)
name
else {
s"$prefix.$name"}
schema.fields.flatMap {
case StructField(name, inner: StructType, _, _) =>
fullName(name) +: helper(inner, fullName(name))
case StructField(name, inner: ArrayType, _, _) =>
fullName(name) +: helperArrayType(inner, fullName(name))
case StructField(name, _, _, _) => {println(name)
Seq(fullName(name))}
}
Но проблема в том, что может быть несколько ключей, таких как (AB C) и (D. C). Итак, путь «C "не может быть определено, так как это происходит в нескольких сценариях ios.
Я думаю о другом способе просто пройти по ссылке JSON, созданной в предыдущем ie, но не смог найти способ пересечь JSON. Кто-нибудь знает, как это сделать?