【发布时间】:2018-11-16 01:54:18
【问题描述】:
我正在进行从 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 gives error,并查看了留下问题的 cmets。我们决定删除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