04 Hive基础操作

一、Hive独立模式的安装部署

1. Metastore的三种运行模式

安装Hive前,先了解Metastore的三种运行模式,分别是:Embedded(嵌入)、Local(本地)、Remote(远程)。

第一种是嵌入模式,它的最大的特点是,内嵌了Derby数据库,Hive Driver、Metastore、Derby三个组件在一个独立JAVA虚拟机(JVM),也即一个独立进程中运行。但这个模式有个缺点:不同路径启动 hive ,每一个 hive 拥有一套自己的元数据,无法共享

**注:**使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

第二种是本地模式,它可以采用独立的数据库,比如MySQL,目前它对MySQL支持是最好的,其他数据库,比如Oracle支持还不是很好。另外,Driver和Metastore在同一个JVM中运行。

第三种是远程模式,这种模式下,Metastore单独部署,多个Hive Driver共享这个Metastore。

2. Metastore 配置属性

Hive核心配置文件 hive-site.xml 相关属性

属性名称 描述
hive.metastore.warehouse.dir 配置仓库存放目录,/usr/hive/warehouse
hive.metastore.uris 可以不设置,不设置则表示使用当前的 Metastore,否则采用指定的 Metastore
javax.jdo.option.ConnectionURL JDBC连接地址,jdbc:derby:;databaseName=metastore_db;create=true
javax.jdo.option.ConnectionDriverName JDBC驱动器的类名,org.apache.derby.jdbc.EmbeddedDriver
javax.jdo.option.ConnectionUserName JDBC用户名,APP
javax.jdo.option.ConnectionPassword JDBC密码,mine

3. 搭建Hive环境(独立模式)

Apache公共软件仓库 下载 Hive。本课程使用 Hive 的版本是 2.3.3。Hive安装前需要安装好 JDK 和 Hadoop,且启动Hadoop

  1. Hive安装部署步骤

​ (1) 使用Xshell的sftp插件上传Hive安装包到hadoop01节点的 /usr/local目录中

​ (2) 解压上传的安装包,将解压出来的目录重命名为 hive

[root@hadoop01 local]#tar -zxvf apache-hive-2.3.3-bin.tar.gz
[root@hadoop01 local]#mv hive-2.3.3 hive
  1. 启动Hadoop

Hive会自动监测Hadoop的环境变量,所以在安装hive之前就必须启动Hadoop

# 启动Hadoop,包括hdfs,yarn
[root@hadoop01 local]#start-all.sh

# 查看是否Hadoop是否正常启动
Hive安装前需要安装好 JDK 和 Hadoop,且启动Hadoop,使用命令jps查看HDFS和YARN的服务进程
  1. 配置Hive的环境变量

修改 /etc/profile 文件,向其中追加以下内容

[root@hadoop01 local]#vi /etc/profile

#追加以下内容到文件中
export HIVE_HOME=/usr/local/src/hive
export PATH=$PATH:$HIVE_HOME/bin

# 重新加载/etc/profile
[root@hadoop01 local]#source /etc/profile
  1. 删除hive中的日志文件依赖 log4j-slf4j-impl-2.6.2.jar

防止hive启动时此依赖与Hadoop中的依赖冲突

[root@hadoop01 local]#cd hive/lib/
[root@hadoop01 lib]#rm -rf log4j-slf4j-impl-2.6.2.jar
  1. 将上传的mysql驱动jar包 mysql-connector-java-5.1.49-bin.jar 放到hive的lib目录下
[root@hadoop01 software]#mv mysql-connector-java-5.1.49-bin.jar ../hive/lib/
  1. 进入hive的conf目录,找到3个文件: hive-env.sh.templatehive-exec-log4j2.properties.templatehive-log4j2.properties.template ,分别复制并重命名为 hive-env.shhive-exec-log4j2.propertieshive-log4j2.properties
[root@hadoop01 conf]# cp hive-env.sh.template hive-env.sh
[root@hadoop01 conf]# cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties
[root@hadoop01 conf]# cp hive-log4j2.properties.template hive-log4j2.properties
  1. 修改配置文件 hive-env.sh ,向其中追加以下内容
