从视图中创建存储为textfile的表时出错

dsf9zpds  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(448)

我正在尝试将视图中的信息加载到配置为如下所示的textfile的配置单元表中:

  1. CREATE TABLE table1 (
  2. field1 BIGINT
  3. ,field2 STRING
  4. ,email STRING
  5. ,field3 BIGINT
  6. ,field4 STRING
  7. )
  8. ROW FORMAT DELIMITED
  9. FIELDS TERMINATED BY '\u0001'
  10. LINES TERMINATED BY '\n'
  11. STORED AS TEXTFILE ;

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

  1. insert into table1 as
  2. select
  3. field1
  4. ,field2
  5. ,email
  6. ,field3
  7. ,field4
  8. from v_table2 ;

进程返回success,但当我检查表1上的数据时,select语句返回以下输出:

  1. Error converting column: 4 to BIGINT

当视图中有关于该字段的信息但insert语句不返回任何错误时,该字段的信息返回null。
此外,我可以正确加载第一个bigint字段,但是email字段显示一个“正方形”,之后的bigint字段会给出错误。在检查文件上的数据时,似乎信息在email字段之后发生了变化。
听起来像是编码问题。
已经尝试过这样强制编码,但是没有成功:

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

我还应该提到,从视图加载到table1中的字段在视图从中加载信息的表中已经是bigint了。
有人能帮忙吗?

解决方案

经过一些研究,我设法找到了一个解决方案,方法是使用以下定义创建一个目标表:

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

通过像这样对待“email”字段上的数据:

  1. case
  2. when ascii(email_fe) <> 1
  3. then email_fe
  4. else NULL
  5. end email_fe

对于出现奇怪数据的“email”字段,我检查了ascii代码始终为1,通过检查select语句,我可以相应地处理信息,并获得表中以正确方式插入的其他字段的数据。
有人有更好的选择吗?

nbewdwxp

nbewdwxp1#

你能试试这个吗?由于创建的表有一列bigint,并且我们正在尝试插入一个int值,因此引发此错误
插入到表1中,作为选择字段1、字段2、电子邮件、cast(字段3作为bigint),从vĩu表2中选择字段4;

相关问题