Как получить имена полей, расположенных в столбце ArrayType - PullRequest
0 голосов
/ 23 января 2019

Это моя схема

    root
     |-- tags: array (nullable = true)
     |    |-- element: array (containsNull = true)
     |    |    |-- element: struct (containsNull = true)
     |    |    |    |-- context: string (nullable = true)
     |    |    |    |-- key: string (nullable = true)

Я хочу получить имя элемента context и key и изменить тип данных этих переменных в Array.

Когда я пытаюсь получить поля, используя карту, она показывает что-то вроде этого.

arraydf.schema.fields.map(field1 =>
                println("FIELDS: "+field1)
Output: 
FIELDS:StructField(tags,ArrayType(ArrayType(StructType(StructField(context,StringType,true), StructField(key,StringType,true)),true),true),true)

Я хочу, чтобы моя схема была такой, элементы в зависимости от типа структуры должны иметь тип arrayType, я хочу универсальный способ. Пожалуйста, помогите мне.

    root
     |-- tags: array (nullable = true)
     |    |-- element: array (containsNull = true)
     |    |    |-- element: struct (containsNull = true)
     |    |    |    |-- context: array (nullable = true)
     |    |    |    |-- key: array (nullable = true)

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Шаблон совпадения по структуре

import org.apache.spark.sql.types._
import org.apache.spark.sql.DataFrame

def fields(df: DataFrame, c: String) = df.schema(c) match{
  case StructField(_, ArrayType(ArrayType(ss: StructType, _), _), _, _) => 
    ss.fields map { s =>
      (s.name, s.dataType)
    }
}

Пример:

scala> fields(Seq(Seq(Seq((1, 2)))).toDF, "value")
res7: Array[(String, org.apache.spark.sql.types.DataType)] = Array((_1,IntegerType), (_2,IntegerType))
0 голосов
/ 23 января 2019

Из того, что я получаю, вы просто хотите получить доступ к элементу, верно?Это делается с помощью точечной нотации для StructType и getItem для ArrayType (или просто квадратных скобок []).

Итак, если вы хотите получить значения, позвольте мне сказать, попробуйте:

arraydf.select("tags[0][0].context, tags[0][0].key")

Предлагаю вам также взглянуть на функцию explode () , это может быть полезно.

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