Insert Data Into Hive

本文详细介绍了在Hive中插入数据的各种方式,包括LOAD DATA命令从本地和HDFS加载数据,以及INSERT INTO/OVERWRITE语句用于批量插入。Hive不支持单条数据的INSERT, UPDATE, DELETE操作。文中还提到了如何在Mybatis中使用这些语句,并通过示例展示了如何处理不同数据类型和分区。此外,还讨论了曲线实现INSERT INTO单条数据插入的方法。

序言

通过前面Hive的搭建,包括我们整合Mybatis和Hive.发现一个问题即:即传统的insert 不能执行

所以这里整理下往Hive插入数据的几种形式,同时这些语句也可以在Mybatis中使用.

Hive不支持INSERT INTO, UPDATE, DELETE针对单条数据的操作.cuiyaonan2000@163.com

Load

加载本地文件到Hive中

#创建Hive表
hive> create table db_hive.student(cui string ,yao string ,nan string)  row format delimited fields terminated '\t';


#load本地文件到Hive的数据库db_hive的student表中
hive> load data local inpath '/soft/hive/apache-hive-3.1.2-bin/bin/datatest' into table db_hive.student;

它的语法格式为:

LOAD  DATA  [LOCAL] INPATH 'filepath'  [OVERWRITE]  INTO  TABLE  tablename
 [PARTITION (partcol1=val1, partcol2=val2 ...)]  

说明:

  • local:  可选项,标识从本地加载而非Hdfs中加载.
  • overwrite:  可选.先删除原来数据,然后再加载
  • partition: 这里是指将inpath中的所有数据加载到那个分区,并不会判断待加载的数据中每一条记录属于哪个分区。----如果制定了就是固定了分区信息.cuiyaonan2000@163.com
  • 注意:load完了之后,会自动把INPATH下面的源数据删掉,其实就是将INPATH下面的数据移动到/usr/hive/warehouse目录下了。
  • 分区加载示例:load data inpath '/tmp/test.txt' into table score partition (school="school1",class="class1") 

Load From Hdfs

这里跟上面读取本地文件到hive的不同点就是文件是放在HDFS上的.那实现其实也很简单,即(去掉loca可选项,表示不是从本地上传):

#创建Hive表
hive> create table db_hive.student(cui string ,yao string ,nan string) row format delimited fields terminated by '\t';


#load hdfs中的文件到Hive的数据库db_hive的student表中
hive> load data inpath '/soft/hive/apache-hive-3.1.2-bin/bin/datatest' into table db_hive.student;

Insert Data

这里说明下:insert into 跟传统关系型数据库的 插入是不一样的.这里是只能针对整张表的内容数据插入.
 

例如:


//如下的是动态创建分区.当然也可以指定 country和 state为静态值

hive>insert into table test_partition_table partition(country,state) select name,age,country,state from t1;


//静态分区的设置举例
hive>insert into table test_partition_tablepartition partition(country = 'US',state) select name,age,country,state from t1;

语法如下:

INSERT INTO|OVERWRITE TABLE 表明 [PARTITION (partcol1=val1, partcol2=val2 ...)] 
select 字段1,字段2,字段3 FROM frometable1,fromtable2..

Insert Data When Create Table

#如下的创建表是不可以复制cuiyaonan2000_table中的分区.
hive> create table test_table as  select id, name, tel from cuiyaonan2000_table;


#如下的创建表是可以复制cuiyaonan2000_table中的分区.
hive> create table test_table like cuiyaonan2000_table;

曲线实现Insert into

举例感觉没问题~~~:

# 通过 select 语句构造出 array 类型
select array('cuiyaonan','2000','@163.com') ;

# 转储 array 类型数据
insert into employee(name,work_place) select 'tom',array('cuiyaonan2000@163.com','sichuan','chengdu');

# 通过 select 语句构造出 map 类型
select map('bigdata',100);

# 转储 map 类型数据
insert into employee(name,score) select 'tomas', map('bigdata',100);


# 通过 select 语句构造出 struct 类型
select struct('male',10);
select named_struct('sex','male','age',10);

# 转储 struct 类型数据
insert into employee(name,sex_age) select 'tomson',named_struct('sex','male','age',10);


#特别说明针对有分区的表是可以直接使用insert into 来插入一条数据的cuiyaonan2000@163.com
insert into test_partition_table  partition(provice = 'hebei', city = 'shijiazhuang') values('tomslee',26);

Hive中,`INSERT OVERWRITE INTO TABLE` 语句用于将查询结果覆盖写入到目标表中。如果目标表已经存在数据,则这些数据会被新插入的数据替换[^2]。 ### 基本语法 ```sql INSERT OVERWRITE INTO TABLE table_name [PARTITION (partition_spec)] SELECT ... FROM source_table; ``` - `table_name` 是要插入数据的目标表名称。 - `PARTITION (partition_spec)`(可选)表示目标表的分区字段及值。 - `SELECT ... FROM source_table` 是从源表中选择要插入的数据。 ### 示例 #### 示例1:覆盖插入非分区表 假设有一个非分区表 `user_data`,可以使用以下语句将去重后的数据覆盖插入到该表中: ```sql INSERT OVERWRITE TABLE user_data SELECT MAX(user_id), user_name, user_email FROM user_data GROUP BY user_name, user_email; ``` 此操作会根据 `user_name` 和 `user_email` 合并相同记录,并保留每组中 `user_id` 最大的记录[^2]。 #### 示例2:覆盖插入分区表 假设有一个按 `insert_date` 分区的表 `db1.table1`,可以通过如下方式将数据插入指定分区: ```sql INSERT OVERWRITE TABLE db1.table1 PARTITION (insert_date = '2023-10-01') SELECT a.id, a.code, b.sell AS pred_sell FROM db1.table1 a JOIN db1.table2 b ON a.id = b.id AND a.code = b.code; ``` 在此示例中,数据会被插入到 `insert_date = '2023-10-01'` 的分区中[^3]。 #### 示例3:动态分区插入 如果希望根据某些字段动态决定插入哪个分区,可以启用 Hive 的动态分区功能: ```sql SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; INSERT OVERWRITE TABLE db1.table1 PARTITION (insert_date) SELECT a.id, a.code, b.sell AS pred_sell, a.insert_date FROM db1.table1 a JOIN db1.table2 b ON a.id = b.id AND a.code = b.code; ``` 上述语句会根据 `a.insert_date` 的不同值自动分配到不同的分区中[^3]。 ### 注意事项 - **性能优化**:在处理大规模数据时,建议合理设置分区数量和动态分区参数以避免性能瓶颈[^3]。 - **数据一致性**:由于 `INSERT OVERWRITE` 会清除已有数据,因此在执行前应确保目标表中的数据可以被安全覆盖。 - **分区管理**:对于分区表,务必确认分区字段的正确性以及是否启用了动态分区功能[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cuiyaonan2000

给包烟抽吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值