Spark - чтение из Hive и создание строго типизированного набора данных без класса case - PullRequest
0 голосов
/ 27 ноября 2018

Я использую spark для чтения данных из таблицы Hive, и мне действительно нужен строго типизированный Dataset

Вот что я делаю, и это работает:

val myDF = spark.sql("select col1, col2 from hive_db.hive_table")

// Make sure that the field names in the case class exactly match the hive column names
case class MyCaseClass (col1: String, col2: String)

val myDS = myDF.as[myCaseClass]

Проблема, с которой я столкнулся, состоит в том, что моя таблица Hive очень длинная, и многие столбцы являются структурами, поэтому определение класса дела нетривиально

. Есть ли способ создать Dataset без необходимостисоздать кейс-класс?Мне было интересно, что, поскольку в Hive уже определены все имена столбцов, а также типы данных, есть ли способ создать Dataset напрямую?

1 Ответ

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

TL; DR Краткий ответ: такой опции нет.Dataset определяется в терминах хранимого типа, и это Encoder, поэтому вы не можете просто пропустить тип.

На практике вы можете исследовать различные варианты, включая отражение в Scala, макросы и генерацию кода., чтобы получить необходимые типы из таблицы метаданных.Некоторые из них были успешно использованы в дикой природе (вы можете проверить использование макросов в ScalaRelational или генерацию кода в ScalaLikeJDBC ) для решения подобных проблем.Как и сегодня, в Apache Spark нет встроенных инструментов, играющих аналогичную роль.

Однако, если схема довольно сложная, она может оказаться тупиковой по ряду причин, включая, но не ограничиваясь:

  • Затраты времени выполнения"типизированных" преобразований.
  • Ограничения платформы, такие как ограничение количества аргументов методов JVM (см., Например, SI-7324) или ограничения размера кода JVM.
  • Удобство использования, особенно при использовании отражения Scala.Хотя генерация кода может обеспечить довольно приличный пользовательский опыт, оставшиеся варианты, возможно, не лучше, чем работа с простым именованным пакетом Any (он же o.a.s.sql.Row).
...