我正在进行从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上无缝运行的一种好方法,最小侵入性是什么?另外,为什么会发生错误?任何见识将不胜感激。
答案 0 :(得分:0)
请转义查询中的任何特殊字符。就像“ |”为“ \ |”