#修改配置文件hive-env.sh
[root@hadoop01 conf]# vi hive-env.sh

#追加内容
export HADOOP_HOME=/usr/local/src/hadoop
export HIVE_CONF_DIR=/usr/local/src/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/src/hive/lib

  1. 新建一个配置文件 hive-site.xml ,并对其进行配置
#新建配置文件hive-site.xml
[root@hadoop01 conf]# vi hive-site.xml

#文件配置内容
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <!--配置数据仓库在HDFS上的目录-->
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
  </property>
  <!--需要登录MySQL数据库,创建一个 hive 数据库备用-->
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop03:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
  </property>
  
  <!--安装MySQL数据库的驱动类-->
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  
  <!--设置登录MySQL数据库的用户名-->
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>
  
  <!--设置登录MySQL数据库的密码-->
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
  </property>
  
  <!--启用 webhdfs,用于外部访问-->
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>
</configuration>
  1. 配置Hive启动的日志目录

打开配置文件:/usr/local/hive/conf/hive-log4j2.properties,按照以下步骤进行修改:

#在hive目录下创建一个目录logs
[root@hadoop01 ~]#cd /usr/local/hive/conf
#修改文件hive-log4j2.properties
[root@hadoop02 conf]vi hive-log4j2.properties

#找到文件中 property.hive.log.dir,将其值修改
property.hive.log.dir = /usr/local/hive/logs
  1. 查看集群节点时间是否同步

使用xshell的全部会话功能,在三个节点执行以下命令,查看时间

date
  1. 初始化mysql数据库

    运行 命令**schematool -initSchema -dbType mysql** 命令,初始化 mysql

[root@hadoop01 ~]#schematool -initSchema -dbType mysql
  1. 使用CLI工具启动Hive
[root@hadoop01 ~]#hive
  1. 修改HDFS上目录的权限

    使用浏览器打开 hadoop01:50070,会发现有一个权限检查,解决该问题的方式有两种:

    (1) 使用hdfs shell命令直接修改/user目录的权限设置,

[root@hadoop01 ~]hdfs dfs -chmod -R 775 /usr

​ (2) 配置hadoop的core-site.xml文件,追加以下内容

<!-- 当前用户全设置成root -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>

<!-- 不开启权限检查 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
  1. 查看HDFS上的文件

    在打开的HDFS UI界面中,查看hive数据仓库的目录,默认路径为:/user/hive/warehouse

  2. 查看hive中的数据库和表

#查看数据库
hive>show databases;  
#查看表
hive>show tables;   
#退出Hive
hive>exit;
  1. 在hive中使用HQL语句进行词频查询与MapReduce对比执行效率

    (1) 准备数据文件并上传到HDFS

#创建一个文本文件words.txt
[root@hadoop01 local]vi words.txt

#写入以下文本内容到words.txt中,词语以空格间隔:
hadoop is a bigdata technoligy frame
hdfs is a distribution file system 
hdfs is from google file system
mapreduce is a frame of distribute compute
yarn is a manager of cluster resource

#在HDFS上创建目录
[root@hadoop01 local]hdfs dfs -mkdir /data
#将words.txt上传到HDFS
[root@hadoop01 local]hdfs dfs -put words.txt /data

​ (2) 运行mapreduce应用程序wordcount

##运行mapreduce应用程序
[root@hadoop01 local]# yarn jar /hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /data/words.txt /output/result

​ (3) 使用HQL语句进行词频统计

#进入Hive CLI,编写HQL语句完成词频统计
[root@hadoop01 ~]#hive
#创建一个外部表
hive>create external table lines(line string);
#装载数据到外部表中
hive>load data inpath '/data/words.txt' into table lines;
#查看表中是否装载了数据
select * from lines; 
#进行词频统计
hive>select word, count(*) as wc from (select explode(split(line, ' ')) as word from lines) tmp group by word order by wc desc;
  1. Beeline命令行工具的使用

    Hive提供了两种命令行工具,分别是CLI和Beeline,使用中分别对应着命令: hive beeline ,CLI工具一般在运行Hive的主机上使用,而Beeline工具则支持远程连接,使用Beeline工具,需要首先在Hive主机中启动HiveServer2服务。

    (1) 配置 Hadoop 的 core-site.xml 追加以下的配置,并重启 Hadoop(HDFS/YARN)

    <!--配置代理用户 root 用于外部访问-->
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>
    

    (2) 在Hive主机中启动HiveServer2服务,

