Проблема удаления таблицы Hive из скрипта pyspark - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть таблица в hive, созданная из многих файлов json с использованием метода hive-json-serde WITH SERDEPROPERTIES ('dots.in.keys' = 'true'), поскольку некоторые ключи там имеют точку, например `aaa.bbb`.Я создаю внешнюю таблицу и использую обратные клавиши для этих ключей.Теперь у меня есть проблема удаления этой таблицы из скрипта pyspark, используя sqlContext.sql("DROP TABLE IF EXISTS "+table_name), я получаю это сообщение об ошибке:

An error occurred while calling o63.sql.
: org.apache.spark.SparkException: Cannot recognize hive type string: struct<associations:struct<aaa.bbb:array<string> ...
Caused by: org.apache.spark.sql.catalyst.parser.ParseException: 
mismatched input '.' expecting ':'(line 1, pos 33)
== SQL ==
struct<associations:struct<aaa.bbb:array<string>,...
---------------------------------^^^

В HUE я могу удалить эту таблицу без каких-либо проблем.Я делаю это неправильно, или, может быть, есть лучший способ сделать это?

1 Ответ

0 голосов
/ 03 января 2019

Похоже, что невозможно работать с таблицами Hive, созданными с помощью метода hive-json-serde, с точкой в ​​ключах, используя sqlContext.sql ("...") из сценария pyspark, как я хочу.Всегда возникает одна и та же ошибка, если я хочу удалить такую ​​таблицу Hive или создать ее (еще не пробовал другие вещи).Поэтому мой обходной путь - использовать python os.system () и выполнить требуемый запрос через сам куст:

q='hive -e "DROP TABLE IF EXISTS '+ table_name+';"'
os.system(q)

С CREATE TABLE-запросом все сложнее, поскольку нам нужно экранировать обратные пометки с помощью '\':

statement = "CREATE TABLE test111 (testA struct<\`aa.bb\`:string>) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION 's3a://bucket/test111';"
q='hive -e "'+ statement+'"'

Он выводит некоторую дополнительную информацию, связанную с ульями, но работает!

...