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