Hive 一些操作记录

1.创建

//创建数据库
create database database_name

//创建表 列按‘,’分割
create table table_name(id int,name string) row format delimited fields terminated by ','

//创建分区表 列按‘,’分割 按bt和country分区
//create external table if not exists 判断表是否存在
create external table if not exists table_name(id int,name string)
partitioned by (dt String,country string)
row format delimited fields terminated by ','

//添加分区
alter table table_name add if not exists partition (dt='xxx',country 
='xxx')

2.查看

//查询所有数据库
show databases

//查询所有表
show tables

//查看表结构
desc formatted table_name

hbase映射表

3.加载数据

//local关键字 没有local关键字,则加载hdfs上的文件 有local关键字,则加载本地文件 
//overwrite关键字 覆盖数据(清空原数据)
//分区表,则加上partition分区
load data [local] inpath 'filepath' [overwrite] into table table_name [partition(part=val,part2=val2)]

//加载hdfs数据
load data inpath '/hdfsPath' into table table_name

//加载本地数据
load data load inpath '/path' into table table_name

4.查询

select * from table_name

//查询分区表 where 后面加分区条件,这样做是不会扫描全表 只会查询该分区
select * from table_name where dt='xxx'

5.删除,清空

//删除数据库
DROP DATABASE if EXISTS table_name

//删除表 
DROP TABLE if EXISTS table_name

//清空分区表 表结构还在,只清空数据
ALTER TABLE table_name DROP IF EXISTS PARTITION (dt='2018-08',country='CH')

6.重命名

//重命名表名
ALTER TABLE table_name_old RENAME TO table_name_new

//重命名列名
ALTER TABLE table_name CHANGE col_old_name col_new_name STRING;

7.导出文件

//导出文件到hdfs上 按照‘,’分割 
//overwrite关键字 会覆盖目录下的原数据
INSERT OVERWRITE directory '/hdfsPath' row format delimited fields terminated by ','  SELECT * from table_name

8.无效ID在关联时的数据倾斜问题

  • 解决方法:函数过滤 null

把空值的id变成一个字符串加上随机数,就能把倾斜的数据分到不同的Reduce上,从而解决数据倾斜问题。因为空值不参与关联,即使分到不同 的 Reduce 上,也不会影响最终的结果。

SELECT * FROM tableName1 a LEFT OUTER 
JOIN tableName2 b ON 
CASE WHEN a.id IS NULL THEN CONCAT('hive_temp_id',RAND()) ELSE a.id END =b.user_id;

9.Hive不允许直接访问非group by字段

  • 对于非group by字段,可以使用collect_set函数收集这些字段,返回一个数组;
SELECT a,b FROM tableName GROUP BY a	//Expression not in GROUP BY key 'b'

SELECT a,collect_set(b) FROM tableName GROUP BY a	//正确的使用方式
  • collect_set函数的其他用法:

使用数字下标,可以直接访问数组中的元素

10.控制map和reduce数量

  • 控制map
set mapred.max.split.size=256000000;   //每个Map处理的最大输入文件大小(256MB)
set mapred.min.split.size.per.node=1;  //节点上split文件的最小值
set mapred.min.split.size.per.rack=1;  //机架上split文件的最小值
  • 控制reduce
//方法一
set mapred.reduce.tasks=10;  //设置reduce的数量
//方法二
set hive.exec.reducers.bytes.per.reducer=1073741824 //每个reduce处理的数据量,默认1GB

10.hive join 优化的方式

  • map join
set hive.auto.convert.join=true //自动MAPJOIN转换操作(common join转换为map join

12.合并小文件

 hive.merge.mapfiles = true	//和并 Map 输出文件,默认为 True
 hive.merge.mapredfiles = false //合并 Reduce 输出文件,默认为 False
 hive.merge.size.per.task = 256*1000*1000 //合并文件的大小。

13.并行执行优化

