Apache Hive
Apache Hive是一款分布式SQL计算的工具,其主要功能是:
- 将SQL语句翻译成MapReduce程序运行
- 映射关系型数据库中的表和列到HDFS中的文件和字段
- 提供了一种类SQL的查询语言HiveQL,使得用户可以方便地查询存储在Hadoop分布式文件系统(HDFS)中的数据
- 支持多种数据格式,如文本文件、SequenceFile、RCFile等
- 支持数据的分区和索引,以提高查询性能
- 支持数据的存储和计算分离,即数据可以存储在HDFS中,计算可以运行在YARN上
两大主要组件:
- 元数据存储:Hive将元数据存储在关系型数据库中,如MySQL、Derby等。元数据包括表名、列名、数据类型、分区信息等。
- 执行引擎 SQL解析器:Hive将SQL语句翻译成MapReduce程序运行,执行引擎负责将翻译后的程序提交给Hadoop集群执行。
部署
1. 安装MySQL
# 更新密钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
# 安装Mysql yum库
rpm -Uvh http://repo.mysql.com/mysql57-community-release-el7-7.noarch.rpm
# yum安装Mysql
yum -y install mysql-community-server
# 启动Mysql设置开机启动
systemctl start mysqld
systemctl enable mysqld
# 检查Mysql服务状态
systemctl status mysqld
# 第一次启动mysql,会在日志文件中生成root用户的一个随机密码,使用下面命令查看该密码
grep 'temporary password' /var/log/mysqld.log
# 修改root用户密码
/usr/bin/mysqladmin -u root password 'root'
# 或
mysql -u root -p -h localhost
Enter password:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root!@#$';
-- 如果你想设置简单密码,需要降低Mysql的密码安全级别
set global validate_password_policy=LOW; # 密码安全级别低
set global validate_password_length=4; # 密码长度最低4位即可
-- 然后就可以用简单密码了(课程中使用简单密码,为了方便,生产中不要这样)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
grant all privileges on *.* to root@"%" identified by 'root' with grant option;
flush privileges;
2. 配置Hadoop
Hive的运行依赖于Hadoop(HDFS、MapReduce、YARN都依赖)
同时涉及到HDFS文件系统的访问,所以需要配置Hadoop的代理用户
即设置hadoop用户允许代理(模拟)其它用户
配置如下内容在Hadoop的core-site.xml中,并分发到其它节点,且重启HDFS集群
<!-- 表示设置 hadoop 的代理用户-->
<property>
<!--表示代理用户的组所属-->
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<!--表示任意节点使用 hadoop 集群的代理用户 hadoop 都能访问 hdfs 集群-->
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
# 重启HDFS集群
stop-dfs.sh
start-dfs.sh
# 检查HDFS集群状态
hdfs dfsadmin -report
yarn rmadmin -getAllServiceState
kube-40:8033 active
kube-41:8033 standby
hdfs haadmin -getAllServiceState
kube-40:8020 active
kube-41:8020 standby
3. 安装Hive
# 下载Hive
cd /usr/local/src
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
wget https://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
# 解压Hive
tar -zxvf apache-hive-3.1.3-bin.tar.gz
# 设置软链接
ln -s /usr/local/src/apache-hive-3.1.3-bin /usr/local/hive
# 下载mysql jdbc驱动
cd /usr/local/hive/lib
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar
# 授权hadoop用户
chown -R hadoop:hadoop /usr/local/hive
chown -R hadoop:hadoop /usr/local/src/apache-hive-3.1.3-bin
4. 配置Hive
# 在Hive的conf目录内,新建hive-env.sh文件,填入以下环境变量内容:
su - hadoop
vim /usr/local/hive/conf/hive-env.sh
export HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib
# 在Hive的conf目录内,新建hive-site.xml文件,填入以下内容:
vim /usr/local/hive/conf/hive-site.xml
<configuration>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
<property>
<name>hive.cli.encoding</name>
<value>UTF-8</value>
<description>Character-set encoding for various CLI output data such as console output, logs, reports.</description>
</property>
<property>
<name>hive.charset</name>
<value>utf8</value>
<description>The character set encoding to use for data read/write operations.</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://home.vimll.com:33306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>python</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>PyThonFlask@123</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>kube-40</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://kube-40:9083</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- <property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property> -->
</configuration>
5. 初始化Hive
# 初始化Hive所需的元数据库
# 在MySQL中新建数据库:hive
CREATE DATABASE hive CHARSET UTF8;
# 执行元数据库初始化命令:
cd /usr/local/hive/bin
./schematool -initSchema -dbType mysql -verbos
# 初始化成功后,会在MySQL的hive库中新建74张元数据管理的表。 PXC集群存在兼容性问题
6. 启动Hive(使用Hadoop用户)
# 确保Hive文件夹所属为hadoop用户
# 创建一个hive的日志文件夹:
mkdir /usr/local/hive/logs
# 启动元数据管理服务(必须启动,否则无法工作)
# 前台启动:
/usr/local/hive/bin/hive --service metastore
# 后台启动:
nohup /usr/local/hive/bin/hive --service metastore >> /usr/local/hive/logs/metastore.log 2>&1 &
# 启动客户端,二选一(当前先选择Hive Shell方式)
# Hive Shell方式(可以直接写SQL):
/usr/local/hive/bin/hive
# Hive ThriftServer方式(不可直接写SQL,需要外部客户端链接使用):
/usr/local/hive/bin/hive --service hiveserver2
7. 验证Hive
# 首先,确保启动了Metastore服务。
# 执行:
/usr/local/hive/bin/hive
# 进入到Hive Shell环境中,可以直接执行SQL语句。
# 创建表
CREATE TABLE test(id INT, name STRING, gender STRING);
# 插入数据
INSERT INTO test VALUES(1, '王力红', '男'), (2, '周杰轮', '男'), (3, '林志灵', '女');
# 查询数据
SELECT gender, COUNT(*) AS cnt FROM test GROUP BY gender;
# 验证Hive的数据存储
# Hive的数据存储在HDFS的:/user/hive/warehouse中
# 验证SQL语句启动的MapReduce程序
# 打开YARN的WEB UI页面查看任务情况:
http://kube-40:8088
8. HiveServer2 & Beeline
HiveServer2服务
# 在启动Hive的时候,除了必备的Metastore服务外,我们前面提过有2种方式使用Hive:
方式1: /usr/local/hive/bin/hive 即Hive的Shell客户端,可以直接写SQL
方式2: /usr/local/hive/bin/hive --service hiveserver2
# 后台执行脚本:
nohup /usr/local/hive/bin/hive --service hiveserver2 >> /usr/local/hive/logs/hiveserver2.log 2>&1 &
/usr/local/hive/bin/hive --service metastore # 启动的是元数据管理服务
/usr/local/hive/bin/hive --service hiveserver2 # 启动的是HiveServer2服务
# HiveServer2是Hive内置的一个ThriftServer服务,提供Thrift端口供其它客户端链接
# 可以连接ThriftServer的客户端有:
Hive内置的 beeline客户端工具(命令行工具)
第三方的图形化SQL工具,如DataGrip、DBeaver、Navicat等
启动HiveServer2,首先启动metastore服务,然后启动hiveserver2服务
nohup /usr/local/hive/bin/hive --service metastore >> /usr/local/hive/logs/metastore.log 2>&1 &
nohup /usr/local/hive/bin/hive --service hiveserver2 >> /usr/local/hive/logs/hiveserver2.log 2>&1 &
## 验证HiveServer2服务已启动
netstat -lntup |grep 10000
Beeline客户端
# Beeline是Hive内置的一个命令行客户端工具,可以连接HiveServer2服务,执行SQL语句
# Beeline是JDBC的客户端,通过JDBC协议和Hiveserver2服务进行通信,hiveserver2通信地址是:jdbc:hive2://kube-40:10000
# 启动Beeline客户端:
/usr/local/hive/bin/beeline
# 连接HiveServer2服务:
!connect jdbc:hive2://kube-40:10000
# 输入用户名和密码:
Username: hadoop
Password:
# 连接成功后,就可以执行SQL语句了:
show databases;
show tables;
# 或一条命令直接启动
/usr/local/hive/bin/beeline -u jdbc:hive2://kube-40:10000 -n hadoop
9. 第三方客户端
第三方的图形化SQL工具,如DataGrip、DBeaver、Navicat等,都可以通过JDBC协议连接HiveServer2服务
# 需要配置JDBC连接信息:
JDBC URL:jdbc:hive2://kube-40:10000
用户名:hadoop
密码:空
10. 简单认证
apache hive 配置用户密码认证
在Apache Hive中配置用户密码认证通常涉及以下步骤:
使用HiveServer2的hive.server2.authentication配置属性来指定认证方式,如果使用的是PAM(可插拔认证模块)
则需要在Hive服务器上配置相应的PAM服务。
配置Hive元数据存储(通常是MySQL或Derby)以支持用户管理。
创建用户账号并设置密码。
修改Hive客户端的配置文件(如hive-site.xml),包含认证信息。
以下是一个简化的例子,演示如何在Hive中设置用户密码认证:
在hive-site.xml中设置认证方式:
<property>
<name>hive.server2.authentication</name>
<value>PAM</value>
</property>
确保PAM服务已配置并且可以处理Hive的认证请求。
在Hive元数据库中创建用户:
CREATE USER 'username' IDENTIFIED BY 'password';
修改客户端的hive-site.xml配置,包含服务器地址和认证信息:
<property>
<name>hive.metastore.uris</name>
<value>thrift://your_hive_server:9083</value>
</property>
使用beeline或其他客户端连接HiveServer2时,需要提供用户名和密码:
beeline -u "jdbc:hive2://your_hive_server:10000/default;user=username;password=password"
请注意,这只是配置用户密码认证的一个基本框架,具体的配置细节可能会根据Hive的版本和操作系统的不同而有所差异。
在生产环境中,应该采取更为严格的安全措施,例如使用Kerberos认证等。
11. Hive认证kerberos
# 安装kerberos服务器端
# 安装说明:kerberos的服务器只需要安装在一台节点上,其他节点安装kerberos客户端即可!
yum install -y krb5-server krb5-libs krb5-workstation krb5-devel krb5-auth-dialog
# 配置/etc/krb5.conf文件
# 注意:以下的配置文件内容,只需要修改带#注释部分的内容,其他不需要动,可以直接copy!
# 将以下内容配置完成后,还需要将该文件远程发送到集群其他节点对应的/etc/目录下!
vim /etc/krb5.conf
"""
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = HADOOP.COM #HADOOP.COM相当于namespace,可以自己修改
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h #票据的有效时长,可以自行修改
renew_lifetime = 7d #在票据失效后重新刷新的有效时长,可以自行修改
forwardable = true
rdns = false
udp_preference_limit = 1 #配置kerberos使用tcp而不使用udp协议,不配置hadoop集群可能会报错
[realms]
HADOOP.COM = { #这里的HADOOP.COM要跟上面的保持一致
kdc = hadoop01:88 #这里hadoop01是kdc服务器的安装节点的主机名
admin_server = hadoop01:749 #这里hadoop01是kdc服务器的安装节点的主机名,749是通讯端口
default_domain = HADOOP.COM #这里的HADOOP.COM要跟上面的保持一致
}
[domain_realm]
.HADOOP.COM = HADOOP.COM #这里的HADOOP.COM要跟上面的保持一致
HADOOP.COM = HADOOP.COM #这里的HADOOP.COM要跟上面的保持一致
"""
# 配置 /var/kerberos/krb5kdc/kdc.conf 文件
# 注意:以下的配置文件内容,只需要修改带#注释部分的内容,其他不需要动,可以直接copy!
vim /var/kerberos/krb5kdc/kdc.conf
"""
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.COM = { #HADOOP.COM必须跟/etc/krb5.conf中的realms保持一致
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
max_life = 24h 0m 0s
max_renewable_life = 7d
max_life = 1d
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
"""
# 配置/var/kerberos/krb5kdc/kadm5.acl文件
vim /var/kerberos/krb5kdc/kadm5.acl
"""
###############################################################################
#Kerberos_principal permissions [target_principal] [restrictions]
###############################################################################
*/admin@HADOOP.COM * #将原有的EXAMPLE.COM改为跟前两个配置文件中的realms保持一致
"""
# 为了能够不直接访问 KDC 控制台而从 Kerberos 数据库添加或删除主体,请对 Kerberos 管理服务器指示允许哪些主体执行哪些操作。通过编辑文件 /var/kerberos/krb5kdc/kadm5.acl 完成此操作,ACL(访问控制列表)允许您精确指定特权。
# 添加kerberos默认的AES-256加密算法所需的jdk对应版本的jar包到$JAVA_HOME/jre/lib/security目录下
# 对于使用 centos5. 6及以上的系统,默认使用 AES-256 来加密的。这就需要集群中的所有节点上安装JDK,并且下载对应JDK版本的JCE包补丁
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
https://www.oracle.com/technetwork/java/embedded/embedded-se/downloads/jce-7-download-432124.html
https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
# 下载的文件是一个 zip 包,解压后将里面的两个文件放到下面的目录中:$JAVA_HOME/jre/lib/security下
# 创建生成kerberos的KDC数据库文件
# 执行初始化数据库命令。其中 -r 指定对应 realm
kdb5_util create -r HADOOP.COM –s
# 注意:该命令会提示输入两次数据库密码,执行结束后会在 /var/kerberos/krb5kdc/目录下创建 principal 数据库,如果遇到数据库已经存在的提示,可以把 /var/kerberos/krb5kdc/ 目录下的 principal 的相关文件都删除掉,再次执行该命令即可。
# 启动kerberos服务
#启动krb5kdc服务
systemctl start krb5kdc
#启动kadmin服务
systemctl start kadmin
#启动完成后可以使用该命令查看kerberos服务是否启动正常
systemctl status krb5kdc kadmin
# 安装kerberos客户端
# 除了安装kerberos服务器端所在节点外的其他节点上都必须执行下面的命令,安装kerberos客户端!
#安装kerberos客户端
yum install -y krb5-devel krb5-workstation krb5-client
# 测试kerberos安装是否成功
##### 在kerberos的KDC安装节点执行新增管理员命令 #####
#手动输入两次密码,这里hadoop是新增的管理员名称,admin是管理员
kadmin.local -q "addprinc hadoop/admin"
#也可以不用手动输入密码,这里的两次root为密码
echo -e "root\nroot" | kadmin.local -q "addprinc hadoop/admin"
#####在kerberos任意客户端节点执行初始化及登录命令######
#在客户端进行管理员认证
kinit hadoop/admin
#认证完成后,登录KDC管理员账号
kadmin
# kerberos常用命令
klist # 查看当前生成的票据
kinit –R # 更新ticket
kdestroy # 销毁当前的ticket
kadmin.local -q "list_principals" # 列出Kerberos中的所有认证用户
kadmin.local -q "addprinc user1" # 添加认证用户,需要输入密码
kadmin.local -q "delprinc user1" # 删除认证用户
kinit user_name/admin@EXAMPLE.COM # 初始化证书
kinit user1 # 使用该用户登录,获取身份认证,需要输入密码
kpasswd admin_user_name/admin #修改管理员用户密码
Hive配置
# 修改hive-site.xml文件
"""
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
</property>
<property>
<name>hive.server2.authentication</name>
<value>KERBEROS</value>
</property>
<property>
<name>hive.server2.authentication.kerberos.principal</name>
<value>hive/_HOST@HADOOP.COM</value>
</property>
<property>
<name>hive.server2.authentication.kerberos.keytab</name>
<value>/etc/hive/conf/hive.keytab</value>
</property>
"""
# 创建Hive用户并赋予权限
# 在Kerberos中,你需要为每个Hive用户创建一个Principal。这可以通过kadmin工具完成:
kadmin.local -q "addprinc -randkey hive"
# 使用此命令创建一个名为hive的Principal,并为其生成一个随机密钥。
# 生成的keytab需要保存到指定路径:
kadmin.local -q "ktadd -k /etc/security/keytabs/hive.keytab hive"
# 该命令将hive Principal的密钥添加到指定的keytab文件中。
#测试Hive的Kerberos认证
# 要测试你的配置,首先确保所有服务正在运行,接着使用beeline连接Hive。使用以下命令:
beeline -u "jdbc:hive2://<HIVE_SERVER_FQDN>:10000/default;principal=hive/_HOST@EXAMPLE.COM"
# 这里,将<HIVE_SERVER_FQDN>替换为Hive服务器的全名。
各类问题汇总
中文乱码-解决办法-现有环境
中文乱码
对于Hive Metadata已经在数据库创建好的情况下,按照如下步骤检查修改
此修改仅对后续hive table创建产生作用
修改Hive Metadata数据库中相关字段字符集为utf8
-- 修改表字段注解和表注解
alter table hive.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table hive.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
-- 修改分区字段注解
alter table hive.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8 ;
alter table hive.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
-- 修改索引注解
alter table hive.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
mysql中验证:
select table_schema, table_name, TABLE_COLLATION, CREATE_OPTIONS, TABLE_COMMENT from information_schema.tables where TABLE_SCHEMA='hive';
select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME,DATA_TYPE,COLUMN_TYPE,CHARACTER_SET_NAME,COLLATION_NAME from COLUMNS where TABLE_SCHEMA='hive' and table_name ='COLUMNS_V2';
-- 更新hive-site.xml
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
<property>
<name>hive.cli.encoding</name>
<value>UTF-8</value>
<description>Character-set encoding for various CLI output data such as console output, logs, reports.</description>
</property>
<property>
<name>hive.charset</name>
<value>utf8</value>
<description>The character set encoding to use for data read/write operations.</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://IP:3306/db_name? createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
中文乱码-解决办法-待建环境
vi /etc/my.cnf
character_set_server=utf8
systemctl restart mysqld
# 修改Hive Mysql metadata SQL脚本中的字符集
>find $HIVE_HOME -name "*mysql*.sql"
./scripts/metastore/upgrade/mysql/hive-schema-1.2.0.mysql.sql
./scripts/metastore/upgrade/mysql/hive-txn-schema-0.14.0.mysql.sql
# 修改脚本中的字符集
DEFAULT CHARSET=latin1 -> DEFAULT CHARSET=utf8
CHARACTER SET latin1 COLLATE latin1_bin -> CHARACTER SET utf8 COLLATE utf8_bin
# 更新hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://IP:3306/db_name? createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value><description>JDBC connect string for a JDBC metastore</description>
</property>
# 创建hive metadata
$HIVE_HOME/bin/schematool -dbType mysql -initSchema
Hive表数据乱码
# 问题与解决
# hive默认的表的编码是UTF-8,要支持其他编码的数据,可以使用如下两种方式
# 原始文件转为UTF-8再load到表中 [推荐做法]
iconv -f gbk -t utf-8 /home/hadoop/hive/test-data.gbk.txt > /home/hadoop/hive/test-data.gbk-utf8.txt
# Hive表属性serialization.encoding修改再load到表中 [不推荐]
这个是表级别的修改,会导致表中已有数据出现乱码
hive> ALTER TABLE test SET SERDEPROPERTIES('serialization.encoding'='GBK');
#### Hive表字段数据类型
hive —— 数据类型
详细请看
hive官方手册:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-TimestampstimestampTimestamps
hive的数据类型有五大类型:
primitive_type :原始类型
array_type :数组
map_type :map
struct_type :结构体
union_type :联合体
一、primitive_type原始类型
以下是hive的原始数据类型及格式
类型 描述 示例
TINYINT 一字节整数, -128 ~ 127 12
SMALLINT 二字节整数,-32768 ~ 32767 255
INT/INTEGER 4字节整数 -2,147,483,648 ~ 2,147,483,647 2555
BIGINT 4字节整数,-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 -250 000 000 000
FLOAT 4字节单精度小数 3.1415
DOUBLE 8字节双精度小数 3.141529
DECIMAL 任意数字 10
STRING 字符串 “abc”
VARCHAR 字符串,字符串长度只能为1~65355 “abc”
CHAR 字符串,字符串长度只能为1~255 “abc”
TIMESTAMP 时间戳,格式为yyyy-mm-dd HH:mm:ss 2019-2-28 13:25:25
DATE 日期,格式为yyyy-mm-dd 2019-2-28
BOOLEAN 布尔类型 TRUE/FALSE
BINARY 字节序列
DECIMAL
这里我们对DECIMAL类型做两点说明:
1)DECIMAL(9,8)代表最多9位数字,后8位是小数。此时也就是说,小数点前最多有1位数字,如果超过一位则会变成null。
2)如果不指定参数,那么默认是DECIMAL(10,0),即没有小数位,此时0.82会变成1。
Hive实现delete、update操作
-- 行级别delete、update
• 只支持ORC存储格式
• 表必须分桶
• 更新指定配置文件
-- 1.创建ORC存储格式、且分桶的表
CREATE TABLE table_name (
id int,
name string
)CLUSTERED BY (id) INTO 2 BUCKETS STORED AS ORC
TBLPROPERTIES ("transactional"="true");
--transactional:交易型的;事务性的;事务处理的
-- 2.修改添加hive中的hive-site.xml配置文件
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
<property>
<name>hive.enforce.bucketing</name>
<value>true</value>
</property>
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>nonstrict</value>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
<name>hive.compactor.initiator.on</name>
<value>true</value>
</property>
-- 批量级delete、update
-- 分区表
-- delete 操作 就是删除指定分区
alter table drop if exists partition(xxx);
-- update 操作 就是先删除再加载
insert overwrite table xxx partition(xxx);
--或者
load data inpath 'xxx' overwrite into table partition(xxx);
-- 非分区表
-- delete 操作 将除了“条件”外的数据覆盖本表
insert overwrite table xxx select * from xxx where dt != '20221010';
-- update 操作 依旧是先执行上述的删除操作再进行插入操作
insert overwrite table xxx select * from xxx where dt != '20221010';
insert into table xxx values(......);
--或者
load data inpath into table xxx;