Skip to content

Hive 学习笔记

Hive是构建在HDFS上的一个数据仓库

安装与配置

  1. 解压hive安装包
  2. 配置环境变量

~/.bashrc文件中添加

shell
export HIVE_HOME=/home/hadoop/module/hive
export PATH=$HIVE_HOME/bin:$PATH
  1. 配置conf/hive-site.xml

添加以下配置项

xml
  <!-- JDBC URL -->
  <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://localhost:3306/hive?useSSL=false</value>
  </property>
  <!-- JDBC 驱动 -->
  <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <value>com.mysql.cj.jdbc.Driver</value>
  </property>
  <!-- JDBC 用户名 -->
  <property>
      <name>javax.jdo.option.ConnectionUserName</name>
      <value>root</value>
  </property>
  <!-- JDBC 密码 -->
  <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>73748156</value>
  </property>
  1. 将MySQL驱动拷贝到lib文件夹下,再进行初始化:
shell
schematool -dbType mysql -initSchema
  1. 在MySQL中创建数据库hive
sql
CREATE DATABASE hive
  1. 输入命令启动hive
shell
hive

image-20220830151641181

Hive配置远程连接

修改hadoop集群配置文件

  1. 修改 $HADOOP_HOME/etc/hadoop/core-site.xml
shell
vim $HADOOP_HOME/etc/hadoop/core-site.xml

添加下列配置项

xml
    <property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
    </property>

    <property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
    </property>

保存后退出即可

  1. 修改$HIVE_HOME/conf/hive-site.xml
shell
vim $HIVE_HOME/conf/hive-site.xml

添加下列配置项

xml
  <property>
      <!-- hiveserver2用户名 -->
      <name>beeline.hs2.connection.user</name>
      <value>hadoop</value>
  </property>

  <property>
      <!-- hiveserver2密码 -->
      <name>beeline.hs2.connection.password</name>
      <value>73748156</value>
  </property>

保存后退出即可

  1. 重启hadoop集群
shell
stop-all.sh
start-all.sh
  1. 启动hiveserver2服务
shell
hive --service hiveserver2

(这玩意会一直运行,可以选择挂在tmux里或者新开窗口)

使用Idea连接Hive

选择数据库选项卡

image-20220824232235819

添加hive连接

image-20220824232307774

填入相关信息(密码是刚刚配置文件中的密码)

image-20220824232402998

点击确定后闭眼默念五遍 “lyl睡不醒,jyp不学习~”

image-20220824232652074

连接成功!!

img

Hive 相关命令

Hive不支持数据删除或修改

创建数据库

sql
CREATE DATABASE|SCHEMA [IF NOT EXISTS] <database name>

image-20220830155754024

删除数据库

sql
DROP DATABASE StatementDROP (DATABASE|SCHEMA) [IF EXISTS] database_name

image-20220830155941991

要记得分号............

创建表

sql
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name

例如:

sql
CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String)
COMMENT 'Employee details'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

image-20220830162854828

sql
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
  • LOCAL是标识符指定本地路径。它是可选的。
  • OVERWRITE 是可选的,覆盖表中的数据。

修改表

sql
ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])

删除表

sql
DROP TABLE [IF EXISTS] table_name;

Hive 内置运算符

运算符操作描述
A = B所有基本类型如果表达A等于表达B,结果TRUE ,否则FALSE。
A != B所有基本类型如果A不等于表达式B表达返回TRUE ,否则FALSE。
A < B所有基本类型TRUE,如果表达式A小于表达式B,否则FALSE。
A <= B所有基本类型TRUE,如果表达式A小于或等于表达式B,否则FALSE。
A > B所有基本类型TRUE,如果表达式A大于表达式B,否则FALSE。
A >= B所有基本类型TRUE,如果表达式A大于或等于表达式B,否则FALSE。
A IS NULL所有类型TRUE,如果表达式的计算结果为NULL,否则FALSE。
A IS NOT NULL所有类型FALSE,如果表达式A的计算结果为NULL,否则TRUE。
A LIKE B字符串TRUE,如果字符串模式A匹配到B,否则FALSE。
A RLIKE B字符串NULL,如果A或B为NULL;
TRUE,如果A任何子字符串匹配Java正则表达式B;
否则FALSE。
A REGEXP B字符串等同于RLIKE.
A + B所有数字类型A加B的结果
A - B所有数字类型A减去B的结果
A * B所有数字类型A乘以B的结果
A / B所有数字类型A除以B的结果
A % B所有数字类型A除以B.产生的余数
A & B所有数字类型A和B的按位与结果
A | B所有数字类型A和B的按位或结果
A ^ B所有数字类型A和B的按位异或结果
~A所有数字类型A按位非的结果
A AND BbooleanTRUE,如果A和B都是TRUE,否则FALSE。
A && Bboolean类似于 A AND B.
A OR BbooleanTRUE,如果A或B或两者都是TRUE,否则FALSE。
A || Bboolean类似于 A OR B.
NOT AbooleanTRUE,如果A是FALSE,否则FALSE。
!Aboolean类似于 NOT A.
A[n]A是一个数组,n是一个int它返回数组A的第n个元素,第一个元素的索引0。
M[key]M 是一个 Map<K, V> 并 key 的类型为K它返回对应于映射中关键字的值。
S.xS 是一个结构它返回S的s字段

