Редактировать
Приведенное ниже решение неверно.
- Сканеры клея не должны устанавливать свойства
spark.sql.sources.schema.*
, но Spark SQL должен. По умолчанию в Spark 2.4 для spark.sql.hive.caseSensitiveInferenceMode
установлено значение INFER_AND_SAVE
, что означает, что Spark выводит схему из базовых файлов и изменяет таблицы, добавляя свойства spark.sql.sources.schema.*
в SERDEPROPERTIES
. В нашем случае Spark не удалось этого сделать из-за исключения IllegalArgumentException: Can not create a Path from an empty string
, вызванного тем, что экземпляр класса базы данных Hive имеет пустую строку свойства locationUri
. Это вызвано тем, что в базе данных Glue отсутствует свойство Location . После сохранения схемы Spark считывает ее из таблицы. - Можно обойти это путем установки
INFER_ONLY
, которая должна выводить схему только из файлов, а не пытаться изменить таблицу SERDEPROPERTIES
. Однако это не работает из-за ошибки Spark, в результате которой выведенная схема затем переводится в нижний регистр (см. здесь ).
Исходное решение (неверное)
Эта ошибка возникает из-за того, что SERDEPROPERTIES
таблицы Glue отсутствует два важных свойства:
spark.sql.sources.schema.numParts
spark.sql.sources.schema.part.0
Чтобы решить эту проблему, мне пришлось добавить эти два свойства через консоль Glue (не удалось сделать это с ALTER TABLE …
)
Я думаю, что это ошибка сканеров Glue, которые не устанавливают эти свойства, когда создание таблицы.