set hive.exec.parallel=true; //开启任务并行执行
set hive.exec.parallel.thread.number=8; //同一个sql允许并行任务的最大线程数
set hive.groupby.skewindata=true; //设置数据负载均衡,防止数据倾斜
set hive.ignore.mapjoin.hint=false;	//不忽略MAPJOIN标记
set mapred.reduce.tasks=15;	//设置reduce的数量
set hive.exec.reducers.max=200;	//reduce最大数量(默认999)
set hive.auto.convert.join=false;	//自动MAPJOIN转换操作(common join转换为map join)
set hive.exec.compress.intermediate=true; //hive的压缩设置,中间结果压缩  
set hive.map.aggr = true;	//map中做部分聚集操作(默认true)
set hive.execution.engine=tez;	//更改hive底层执行的计算框架                        

填坑中

<think>嗯,用户问的是Hive的更新操作。首先我得回想Hive的基本特性。Hive主要是用于大数据处理的,基于Hadoop的数据仓工具,它通常用来处理批量数据,所以传统上Hive是不支持事务的,也就是不支持ACID特性里的更新和删除操作。不过可能用户在使用较新版本的Hive,比如Hive 0.14之后,因为从那个版本开始,Hive开始支持事务,允许行级的更新和删除。 接下来要考虑用户的具体情况。用户可能需要执行更新操作,但可能不知道需要满足哪些条件。比如,Hive表需要是ACID兼容的,存储格式必须是ORC,而且表属性需要设置transactional=true。这时候需要详细说明这些前提条件,避免用户在没有配置的情况下尝试更新而失败。 然后,需要给出具体的更新语法,比如使用UPDATE语句,并举例说明。例如,如何更新一个员工表的部门字段。同时,可能需要提到MERGE INTO语句,这在Hive 2.2之后支持,可以处理更复杂的更新逻辑,比如根据条件合并数据。 用户可能遇到的问题包括表配置不正确,或者没有启用事务支持,还有性能方面的考虑,因为Hive的更新操作可能不如传统关系型数据高效,特别是在大数据量时。这时候需要提醒用户注意这些限制,并建议在小批量数据或必要时使用更新,或者考虑其他工具如HBase或Kudu。 另外,用户可能对Hive的更新机制不太了解,需要解释背后的原理,比如使用事务管理器、增量文件和压缩过程。这有助于用户理解为什么需要特定的配置和存储格式。 最后,总结适用的场景和限制,帮助用户判断是否适合使用Hive进行更新操作,或者是否需要其他解决方案。确保回答结构清晰,分步骤说明前提条件、语法、示例和注意事项,这样用户能一步步理解和操作。</think>Hive的更新操作与传统关系型数据有显著差异,以下是分步详解: 1. **Hive更新操作的前提条件** - 必须使用Hive 0.14及以上版本 - 表必须是ACID兼容表(Transactional Table) - 存储格式必须为ORC(Optimized Row Columnar) - 建表时需要设置表属性: ```sql CREATE TABLE employee ( id INT, name STRING, dept STRING ) STORED AS ORC TBLPROPERTIES ('transactional'='true'); ``` 2. **更新操作语法** ```sql UPDATE table_name SET column = value [, column = value ...] [WHERE condition]; ``` 3. **具体示例** ```sql -- 将部门为'Sales'的员工改为'Marketing' UPDATE employee SET dept = 'Marketing' WHERE dept = 'Sales'; ``` 4. **MERGE INTO操作Hive 2.2+)** ```sql MERGE INTO target_table AS T USING source_table AS S ON T.id = S.id WHEN MATCHED AND S.dept = 'IT' THEN UPDATE SET T.salary = S.salary * 1.1 WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (S.id, S.name, S.dept); ``` 5. **实现原理** - 通过事务管理器记录修改 - 使用增量文件(delta files)记录变更 - 定期执行`COMPACT`操作合并文件 - 需要配置`hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager` 6. **注意事项** - 更新操作效率低于传统数据,适合低频操作 - 每次更新会产生新的delta文件,需定期维护 - 必须启用Hive LLAP(Live Long and Process)或Tez执行引擎 - 需要配置Hive元数据存储(Metastore)支持事务 7. **适用场景** - 缓慢变化维度(SCD)数据维护 - GDPR数据删除请求 - 数据修正(如ETL错误修复) - 需要ACID特性的实时分析场景 8. **性能优化建议** - 控制事务粒度:`SET hive.txn.max.open.batch=1000;` - 定期合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值