Разница в кодировке между Spark DataFrame и Dataset - PullRequest
0 голосов
/ 02 августа 2020

Читая о различиях между DataFrame Spark (который является псевдонимом для Dataset[Row]) и Dataset, часто упоминается, что Dataset s используют Encoders для эффективного преобразования в / из объектов JVM к внутреннему представлению данных Spark. В scala предусмотрены неявные кодировщики для классов case и примитивных типов. Однако есть также RowEncoder, который, я считаю, обеспечивает кодировку для Row в DataFrames.

Мои вопросы:

  1. В терминах эффективного преобразования между объектами JVM и внутренним двоичным представлением Spark, одинаковы ли DataFrame s и Dataset s по производительности?
  2. Какие дополнительные преимущества дает конкретный тип c (например, класс case в Scala) предоставить более общие c Row в части кодирования (сериализации / десериализации)? Помимо безопасности типов во время компиляции, предоставляют ли типизированные объекты JVM какие-либо преимущества перед полутипизированными (или «нетипизированными») Row?

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Dataframes - это просто наборы данных с кодировщиком для класса Spark Row. Таким образом, по сути, Dataframe - это набор данных.

Кодеры также вообще не используются, если вы не используете функции без столбцов (функции, которые принимают лямбда-выражения, такие как map, reduce, flatmap). В тот момент, когда вы это делаете используйте одну из этих функций, так как вы разбиваете кодогенерацию, которую выполняет катализатор, на две части, это приведет к снижению производительности, поскольку он не может оптимизировать лямбда. Это означает, что вы, вероятно, вообще не хотите использовать эти функции и можете полностью игнорировать разницу набора данных / Dataframe, поскольку, если вы не используете эти функции, вы никогда не будете кодировать.

По моему опыту, Преимущество безопасности типов, которое вы можете получить с помощью набора данных, и типы apis не стоят огромного удара по производительности. Почти во всех случаях я обнаружил, что вы должны оставаться в Dataframes и использовать только функции на основе столбцов и udf для лучшей производительности.

В качестве дополнительного примечания, кодировщик будет использоваться только при распараллеливании коллекции, все источники данных будут предоставлять Spark строки или внутренние строки, поэтому ваш кодировщик не будет использоваться для большинства источников.

0 голосов
/ 02 августа 2020

Я бы посоветовал вам сослаться на блог этого блока данных . У них есть хорошее объяснение того, когда использовать dataframe, dataset и RDD apis с их сравнением производительности.

Кроме того, этот сеанс Spark-Summit поможет вам идентифицировать why Dataset apis are slower than Dataframe in spark 2.0 and how they improved it in spark 2.2 by optimising whole-stage code generation

...