我正在进行从 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 上无缝运行?另外,为什么会出现这个错误呢?任何见解将不胜感激。
请转义查询中的任何特殊字符。像“|”如 '\|'