hive 指定字段插入数据_Hive insert 字段表错位踩坑

1 问题描述

往 Hive 表 insert 数据后,查询时出现个别行字段错位,插入语句如下:

insert overwrite table A select col1,col2,col3 from table B where dayid = '';

首先测试源表数据查询:

select col1,col2,col3 from B

查询来的数据没发现有什么异常;照理说逐字段查出来没问题,再逐字段插入应该不会错位。实际上 hive 的 insert 跟想象中传统的 insert 不太一样。

2 排查过程

由于不是全表错位,而是个别行错位,首先根据关键字查询 hive 错位那行数据,导出文本到本地。肉眼查看发现有部分"乱码"(异常字符: ^M,如果经验丰富一眼就能看出这个是 \001,vim 下可以通过组合键 ctrl + a 输出),怀疑是异常字符导致,通过 linux od 命令查看 16 进制编码,如图所示:有好几个 \001 ,多么眼熟的数字啊 - 这是 hive 默认字段分隔符。

image.png

一般 insert A from select B 我们没有关注 A 表的字段分隔符,看到 \001 直觉跟 A 表的字段分隔符有关:

查看 A 的表结构,字段分隔符默认的 \001。存储类型:textfile。

进一步分析:textfile 是 hive 默认的存储结构,行存储,存储的实际数据结构跟表逻辑结构一致。导入数据时会直接把数据文件拷贝到

你可能感兴趣的:(hive,指定字段插入数据)