Эволюция схемы Spark Parquet - PullRequest
       11

Эволюция схемы Spark Parquet

1 голос
/ 17 марта 2020

У меня есть разделенная папка hdfs, которая имеет другую схему. Это другой раздел.

Скажем, 5 столбцов в первом разделе, 4 столбца во втором разделе. Теперь я пытаюсь прочитать базовый путь Паркет, а затем отфильтровать 2-й раздел.

Это дает мне 5 столбцов в DF, хотя у меня только 4 столбца в файлах Parquet во 2-м разделе. Когда я читаю 2-й раздел напрямую, он дает правильные 4 столбца. Как это исправить.

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Вы можете указать необходимые schema(4 columns) при чтении файла паркета!

  • Тогда Spark читает только те поля, которые включены в schema, если поле не существует в данных будут возвращены null.

Example:

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

val sch=new StructType().add("i",IntegerType).add("z",StringType)
spark.read.schema(sch).parquet("<parquet_file_path>").show()

//here i have i in my data and not have z field
//+---+----+
//|  i|   z|
//+---+----+
//|  1|null|
//+---+----+
0 голосов
/ 17 марта 2020

Я бы очень хотел помочь тебе, но я не уверен, чего ты на самом деле хочешь достичь. Каково ваше намерение по этому поводу?

Если вы читаете файл паркета со всеми его разделами и просто хотите получить столбцы, которые есть у обоих разделов, возможно, опция чтения "mergeSchema" подойдет вам.

Как и Protocol Buffer, Avro и Thrift, Parquet также поддерживает эволюцию схемы. Пользователи могут начать с простой схемы и постепенно добавлять дополнительные столбцы в схему по мере необходимости. Таким образом, пользователи могут получить несколько файлов Parquet с разными, но взаимно совместимыми схемами. Источник данных Parquet теперь может автоматически обнаруживать этот случай и объединять схемы всех этих файлов.

Поскольку объединение схем является относительно дорогой операцией и в большинстве случаев не является необходимостью, мы отключили ее по умолчанию. начиная с 1.5.0. Вы можете включить его, установив параметр источника данных mergeSchema в значение true при чтении файлов Parquet (как показано в примерах ниже) или установив глобальный параметр SQL spark. sql .parquet.mergeSchema в значение true.

см. документацию по spark

, поэтому было бы интересно, какую версию spark вы используете и как свойства spark.sql.parquet.mergeSchema (настройка искры) и mergeSchema (клиент) установлены

...