我试图将视图中的信息加载到配置为文本文件的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语句,我可以处理该信息相应地,并以正确的方式获取表中其他字段的数据。
有人能有更好的选择吗?
答案 0 :(得分:0)
您可以尝试一下吗?由于创建的表具有一个bigint列,并且我们正在尝试插入一个int值,因此抛出此错误
以以下方式插入表1 选择 栏位1 ,field2 ,电子邮件 ,cast(field3为bigint) ,field4 来自v_table2;