Метод insertInto возвращает исключение NPE - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь создать внешнюю таблицу для чтения данных из многораздельных паркетных файлов в формате hdf. Для этого я сначала создаю внешнюю таблицу, используя эту строку:

spark.sql(
  "CREATE EXTERNAL TABLE IF NOT EXISTS mydb.mytable (col1 int)\n" +
  "PARTITIONED BY (yyyy int, mm int)\n" +
  "STORED AS PARQUET\n" +
  "LOCATION 'hdfs://group/poc/mydata'"
)

- это спарк SparkSession, созданный с этими двумя параметрами:

spark = SparkSession
      .builder()
      .enableHiveSupport()
      .config(sparkConfigurations)
      .getOrCreate()

def sparkConfigurations = {
    cfg.set("hive.exec.dynamic.partition", "true")
    cfg.set("hive.exec.dynamic.partition.mode", "nonrestrict")
  }

А затем я пытаюсь вставить данные в эту таблицу из кадра данных:

df.write
  .mode(SaveMode.Append)
  .insertInto("mydb.mytable")

является df-кадром с той же схемой, что и таблица кустов.

Эта последняя вставка InIn вызывает ошибку NullPointerException, без дополнительной информации.

Хуже всего то, что, если я запускаю первый код CREATE EXTERNAL TABLE из куста, метод insertInto начинает работать хорошо.

PS: я не могу использовать метод saveAsTable, потому что я использую spark 2.1.0, и этот метод не поддерживается до версии 2.2.0.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 30 октября 2018

Я нашел проблему ...

Когда я создаю таблицу кустов с помощью spark.sql, она добавляет дополнительную литературу в форме TBLPROPERTIES. Внутри этих свойств были столбцы разделов, которые я использовал, но в верхнем регистре, где имена столбцов в нижнем регистре.

Это возвращало NPE, поэтому, как только я изменил все, чтобы быть в нижнем регистре, он начал работать.

...