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



我正在尝试将信息从视图加载到存储为文本文件的 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 ;

该过程返回成功,但是当我检查表1上的数据时,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,并通过在选择语句上检查,我可以相应地处理信息,并在表格中获取数据以正确的方式插入其他字段。

有人有更好的选择吗?

你能试一试吗?抛出此错误是因为创建的表有一列 bigint,并且我们正在尝试插入一个 int 值

插入表 1 作为 选择 字段1 ,字段2 电子邮件 ,cast(field3 as bigint) ,字段4 从v_table2 ;

相关内容

  • 没有找到相关文章

最新更新