hive 指定字段插入数据_Hive通过查询语句向表中插入数据注意事项

在使用Hive 0.13.1版本时,遇到通过查询语句向表中插入数据的一些问题,包括INSERT OVERWRITE的歧义、FROM ... INSERT ... SELECT的歧义和存在的bug。例如,INSERT INTO可能导致追加而非覆盖数据,而INSERT OVERWRITE在某些情况下可能不按预期工作。解决这些问题需要理解Hive的读时模式和宽松语法特性,以及注意在插入时明确指定字段。
摘要由CSDN通过智能技术生成

最近在学习使用Hive(版本0.13.1)的过程中,发现了一些坑,它们或许是Hive提倡的比关系数据库更加自由的体现(同时引来一些问题),或许是一些bug。总而言之,这些都需要使用Hive的开发人员额外注意。本文旨在列举我发现的3个通过查询语句向表中插入数据过程中的问题,希望大家注意。

为了验证接下来出现的问题,需要先准备两张表employees和staged_employees,并准备好测试数据。首先使用以下语句创建表employees:

create table employees (

id int comment 'id',

name string comment 'name')

partitioned by (country string, state string)

row format delimited fields terminated by ',';

employees的结构比较简单,有id、name、country、state四个字段,其中country和state都是分区字段。特别需要提醒的是这里显示的给行格式指定了字段分隔符为逗号,因为默认的字段分隔符\001不便于笔者准备数据。然后创建表staged_employees:

create table staged_employees (

id int comment 'id',

user_name string comment 'user name')

partitioned by (cnty string, st string);

staged_employees也有4个字段,除了字段名不同之外,和employees的4个字段的含义是相同的。

我们首先使用以下语句给employees的country等于US,state等于CA的分区加载一些数据:

load data local inpath '${env:HOME}/test.txt'

into table employees

partition (country = 'US', state = 'CA');

再给employees的country等于CN,state等于BJ的分区加载一些数据:

load data local inpath '${env:HOME}/test2.txt'

overwrite into table employees

partition (country = 'CN', state = 'BJ');

以上语句的执行过程如图1所示。

图1给employees加载数据

最后我们看看employees中准备好的数据,如图2所示。

图2employees中准备好的数据

INSERT OVERWRITE的歧义

由于staged_employees中还没有数据,所以我们查询employees的数据,并插入staged_employees中:

insert overwrite table staged_employees

partition (cnty = 'US', st = 'CA')

select * from employees e

where e.country = 'US' and e.state = 'CA';

大家看看这条sql有没有问题?最终的执行结果如图3所示。

图3SemanticException [Error 10044

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值