我正在尝试将视图中的信息加载到配置为如下所示的textfile的配置单元表中:
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
,field3
,field4
from v_table2 ;
进程返回success,但当我检查表1上的数据时,select语句返回以下输出:
Error converting column: 4 to BIGINT
当视图中有关于该字段的信息但insert语句不返回任何错误时,该字段的信息返回null。
此外,我可以正确加载第一个bigint字段,但是email字段显示一个“正方形”,之后的bigint字段会给出错误。在检查文件上的数据时,似乎信息在email字段之后发生了变化。
听起来像是编码问题。
已经尝试过这样强制编码,但是没有成功:
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
通过像这样对待“email”字段上的数据:
case
when ascii(email_fe) <> 1
then email_fe
else NULL
end email_fe
对于出现奇怪数据的“email”字段,我检查了ascii代码始终为1,通过检查select语句,我可以相应地处理信息,并获得表中以正确方式插入的其他字段的数据。
有人有更好的选择吗?
1条答案
按热度按时间nbewdwxp1#
你能试试这个吗?由于创建的表有一列bigint,并且我们正在尝试插入一个int值,因此引发此错误
插入到表1中,作为选择字段1、字段2、电子邮件、cast(字段3作为bigint),从vĩu表2中选择字段4;