преобразовать набор данных в класс case с помощью (упакованных) кодеров - PullRequest
0 голосов
/ 23 ноября 2018

Я новичок в Скале.Извините за недостаток знаний.Это мой набор данных:

val bfDS = sessions.select("bf")
sessions.select("bf").printSchema


 |-- bf: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- s: struct (nullable = true)
 |    |    |    |-- a: string (nullable = true)
 |    |    |    |-- b: string (nullable = true)
 |    |    |    |-- c: string (nullable = true)
 |    |    |-- a: struct (nullable = true)
 |    |    |    |-- a: integer (nullable = true)
 |    |    |    |-- b: long (nullable = true)
 |    |    |    |-- c: integer (nullable = true)
 |    |    |    |-- d: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- a: string (nullable = true)
 |    |    |    |    |    |-- b: integer (nullable = true)
 |    |    |    |    |    |-- c: long (nullable = true)
 |    |    |-- tr: struct (nullable = true)
 |    |    |    |-- a: integer (nullable = true)
 |    |    |    |-- b: long (nullable = true)
 |    |    |    |-- c: integer (nullable = true)
 |    |    |    |-- d: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- e: string (nullable = true)
 |    |    |    |    |    |-- f: integer (nullable = true)
 |    |    |    |    |    |-- g: long (nullable = true)
 |    |    |-- cs: struct (nullable = true)
 |    |    |    |-- a: integer (nullable = true)
 |    |    |    |-- b: long (nullable = true)
 |    |    |    |-- c: integer (nullable = true)
 |    |    |    |-- d: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- e: string (nullable = true)
 |    |    |    |    |    |-- f: integer (nullable = true)
 |    |    |    |    |    |-- g: long (nullable = true)

1) Мне кажется, я не очень хорошо понимаю наборы данных Scala.Набор данных состоит из строк, но когда я печатаю схему, он показывает массив.Как набор данных отображается в массив?Является ли каждая строка элементом в массиве?

2) Я хочу преобразовать свой набор данных в класс case.

case class Features( s: Iterable[CustomType], a: Iterable[CustomType], tr: Iterable[CustomType], cs: Iterable[CustomType])

Как преобразовать мой набор данных и как использовать кодировщики?

Большое спасибо.

1 Ответ

0 голосов
/ 23 ноября 2018

Добро пожаловать в StackOverflow .К сожалению, этот вопрос не подходит для SO , посмотрите на "как спросить" , чтобы улучшить этот и будущие вопросы.
Однако я постараюсьответить на несколько ваших вопросов.


Во-первых, Spark Row s может кодировать различные значения, включая Arrays & Structures.

Во-вторых, строки вашего фрейма данных состоят только из одного столбца типа Array[...].

В-третьих, если вы хотите создать Dataset из вашего df, ваш case class должен соответствовать вашей схеме, вв таком случае это должно быть что-то вроде:

case class Features(array: Array[Elements])
case class Elements(s: CustomType, a: CustomType, tr: CustomType, cs: CustomType)

Наконец, Encoder используется для преобразования ваших классов дел и их значений во внутреннее представление Spark.Вы не должны слишком беспокоиться о них - вам просто нужно import spark.implicits._, и все необходимые вам кодеры будут там автоматически.

val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
val ds: Dataset[Features] = df.as[Features]

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

...