具有SERDEPROPERTIES的Hive CREATE TABLE语句引发错误

时间:2018-11-16 01:54:19

标签: hadoop hive hiveql amazon-emr hortonworks-data-platform

我正在进行从HDP到AWS EMR的迁移项目。作为工作的一部分,我们将使用来自CREATE TABLE命令的HDP的show create table语句在EMR Hive中创建表。这样的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上进行查找,我们得到了hive using serdeproperties gives error,并查看了针对该问题留下的评论。我们决定删除WITH SERDEPROPERTIES部分,然后再次运行它。这次没有抛出任何错误。然后,我们进行了ALTER TABLE test_table SET SERDEPROPERTIES('serialization.encoding'='ISO-8859-1')的工作。很好奇,我们在EMR上做了show create table,并得到了以下信息:

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上无缝运行的一种好方法,最小侵入性是什么?另外,为什么会发生错误?任何见识将不胜感激。

1 个答案:

答案 0 :(得分:0)

请转义查询中的任何特殊字符。就像“ |”为“ \ |”