Зачем нужен кодер для создания набора данных в искре - PullRequest
0 голосов
/ 27 декабря 2018

Я хотел написать выходной файл в виде паркета.Для этого я преобразовал RDD в набор данных, поскольку из RDD мы не можем получить форму паркета напрямую.А для создания набора данных нам нужно использовать неявный кодер, иначе он начнет давать ошибку времени компиляции.У меня мало вопросов только по этому поводу.Ниже приведен мой код:

implicit val myObjEncoder = org.apache.spark.sql.Encoders.kryo[ItemData]
    val ds: Dataset[ItemData] = sparkSession.createDataset(filteredRDD)

    ds.write
      .mode(SaveMode.Overwrite)
      .parquet(configuration.outputPath)
  }

Ниже приведены мои вопросы:

  1. Почему важно использовать кодировщик при создании набора данных?И что делает этот кодировщик?
  2. Из приведенного выше кода, когда я получаю выходной файл в виде паркета, я вижу его в закодированном виде.Как я могу декодировать это?Когда я декодирую его с помощью формы base64, я получаю следующее: com ......... processor.spark.ItemDat "0156028263

Итак, в основном он показывает мне object.toString () вид стоимости.

1 Ответ

0 голосов
/ 27 декабря 2018

Из документации :

createDataset требуется кодировщик для преобразования объекта JVM типа T во внутреннее представление Spark SQL и из него.

Из Курс Хизер Миллер :

По сути, кодеры - это то, что преобразует ваши данные между объектами JVM и специализированным внутренним (табличным) представлением Spark SQL. Они требуются для всех наборов данных!

Кодеры - это узкоспециализированные и оптимизированные генераторы кода, которые генерируют пользовательский байт-код для сериализации и десериализации ваших данных.

IПоверьте, теперь понятно, что такое кодировщики и что они делают.Что касается вашего второго вопроса, сериализатор Kryo приводит к тому, что Spark сохраняет каждую строку в наборе данных как плоский двоичный объект . Вместо использования сериализатора Java или Kryo, выможно использовать внутренние кодировщики Spark.Вы можете использовать его автоматически через spark.implicits._.Он также использует меньше памяти, чем Kryo / Java сериализация.

ОБНОВЛЕНИЕ I

Основываясь на вашем комментарии, вот то, что отличает Spark Encoders отрегулярная сериализация Java и Kryo (из Курс Хизер Миллер ):

  • Ограничено и оптимально для примитивов иcase-классы, типы данных Spark SQL.
  • Они содержат информацию о схеме, что делает возможным создание этих высокооптимизированных генераторов кода и обеспечивает оптимизацию на основе формы данных.Поскольку Spark понимает структуру данных в наборах данных, он может создать более оптимальную структуру в памяти при кэшировании наборов данных.
  • > в 10 раз быстрее , чем Kryo сериализация (Java порядки сериализациимедленнее)

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

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