#Hive主机中启动HiveServer2服务
[root@hadoop01 ~]hiveserver2&
#查看hiveServer2的服务进程RunJar
[root@hadoop01 ~]jps

​ (3) 连接方式一:使用 beeline shell 连接服务,在 XShell 中 复制当前会话,用于客户端连接

[root@hadoop01 ~]beeline -u jdbc:hive2://hadoop01:10000 -n root

​ (4) 连接方式二:

[root@hadoop01 ~]# beeline # 启动 beeline 客户端去连接
  beeline> !connect jdbc:hive2://hadoop01:10000
  1. HWI 浏览器:在 hive-site.xml 中加入访问地址和端口号,重启 hiveserver2,通过浏览器访问 **192.168.21.11:10002 **即可。

    <!--webui 访问 主机名-->
    <property>
        <name>hive.server2.webui.host</name>
        <value>192.168.21.11</value>
    </property>
    
    <!--webui 访问 端口号-->
    <property>
        <name>hive.server2.webui.port</name>
        <value>10002</value>
    </property>
    

二、Hive 基础操作

1. 数据类型

在 Hive 中,同样提供了与DDL、DML和DQL类似的操作。

(1)基本数据类型

Hive 中 的基本数据类型也称为原始类型,包括整数、小数、文本、布尔、二进制以及时间类型。这些数据类型都是Java中接口的实现,所以类型的具体行为细节和 Java 的对应的类型完全一致。

  • 整数:tinyint/smallint/int/bigint,分别对应Java中的 byte、short、int、long

  • 小数:float/double/decimal,分别对应Java中的 float、double、BigDecimal

  • 文本:string/char/varchar,String存储可变长的文本,对长度没有限制,理论上存储空间为2GB,varchar与String类似,char是定长字符串,最大长度为255。

  • 布尔:boolean,类型值有 true 和 false两种。

  • 二进制:binary,用于存储变长的二进制数据。

  • 时间:date/timestamp/intervalDate存储年月日,TimeStamp 存储纳秒级别的时间戳,Interval 表示时间间隔,1.2之后新增。

(2)复杂数据类型

在 SQL 的表设计中,字段通常不能被再分解,这意味着每一个字段不能再被分隔成多个字段。而HiveQL没有这种限制。Hive有4种常用的复杂数据类型,分别是数组(Array)、映射(Map)、结构体(Struct)和联合体(UnionType)。

  • **Array** 是具有相同类型变量的集合。这些变量称为数组的元素,每个数组元素都有一个索引编号,编号从0开始。

    • 数据格式:["重庆","云南","四川","北京"]
    • 定义示例:array<string>
    • 使用示例:arr[0] = '重庆'
  • **Map** 是一组键值对集合,key只能是基本类型,值可以是任意类型。

    • 数据格式:{"Hadoop":60,"Java":80,"Hive":100}
    • 定义示例:map<string,string>
    • 使用示例:b['Hadoop']='60'
  • **Struct** 封装了一组有名字的字段,其类型可以是任意的基本类型,结构体内的元素使用 ”.“ 来访问。

    • 数据格式:{"男",18}
    • 定义示例:struct<sex:string,age:int>
    • 使用示例:c.sex='男'

2. HQL DDL

  • 数据库

Hive DDL 用于定义 Hive 数据库模式,其命令包括 create、drop、alter、truncate、show和describe(desc) 等,主要是对数据库和表进行创建、修改、删除等操作。

  1. 创建数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name;
0: jdbc:hive2://node01:10000> create schema if not exists wise_db;	# 创建 wise_db 数据库
  1. 切换数据库
