Динамически создавать класс или схему дел - PullRequest
0 голосов
/ 02 мая 2018

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

Например, у меня есть список,

 val name_list=Seq("Bob", "Mike", "Tim")

Список не всегда будет одинаковым. Иногда оно будет содержать разные имена и различаться по размеру.

Я могу создать кейс класса

case class names(Bob:Integer, Mike:Integer, Time:Integer)

или схема

 val schema = StructType(StructFiel("Bob", IntegerType,true)::
            StructFiel("Mike", IntegerType,true)::
            StructFiel("Tim", IntegerType,true)::Nil)

но я должен сделать это вручную. Я ищу метод для динамического выполнения этой операции.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Предполагая, что тип данных столбцов одинаков:

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

val nameList=Seq("Bob", "Mike", "Tim")

val schema = StructType(nameList.map(n => StructField(n, IntegerType, true)))
// schema: org.apache.spark.sql.types.StructType = StructType(
//   StructField(Bob,IntegerType,true), StructField(Mike,IntegerType,true), StructField(Tim,IntegerType,true)
// )

spark.createDataFrame(rdd, schema)

Если типы данных различаются, вам также придется их предоставить (в этом случае это может не сэкономить много времени по сравнению с сборкой схемы вручную):

val typeList = Array[DataType](StringType, IntegerType, DoubleType)
val colSpec = nameList zip typeList

val schema = StructType(colSpec.map(cs => StructField(cs._1, cs._2, true)))
// schema: org.apache.spark.sql.types.StructType = StructType(
//   StructField(Bob,StringType,true), StructField(Mike,IntegerType,true), StructField(Tim,DoubleType,true)
// )
0 голосов
/ 03 июня 2019

Все ответы выше охватывали только один аспект - создание схемы. Вот одно решение, которое вы можете использовать для создания класса case из сгенерированной схемы: https://gist.github.com/yoyama/ce83f688717719fc8ca145c3b3ff43fd

0 голосов
/ 02 мая 2018

Если у вас есть все поля с одинаковым типом данных, вы можете просто создать как

val name_list=Seq("Bob", "Mike", "Tim")

val fields = name_list.map(name => StructField(name, IntegerType, true))

val schema = StructType(fields)

Если у вас другой тип данных, чем создать map полей и введите и создайте schema, как указано выше.

Надеюсь, это поможет!

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