从视图创建表存储为文本文件时出错

时间:2019-03-26 17:09:55

标签: hadoop hive cloudera-cdh

我试图将视图中的信息加载到配置为文本文件的Hive表中,配置如下:

CREATE TABLE table1 (
field1 BIGINT
,field2 STRING
,email STRING
,field3 BIGINT
,field4 STRING
) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\u0001' 
LINES TERMINATED BY '\n'
STORED AS TEXTFILE ;

问题是创建表后,我从视图中插入了信息,如下所示:

insert into table1 as 
select 
field1 
,field2 
,email 
,field3 
,field4 
from v_table2 ;

该过程返回成功,但是当我检查table1上的数据时,select语句返回以下输出:

Error converting column: 4 to BIGINT

当视图上有该字段的信息,但insert语句未返回任何错误时,该字段的信息将返回Null。

此外,我可以正确加载第一个BIGINT字段,但是电子邮件字段显示一个“正方形”,之后的BIGINT字段将显示该错误。 检查文件中的数据后,似乎电子邮件字段之后的信息发生了变化。

听起来像一些编码问题。

已经尝试强制这样的编码,但是不走运:

ALTER TABLE table1 SET SERDEPROPERTIES('serialization.format'='\u0001', 'serialization.encoding'='windows-1252');

我还应该提到,正在从视图加载到table1中的字段已经是视图从中加载信息的表中的BIGINT。

任何人都可以帮忙吗?


解决方案

经过一番研究,我设法通过创建具有以下定义的目标表来找到解决方案:

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ('separatorChar'='\u0001', 'quoteChar'="'", 'escapeChar' = '\\')
STORED AS TEXTFILE 

并通过如下方式处理“电子邮件”字段中的数据:

case 
    when ascii(email_fe) <> 1 
    then email_fe 
    else NULL 
end email_fe

对于出现奇怪数据的“电子邮件”字段,我检查了 ascii 代码始终为 1 ,并且通过检查select语句,我可以处理该信息相应地,并以正确的方式获取表中其他字段的数据。

有人能有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试一下吗?由于创建的表具有一个bigint列,并且我们正在尝试插入一个int值,因此抛出此错误

以以下方式插入表1 选择 栏位1 ,field2 ,电子邮件 ,cast(field3为bigint) ,field4 来自v_table2;