use 数据库名;
  1. 查看数据库列表
show databases;
  1. 删除数据库默认情况下使用 RESTRICT 删除数据库。如果数据库非空,则删除将会失败,此时须使用 CASCADE 级联删除数据库。
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
0: jdbc:hive2://node01:10000> drop schema if exists teste_db cascade;  # 级联删除非空数据库 teste_db
  • 数据表
  1. 创建数据表(外部表、内部表、临时表)

(1)创建表语法

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] table_name            -- (TEMPORARY 表示临时表, EXTERNAL 表示外部表,不写默认是托管表(内部表))
  [(col_name data_type,...)]                                              -- (表的字段声明)
															
  [PARTITIONED BY (col_name data_type, ...)]                              -- (指定分区字段,注意不能和表字段重复,查询的时候,它以表字段的形式出现)
  [CLUSTERED BY (col_name, col_name, ...) INTO num_buckets BUCKETS]       -- (指定字段进行分桶,注意必须是表中存在的字段)
  [ROW FORMAT DELIMITED 											
    [FIELDS TERMINATED BY char]										  -- (指定字段分隔符,默认是 ASCII '\001' ^A)
    [COLLECTION ITEMS TERMINATED BY char]							   -- (指定集合元素分隔符,默认是 ASCII '\002' ^B)
    [MAP KEYS TERMINATED BY char]									  -- (指定Map键分隔符,默认是 ASCII '\003' ^C)
  ]                                
  [STORED AS file_format]                                                 -- (存储格式:TextFile、SequenceFile、RCFile、ORCFile)
  [LOCATION hdfs_path]                                                    -- (指定 hive 仓库存放数据的 hdfs 目录)

【语法关键字说明】

  • CREATE TABLE:创建一个指定名称的表,如果存在同名表,则抛出异常。可以使用 IF NOT EXISTS 忽略该异常。

  • EXTERNAL [ɪkˈstɜːnl]:表示该表为外部表,须同时指定实际数据存放的 HDFS 路径 LOCATION,而其他表都是存放在 hive 的默认路径 /user/hive/warehouse/下。当外部表被删除时,实际数据不会被删除

  • TEMPORARY [ˈtemprəri]:指定该表为临时表,临时表只对当前会话有效,会话退出后临时表自动删除。临时表不支持分区与索引

  • PARTITIONED [pɑːˈtɪʃn] BY分区内部表,创建表时可以为表创建一个或多个分区,查询时在 where 子句中指定分区可提升查询效率,缩小查询范围,而不是扫描整个表的内容。

  • CLUSTERED[ˈklʌstəd] BY分桶内部表,让数据能够均匀地分布在表的各个数据文件中,划分粒度更细。Hive采用对列值哈希,然后除于桶的个数求余的方式决定该条记录存放在那个桶当中。这么做的目的就是获得更高的查询处理效率( join查询 ),使取样更高效。

  • ROW FORMAT:用于指定SerDe(Serialize/Deserilze , 序列化与反序列化器),Hive 用于读写表的每一行数据。

  • STORED AS:如果表数据时文本数据,则使用 TextFile,如果数据需要压缩,则可以使用 SequenceFile 等。

(2)托管表(内部表)

Hive 托管表也称为内部表。它与数据库中的 Table 在概念上是类似。每一个托管表在 Hive 中都有一个相应的目录存储数据,所有的托管表数据(不包括外部表)都保存在这个目录中,删除托管表时,元数据与数据都会被删除。

# 使用数据库
use wise_db;
# 创建一个托管表
create table if not exists dept(deptno int,dname string,loc string)
row format delimited fields terminated by ','; # 指定结构化数据的分隔符,默认是'\001'

创建表的时候,需要指定分隔符,列的分隔符默认是 ‘\001’,行的分隔符模式是 ‘\n’。

向托管表 dept 添加装载数据,怎么做呢?准备一个 结构化数据,列分隔符是 “ , ” ,行分割符是 “ \n ”,直接使用 hadoop fs -put 的方式上传到 dept 表所在的目录/user/hive/warehouse/wise_db.db/dept即可,Hive 会自动与 dept 表 关联映射。

