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

问题描述 投票:0回答:1

我正在进行从 HDP 到 AWS EMR 的迁移项目。作为这项工作的一部分,我们使用 HDP 中的

CREATE TABLE
语句在 EMR Hive 中创建表,这些语句是使用
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 上查找,我们得到了这个 hive using serdeproperties gets 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 上无缝运行?另外,为什么会出现这个错误呢?任何见解将不胜感激。

hadoop hive hiveql amazon-emr hortonworks-data-platform
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.