Не могу прочитать чувствительный к регистру Клеевой стол, поддерживаемый Паркетом - PullRequest
0 голосов
/ 16 января 2020

Версия Spark: 2.4.2 в Amazon EMR 5.24.0

У меня есть таблица каталога клеев, подкрепленная каталогом S3 Parquet. Файлы Parquet имеют имена столбцов с учетом регистра (например, lastModified). Не имеет значения, что я делаю, я получаю имена столбцов в нижнем регистре (lastmodified) при чтении таблицы каталога клея с помощью Spark:

for {
  i <- Seq(false, true)
  j <- Seq("NEVER_INFER", "INFER_AND_SAVE", "INFER_ONLY")
  k <- Seq(false, true)
} {
  val spark = SparkSession.builder()
    .config("spark.sql.hive.convertMetastoreParquet", i)
    .config("spark.sql.hive.caseSensitiveInferenceMode", j)
    .config("spark.sql.parquet.mergeSchema", k)
    .enableHiveSupport()
    .getOrCreate()

  import spark.sql

  val df = sql("""SELECT * FROM ecs_db.test_small""")
  df.columns.foreach(println)
}

[1] https://medium.com/@an_chee / почему используется -смешка-имена-полей-в-улье-искре- sql -из-плохая идея-95da8b6ec1e0
[2] https://spark.apache.org/docs/latest/sql-data-sources-parquet.html

1 Ответ

0 голосов
/ 17 января 2020

Редактировать

Приведенное ниже решение неверно.

  1. Сканеры клея не должны устанавливать свойства 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 enter image description here. После сохранения схемы Spark считывает ее из таблицы.
  2. Можно обойти это путем установки INFER_ONLY, которая должна выводить схему только из файлов, а не пытаться изменить таблицу SERDEPROPERTIES. Однако это не работает из-за ошибки Spark, в результате которой выведенная схема затем переводится в нижний регистр (см. здесь ).

Исходное решение (неверное)

Эта ошибка возникает из-за того, что SERDEPROPERTIES таблицы Glue отсутствует два важных свойства:

  • spark.sql.sources.schema.numParts
  • spark.sql.sources.schema.part.0

Чтобы решить эту проблему, мне пришлось добавить эти два свойства через консоль Glue (не удалось сделать это с ALTER TABLE …)

Я думаю, что это ошибка сканеров Glue, которые не устанавливают эти свойства, когда создание таблицы.

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