Выровнять вложенную схему в DataFrame, получая AnalysisException: не удается разрешить имя столбца - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть DF:

 -- str1: struct (nullable = true)
 |    |-- a1: string (nullable = true)
 |    |-- a2: string (nullable = true)
 |    |-- a3: string (nullable = true)
 |-- str2: string (nullable = true)
 |-- str3: string (nullable = true)
 |-- str4: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- b1: string (nullable = true)
 |    |    |-- b2: string (nullable = true)
 |    |    |-- b3: boolean (nullable = true)
 |    |    |-- b4: struct (nullable = true)
 |    |    |    |-- c1: integer (nullable = true)
 |    |    |    |-- c2: string (nullable = true)
 |    |    |    |-- c3: integer (nullable = true)

Я пытаюсь сгладить его, для этого я использовал следующий код:

  def flattenSchema(schema: StructType, prefix: String = null):Array[Column]=
  {
    schema.fields.flatMap(f => {
      val colName = if (prefix == null) f.name else (prefix + "." + f.name)

      f.dataType match {
        case st: StructType => flattenSchema(st, colName)
        case at: ArrayType =>
          val st = at.elementType.asInstanceOf[StructType]
          flattenSchema(st, colName)
        case _ => Array(new Column(colName).as(colName))
      }
    })
  }


val d1 = df.select(flattenSchema(df.schema):_*)

Это дает мне ниже Выход:

 |-- str1.a1: string (nullable = true)
 |-- str1.a2: string (nullable = true)
 |-- str1.a3: string (nullable = true)
 |-- str2: string (nullable = true)
 |-- str3: string (nullable = true)
 |-- str4.b1: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- str4.b2: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- str4.b3: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- str4.b4.c1: array (nullable = true)
 |    |-- element: integer (containsNull = true)
 |-- str4.b4.c2: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- str4.b4.c3: array (nullable = true)
 |    |-- element: integer (containsNull = true)

Проблема возникает, когда я пытаюсь запросить ее:

d1.select("str2").show - это не вызывает у меня проблемы

, но когда я делаю запрос к любому плоскому вложенному столбцу

d1.select("str1.a1")

Ошибка:

org.apache.spark.sql.AnalysisException: cannot resolve '`str1.a1`' given input columns: ....

Что я здесь не так делаю? или любым другим способом добиться желаемого результата?

1 Ответ

3 голосов
/ 20 февраля 2020

Spark не поддерживает string имя типа столбца с точка (.) . Точка используется для доступа к дочернему столбцу любого столбца типа struct. Если вы попытаетесь получить доступ к тому же столбцу из фрейма данных df, то он должен работать, поскольку в df это struct тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...