Hive 内置函数

返回类型签名描述
BIGINTround(double a)返回BIGINT最近的double值。
BIGINTfloor(double a)返回最大BIGINT值等于或小于double。
BIGINTceil(double a)它返回最小BIGINT值等于或大于double。
doublerand(), rand(int seed)它返回一个随机数,从行改变到行。
stringconcat(string A, string B,...)它返回从A后串联B产生的字符串
stringsubstr(string A, int start)它返回一个起始,从起始位置的子字符串,直到A.结束
stringsubstr(string A, int start, int length)返回从给定长度的起始start位置开始的字符串。
stringupper(string A)它返回从转换的所有字符为大写产生的字符串。
stringucase(string A)和上面的一样
stringlower(string A)它返回转换B的所有字符为小写产生的字符串。
stringlcase(string A)和上面的一样
stringtrim(string A)它返回字符串从A.两端修剪空格的结果
stringltrim(string A)它返回A从一开始修整空格产生的字符串(左手侧)
stringrtrim(string A)rtrim(string A),它返回A从结束修整空格产生的字符串(右侧)
stringregexp_replace(string A, string B, string C)它返回从替换所有子在B结果配合C.在Java正则表达式语法的字符串
intsize(Map<K.V>)它返回在映射类型的元素的数量。
intsize(Array<T>)它返回在数组类型元素的数量。
value of <type>cast(<expr> as <type>)它把表达式的结果expr<类型>如cast('1'作为BIGINT)代表整体转换为字符串'1'。如果转换不成功,返回的是NULL。
stringfrom_unixtime(int unixtime)转换的秒数从Unix纪元(1970-01-0100:00:00 UTC)代表那一刻,在当前系统时区的时间戳字符的串格式:"1970-01-01 00:00:00"
stringto_date(string timestamp)返回一个字符串时间戳的日期部分:to_date("1970-01-01 00:00:00") = "1970-01-01"
intyear(string date)返回年份部分的日期或时间戳字符串:year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970
intmonth(string date)返回日期或时间戳记字符串月份部分:month("1970-11-01 00:00:00") = 11, month("1970-11-01") = 11
intday(string date)返回日期或时间戳记字符串当天部分:day("1970-11-01 00:00:00") = 1, day("1970-11-01") = 1
stringget_json_object(string json_string, string path)提取从基于指定的JSON路径的JSON字符串JSON对象,并返回提取的JSON字符串的JSON对象。如果输入的JSON字符串无效,返回NULL。
BIGINTcount(*), count(expr),count(*) - 返回检索行的总数。
DOUBLEsum(col), sum(DISTINCT col)返回该组或该组中的列的不同值的分组和所有元素的总和。
DOUBLEavg(col), avg(DISTINCT col)返回上述组或该组中的列的不同值的元素的平均值。
DOUBLEmin(col)返回该组中的列的最小值。
DOUBLEmax(col)返回该组中的列的最大值。
(string A)它返回字符串从A.两端修剪空格的结果
stringltrim(string A)它返回A从一开始修整空格产生的字符串(左手侧)
stringrtrim(string A)rtrim(string A),它返回A从结束修整空格产生的字符串(右侧)
stringregexp_replace(string A, string B, string C)它返回从替换所有子在B结果配合C.在Java正则表达式语法的字符串
intsize(Map<K.V>)它返回在映射类型的元素的数量。
intsize(Array<T>)它返回在数组类型元素的数量。
value of <type>cast(<expr> as <type>)它把表达式的结果expr<类型>如cast('1'作为BIGINT)代表整体转换为字符串'1'。如果转换不成功,返回的是NULL。
stringfrom_unixtime(int unixtime)转换的秒数从Unix纪元(1970-01-0100:00:00 UTC)代表那一刻,在当前系统时区的时间戳字符的串格式:"1970-01-01 00:00:00"
stringto_date(string timestamp)返回一个字符串时间戳的日期部分:to_date("1970-01-01 00:00:00") = "1970-01-01"
intyear(string date)返回年份部分的日期或时间戳字符串:year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970
intmonth(string date)返回日期或时间戳记字符串月份部分:month("1970-11-01 00:00:00") = 11, month("1970-11-01") = 11
intday(string date)返回日期或时间戳记字符串当天部分:day("1970-11-01 00:00:00") = 1, day("1970-11-01") = 1
stringget_json_object(string json_string, string path)提取从基于指定的JSON路径的JSON字符串JSON对象,并返回提取的JSON字符串的JSON对象。如果输入的JSON字符串无效,返回NULL。