Я нахожусь в процессе перехода от HDP к AWS EMR. В рамках этой работы мы создаем таблицы в EMR Hive, используя операторы CREATE TABLE
из HDP, которые мы получаем с помощью команды show create table
. Один такой CREATE TABLE
DDL выглядит следующим образом:
CREATE TABLE test_table(column_list)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
WITH SERDEPROPERTIES (
'serialization.encoding'='ISO-8859-1')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://path/to/data'
В рамках процесса мы запустили измененный оператор следующим образом:
CREATE TABLE test_table(column_list)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
WITH SERDEPROPERTIES (
'serialization.encoding'='ISO-8859-1')
STORED AS TEXTFILE
LOCATION
's3://path/to/data'
Когда мы запустили это, это не удалось со следующей ошибкой:
Error: Error while compiling statement: FAILED: ParseException line 28:0 missing EOF at 'WITH' near ''org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'' (state=42000,code=40000)
Посмотрев его в StackOverflow, мы получили этот улей с использованием serdeproperties, который выдает ошибку , и просмотрели комментарии, оставленные для вопроса. Мы решили удалить часть WITH SERDEPROPERTIES
и запустили ее снова. На этот раз он не выдал никакой ошибки. Затем мы сделали ALTER TABLE test_table SET SERDEPROPERTIES('serialization.encoding'='ISO-8859-1')
, который сработал. Любопытно, мы сделали show create table
на EMR и получили это:
CREATE TABLE test_table(column_list)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim'='|',
'line.delim'='\n',
'serialization.encoding'='ISO-8859-1',
'serialization.format'='|')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://path/to/data'
Как видно, это немного отличается от того, что показывает нам HDP. Каков был бы хороший, минимально инвазивный способ заставить сценарий из HDP беспрепятственно работать на EMR? Кроме того, почему возникает ошибка? Любое понимание будет с благодарностью.