10,科技部,重庆沙坪坝
20,市场部,重庆九龙坡
30,财务部,重庆渝北区
[root@node01 hive_data]# hadoop fs -put dept.txt /user/hive/warehouse/wise_db.db/dept

查看数据是否装载成功,通过使用 selecet 语句来查看

0: jdbc:hive2://node01:10000> select * from dept;
OK
+--------------+-------------+-----------+
| dept.deptno  | dept.dname  | dept.loc  |
+--------------+-------------+-----------+
| 10           | 科技部         | 重庆沙坪坝     |
| 20           | 市场部         | 重庆九龙坡     |
| 30           | 财务部         | 重庆渝北区     |
+--------------+-------------+-----------+
3 rows selected (4.325 seconds)
0: jdbc:hive2://node01:10000>

到此,Hive的简单表创建和数据装载就讲完了,除此之外,我们还可以在定义表的Schema 时指定 LOCATION 地址 ,Hive 将自动关联该目录下的数据文件,而不是使用默认的地址。

[root@node01 hive_data]# hadoop fs -mkdir -p /hive/dept       # hdfs 上创建多级目录
[root@node01 hive_data]# hadoop fs -put dept.txt /hive/dept   # 上传 dept.txt 文件到 dept 目录
[root@node01 hive_data]# hadoop fs -ls /hive/dept			 # 查看文件是否上传成功
create table if not exists dept2(deptno int,dname string,loc string)
row format delimited fields terminated by ','
location '/hive/dept';  # 指定表数据存储地址,注意是HDFS文件系统目录

drop table dept2; # 删除dept2表和表数据

3.其他常用 DDL 操作

  1. 复制表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name LIKE existsing_table_name; # LIKE 允许用户复制现有的表结构,但是不复制数据
0: jdbc:hive2://node01:10000> create table dept_copy like dept;

0: jdbc:hive2://node01:10000> select * from dept_copy;
OK
+-------------------+------------------+----------------+
| dept_copy.deptno  | dept_copy.dname  | dept_copy.loc  |
+-------------------+------------------+----------------+
+-------------------+------------------+----------------+
No rows selected (0.337 seconds)
  1. 修改表
ALTER TABLE table_name RENAME TO new_table_name;                       # 表重命名
ALTER TABLE table_name ADD|REPLACE COLUMNS(col_name data_type, ...)# 新增一个字段或替换所有字段(相当于重新建表)
ALTER TABLE table_name CHANGE old_col_name new_col_name data_type;     # 修改字段

# 分区相关修改
ALTER TABLE table_name ADD PARTITION(year='2020') LOCATION '/user/hive/warehouse/table_name/year=2020' ;  #添加分区
ALTER TABLE table_name DROP IF EXISTS PARTITION(year='2020',year='2019');  # 删除分区
ALTER TABLE table_name PARTITION(year='2020') RENAME TO PARTITION(year='2021'); # 修改分区
0: jdbc:hive2://node01:10000> alter table dept_copy rename to dept_2;							 # 重命名 把 dept_copy 改为 dept_2
0: jdbc:hive2://node01:10000> alter table dept_2 add columns(mark string,create_time timestamp);    # 向 dept_2 表中追加两个字段 
0: jdbc:hive2://node01:10000> alter table dept_2 replace columns(id int,name string);			   # 把 dept_2 表的字段替换为 id和name
0: jdbc:hive2://node01:10000> alter table dept_2 change name dname string;						  # 修改 name 字段 为 dname string 类型
  1. 删除表/清空表
DROP TABLE table_name;			# 删除表
TRUNCATE TABLE table_name;       # 清空表中所有数据
0: jdbc:hive2://node01:10000> drop table dept_2;	# 删除表数据和表结构
0: jdbc:hive2://node01:10000> truncate table dept;  # 清空表数据,保留表结构
  1. 显示相关命令
show databases|schemas;			 # 显示所有数据库名
show tables;					# 列出当前数据库中所有表
show views;						# 列出当前数据库中所有视图
show partitions table_name;		  # 列出当前数据表中所有分区 
show create table table_name;	  # 显示建表语句
show functions[like 'y*'];        # 列出所有 UDF 和内置函数,支持通配符查找
desc database database_name;	  # 显示数据库信息
desc table_name;				 # 显示表信息
desc table_name.col_name;		  # 显示表中某列的信息

4. Hive DML 操作

在定义表的Schema 时指定 LOCATION ,Hive 将自动关联该目录下的数据文件,通常情况下,数据需要手动装载并进行维护管理,此时就需要使用 Hive DML 命令了。

在 Hive 中,DML 操作包括 load、insert 命令,分别对数据进行数据装载、插入等操作。

(1)数据装载与插入

一般使用两种方式实现数据装载,分别是 load 和 insert 命令,二者有明显的区别。

  • **load** 命令不对数据进行任何转换,只是简单地将数据复制或者移动至Hive表对应的位置,其实就是执行了 hadoop fs -put 命令。
LOAD DATA [LOCAL] INPATH 'file_path' [OVERWRITE] INTO TABLE table_name [PARTITION(partcoll=val1,partcoll2=val2,....)]
    • LOCAL:指定使用本地文件系统路径,装载时是**复制操作**。如果没有该关键字则是 HDFS 路径,装载时是**移动操作**
    • OVERWRITE:覆盖目标文件夹中的数据,如果没有该关键字且目标文件夹中已存在同名文件,将保留之前的文件,新文件名后缀以自动序号区分。
    • PARTITION:如果目标表是分区表,须使用该关键字为每一个分区键指定一个值。
0: jdbc:hive2://node01:10000> truncate table dept;  # 清空原来表的数据
0: jdbc:hive2://node01:10000> load data local inpath '/root/hive_data/dept.txt' into table dept;  # 加载本地数据
# 再次执行上述数据装载,由于目标文件夹中已存在同名文件,则它不会报错,而是直接修改名称(dept_copy_1.txt)存放在当前目录,如果之前的数据不再需要,则可以
# 添加 overwrite 关键字进行覆盖,之前的dept.txt 和 dept_copy_1.txt 都会删除
0: jdbc:hive2://node01:10000> load data local inpath '/root/hive_data/dept.txt' overwrite into table dept;
# 不加 local 关键字,则它会去查找 HDFS 系统目录下的文件,并移动到指定的表数据存放目录下
0: jdbc:hive2://node01:10000> load data inpath '/hive/dept.txt' overwrite into table dept;
  • **insert** 命令将会执行 MapReduce 作业并将数据插入值 Hive 表中,一般使用较少,分桶表只能使用它,**load data** 不会执行分桶操作
INSERT (INTO|OVERWRITE) TABLE table_name [PARTITION(partcol1=val1,partcol2=val2)] select_statement FROM from_stattement;
0: jdbc:hive2://node01:10000> insert into table dept select 10,'科技部','重庆沙坪坝';

5. Hive 复杂类型的使用

Hive 中的复杂类型包括 array(数组)、map(字典)、struct(结构体)等。

临时表(Temporary[ˈtemprəri])使用:临时表只对当前 session 有效,session退出后,表自动删除。临时表不支持分区字段和创建索引。

create temporary table if not exists emp_temp(
    id int,
	  name string,
    work_place array<string>,
    sex_age struct<sex:string,age:int>,
    score map<string,float>
)
row format delimited  # 指定结构化数据分隔符,保证数据能够正确映射到Hive表中
	fields terminated by '|'
	collection items terminated by ','
	map keys terminated by ':'
stored as textfile;
1|tom|重庆,云南,四川,北京|,18|Hadoop:60,Java:80,Hive:100
2|tim|成都,大理,新疆,红河|,28|Hadoop:70,Java:60,Hive:90
3|kim|广州,丽江,西双版纳,北京|,19|Hadoop:90,Java:80,Hive:95
4|aim|天津,云南,合川,大足|,23|Hadoop:100,Java:90,Hive:88
5|ros|重庆,武汉,垫江,昭通|,54|Hadoop:55,Java:100,Hive:98
0: jdbc:hive2://node01:10000> load data local inpath '/root/hive_data/user_info.txt' into table temp_user_info;  # 装载数据
0: jdbc:hive2://node01:10000> select * from temp_user_info; # 查询所有数据
OK
+--------------------+----------------------+----------------------------+-------------------------+-------------------------------------+
| temp_user_info.id  | temp_user_info.name  | temp_user_info.work_place  | temp_user_info.sex_age  |     temp_user_info.course_score     |
+--------------------+----------------------+----------------------------+-------------------------+-------------------------------------+
| 1                  | tom                  | ["重庆","云南","四川","北京"]      | {
   
   "sex":"男","age":18}    | {
   
   "Hadoop":60,"Java":80,"Hive":100}  |
| 2                  | tim                  | ["成都","大理","新疆","红河"]      | {
   
   "sex":"男","age":28}    | {
   
   "Hadoop":70,"Java":60,"Hive":90}   |
| 3                  | kim                  | ["广州","丽江","西双版纳","北京"]    | {
   
   "sex":"男","age":19}    | {
   
   "Hadoop":90,"Java":80,"Hive":95}   |
| 4                  | aim                  | ["天津","云南","合川","大足"]      | {
   
   "sex":"男","age":23}    | {
   
   "Hadoop":100,"Java":90,"Hive":88}  |
| 5                  | ros                  | ["重庆","武汉","垫江","昭通"]      | {
   
   "sex":"男","age":54}    | {
   
   "Hadoop":55,"Java":100,"Hive":98}  |
+--------------------+----------------------+----------------------------+-------------------------+-------------------------------------+
5 rows selected (0.21 seconds)
0: jdbc:hive2://node01:10000> select work_place[0],sex_age.sex,sex_age.age,course_score['Hadoop'] from temp_user_info; # 访问复杂类型中的数据
OK
+------+------+------+------+
| _c0  | sex  | age  | _c3  |
+------+------+------+------+
| 重庆   || 18   | 60   |
| 成都   || 28   | 70   |
| 广州   || 19   | 90   |
| 天津   || 23   | 100  |
| 重庆   || 54   | 55   |
+------+------+------+------+
5 rows selected (0.351 seconds)

0: jdbc:hive2://node01:10000> show create table temp_user_info;   # 显示数据表创建信息,了解数据表存放地址
  • 数组数据统计

    使用explode(数组字段),将数组元素转为多行,结合lateral view聚合为一个新字段,然后以该字段进行分组聚合。

    hive提供了两个函数:
    explode将数组拆分成行,lateral view来实现聚合 select hobby,count(1) c1 from t1 lateral view explode(likes) likes as hobby group by hobby order by c1 desc;

三、练习

(1)在hdfs中创建目录 /empinfo

(2)创建分区表emp_ext,
说明1:
包括5个字段,
(姓名)name string,
(工作地点)work_place array,
(性别年龄)gender_age struct<gender:string, age:int>,
(技能值)skill_score map<string,int>,
(部门职位)dept_title map<string, array> ,
说明2:
不同字段的划分字符为"|",
数组集合数据的划分为“,”
map键值对之间的划分字符为“:”,
将该分区表存储在hdfs的 /empinfo目录下

(3)创建数据文件为emp.txt, 将数据从本地装载到分区表中,
数据内容如下:
Michael|Montreal,Toronto|Male,30|DB:80|Product:DeveloperLead
Will|Montreal|Male,35|Perl:85|Product:Lead,Test:Lead
Shelley|New York|Female,27|Python:80|Test:Lead,COE:Architect
Lucy|Vancouver|Female,57|Sales:89,HR:94|Sales:Lead

  1. 查询表数据,显示姓名,性别和Hadoop课程的成绩。

  2. 统计出差地址次数并倒序排列。

  3. 统计Hive的平均成绩、最高成绩和最低成绩。

  4. 计算该数据的男性员工的总数

猜你喜欢

转载自blog.csdn.net/BIN_2011464841/article/details/129116073