hadoop fs -put/-mv等方式直接将数据移动到表文件夹下;但Hive推荐使用Load指令

我们把指令打到Hive的服务器上,Hive执行携带LOCAL的指令,filepath就是从Hive的服务器找,而不是从自己电脑本地找

如果使用了OVERWRITE关键字,则目标表(或者分区)中的已经存在的数据会被删除,然后再将file写入
例如:如果Android和IOS两个日志表都是按day分区,中间表也按day分区,那么需要再针对source进行静态分区,防止二者互相overwrite
into就是追加,但可能出现“写入中断导致的数据重复”等问题。因此一般都是用overwrite
主要是对LOAD加载时,把多余的字段用于匹配分区
本来加载的时候没有指定分区,语句是报错的,但是文件的格式符合表的结构,前两个是col1,col2,最后一个是分区字段col3,则此时会将load语句转换成为insert as select语句。

静态insert:
insert into table da_luna.tmp_withtest partition(day_partition = '2022-11-13') values(123,'2022-11-12')
官方推荐:把数据清洗为结构化文件,然后通过load加载到表中

注意区分与“with中间表”的区别
上面的用load指令加载数据永远都是只能把partition写死(静态分区)
而通过insert + select ,每行的最后多余的字段就 按顺序 动态映射分区
set hive.exec.dynamic.partition=true; set hive.mapred.mode=nonstrict;这里可选strict(严格模式,必须指定至少一个静态分区,防止用户意外覆盖所有分区),也可以选择nonstrict允许所有分区都是动态的hadoop fs -put,并且是一个overwrite操作,因此需要考虑分区情况(指定到分区上的路径)和覆盖的情况


TBLPROPERTIES ('transactional' = 'true');的才能在update、delete操作时产生delta表和delete_delta表Error while compiling statement: FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.需要设置set和TBLPROPERTIES变量
--Hive中事务表的创建使用
--1、开启事务配置(可以使用set设置当前session生效 也可以配置在hive-site.xml中)
set hive.support.concurrency = true; --Hive是否支持并发
set hive.enforce.bucketing = true; --从Hive2.0开始不再需要 是否开启分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; --动态分区模式 非严格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; --
set hive.compactor.initiator.on = true; --是否在Metastore实例上运行启动压缩合并
set hive.compactor.worker.threads = 1; --在此metastore实例上运行多少个压缩程序工作线程。
--事务表的创建
CREATE TABLE emp (id int, name string, salary int)
STORED AS ORC TBLPROPERTIES ('transactional' = 'true');

虽然Hive面向分析,HDFS不支持随机修改文件,但总有一些情况需要对某一行数据进行修改,总不可能每次都重写一遍文件吧,如下场景:




