Генерация динамической схемы из массива столбцов - PullRequest
0 голосов
/ 26 марта 2019

У меня был список столбцов, по этим столбцам подготовлена ​​схема

код:

import  org.apache.spark.sql.types._
val fields = Array("col1", "col2", "col3", "col4", "col5", "col6")
val dynSchema = StructType( fields.map( field =>
       new StructField(field, StringType, true, null) ) )

тогда схема подготовлена ​​как

StructType(StructField(col1,StringType,true), StructField(col2,StringType,true), 
           StructField(col3,StringType,true), StructField(col4,StringType,true),
           StructField(col5,StringType,true), StructField(col6,StringType,true))

Но я получаю NullPointerException, когда пытаюсь прочитать данные из файла json, используя схему выше.

// reading the data
spark.read.schema(dynSchema).json("./file/path/*.json")

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

Редактировать: если я создаю схему с полями выше, я могу читать данные из json.

 StructType(Array(
 StructField("col1",StringType,true), StructField("col2",StringType,true), 
 StructField("col3",StringType,true), StructField("col4",StringType,true), 
 StructField("col5",StringType,true), StructField("col6",StringType,true)))

1 Ответ

2 голосов
/ 26 марта 2019

Просто удалите нулевой аргумент из создания StructField следующим образом:

val dynSchema = StructType( fields.map( field =>
     new StructField(field, StringType, true)))

Последний аргумент используется для определения метаданных о столбце. Его значение по умолчанию не null, а Metadata.empty. См. исходный код для более подробной информации. В исходном коде они предполагают, что он не может быть нулевым, и вызывают методы без каких-либо проверок. Вот почему вы получаете NullPointerException.

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