Искры вставка в сбой с использованием столбцов разделов другого случая. ошибка улья? - PullRequest
0 голосов
/ 15 мая 2018

Я тестирую использование метода PySpark insertInto() для вставки данных в существующую таблицу.Я столкнулся с проблемой, которая, по моему мнению, является следствием известной ошибки, и ищу подтверждение.Мне также интересно, есть ли обходной путь, о котором я не знаю.

Я использую Spark v2.2.1:
enter image description here

и,если эта команда заслуживает доверия, Hive v2.1.1
enter image description here

Этот код успешно создает таблицу и вставляет в нее данные:

table_name = "default.insert_test"
sqlContext.sql("DROP TABLE IF EXISTS %s" % table_name)
sql = """
CREATE TABLE %s (col string)
PARTITIONED BY (pcol bigint)
STORED AS PARQUET
""" % table_name
sqlContext.sql(sql)
sqlContext.createDataFrame([('Alice', 1)], ['name', 'age'])\
.write.mode('overwrite').insertInto(table_name)

Однако этот код (единственное отличие - это верхний регистр имени столбца раздела):

table_name = "default.insert_test"
sqlContext.sql("DROP TABLE IF EXISTS %s" % table_name)
sql = """
CREATE TABLE %s (col string)
PARTITIONED BY (PCOL bigint)
STORED AS PARQUET
""" % table_name
sqlContext.sql(sql)
sqlContext.createDataFrame([('Alice', 1)], ['name', 'age'])\
.write.mode('overwrite').insertInto(table_name)

завершается неудачно при вызове insertInto() с ошибкой:

AnalysisException: u'org.apache.hadoop.hive.ql.metadata.Table.ValidationFailureSemanticException: спецификация раздела {pcol =, PCOL = 1} содержит столбцы без разделов;'

Я знаю, что могу обойти этопроблема с использованием нового синтаксиса CREATE TABLE в Spark SQL (см. SPARK-18885 - объедините синтаксис CREATE TABLE для таблиц источников данных и таблиц кустов ) примерно так:

table_name = "default.insert_test"
sqlContext.sql("DROP TABLE IF EXISTS %s" % table_name)
sql = """
CREATE TABLE %s (col string, PCOL bigint)
USING PARQUET
PARTITIONED BY (PCOL)
""" % table_name
sqlContext.sql(sql)
sqlContext.createDataFrame([('Alice', 1)], ['name', 'age'])\
.write.mode('overwrite').insertInto(table_name)

К сожалению, у нас есть клиенты, которыесуществующие таблицы созданы с использованием старого синтаксиса CREATE TABLE, таким образом, это сценарий, который мы имеемдля поддержки.

Мои вопросы:

  1. Есть ли способ, которым я не знаю, использовать insertInto() против таблиц, которые показывают эту проблему?
  2. Является ли HIVE-14032 - сбой команды INSERT OVERWRITE с именами ключей раздела с учетом регистра основной причиной того, что я испытываю?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...