При выполнении кода после после редактирования (см. Выше) объединение схем отключено и новые столбцы не загружаются.При включении схемы слияния:
val df = spark.read.option("mergeSchema", "true").parquet("my_df.parquet")
scala> df.printSchema
root
|-- i: integer (nullable = true)
|-- events: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- baz: integer (nullable = true)
| | |-- foo: string (nullable = true)
| | |-- moreColumns: integer (nullable = true)
| | |-- oneMore: string (nullable = true)
|-- date: date (nullable = true)
df.as [FooSecond] .collect // очевидно, что происходит сбой. NullPointerException должен использовать параметр df.as [FooSecondNullable] .collect // работает нормально
, теперь используяhive
evolved.write.mode(SaveMode.Append).partitionBy("date").saveAsTable("my_df")
, кажется, работает нормально (без исключения), но при попытке прочитать данные обратно в:
spark.sql("describe my_df").show(false)
+-----------------------+---------------------------------+-------+
|col_name |data_type |comment|
+-----------------------+---------------------------------+-------+
|i |int |null |
|events |array<struct<baz:int,foo:string>>|null |
|date |string |null |
|# Partition Information| | |
|# col_name |data_type |comment|
|date |string |null |
+-----------------------+---------------------------------+-------+
, когда вместо массива структур используются только базовые типы:
val first = Seq(Foo(1, "2019-01-01")).toDF
first.printSchema
first.write.partitionBy("dt").saveAsTable("df")
val evolved = Seq(FooEvolved(1,2, "2019-01-02")).toDF
evolved.printSchema
evolved.write.mode(SaveMode.Append).partitionBy("dt").saveAsTable("df")
evolved.write.mode(SaveMode.Append).partitionBy("dt").saveAsTable("df")
org.apache.spark.sql.AnalysisException: The column number of the existing table default.df(struct<first:int,dt:string>) doesn't match the data schema(struct<first:int,second:int,dt:string>);
есть четкое сообщение об ошибке Вопрос: возможно ли еще развить схему в Hive?Или требуется ручная адаптация схемы?
Заключение
Поддерживается эволюция схемы для массивов структур, но при чтении файлов необходимо включить параметр слияния, и кажется, что он работает изполе только при прямом чтении файлов без Hive.
При чтении из улья возвращается только старая схема, как при записи новых столбцов, по-видимому, автоматически отбрасывается.
Эволюция схемыв формате партера (создание видов вручную, дополнительное преимущество, заключающееся в том, что паркет не поддерживает эволюцию схемы (возможно переименование, изменение типа данных)), выглядит интересной альтернативой, так как для параметра слияния-схемы, установленного в значение true, достаточно много ресурсов, и он работает длявсе движки SQL в Hadoop.