大数据之-hive

1 hive环境搭建

2hive 安装

2.1 hive交互命令

1) “-e”不进入 hive 的交互窗口执行 sql 语句
[root@hadoop102 hive]# bin/hive -e “select * from test”
2) “-f”执行脚本中 sql 语句
bin/hive -f /opt/module/hive/datas/hivef.sql
主要运用写脚本时候使用的。

3 Hive数据类型

3.1 基本数据类型

在这里插入图片描述
对于 Hive 的 String 类型相当于数据库的 varchar 类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储 2GB 的字符数。

3.2 集合数据类型

在这里插入图片描述

  1. Hive 有三种复杂数据类型 ARRAY、MAP 和 STRUCT。
  2. ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似
  3. STRUCT 与 java中的对象,复杂数据类型允许任意层次的嵌套。

3.3 数据操作

3.3.1创建表:

在这里插入图片描述

3.3.2 数据put到hadoop上

把对应的数据put到hadoop对应hive目录中
在这里插入图片描述

3.3.3 Array访问数据

select array类型的字段[index] from 表名;
Array类型的数据支持下标访问
在这里插入图片描述

3.3.4 map数据结构访问

select children[“xiao song”] from test6;
在这里插入图片描述

3.3.5 结构体(Bean)访问

hive (default)> select address.street from test6;
在这里插入图片描述

3.4 类型转换

hive数据类型自动转换只能向大的类型转换。
1) 隐式类型转换规则如下
(1) 任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成
INT,INT 可以转换成 BIGINT。
(2) 所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成 DOUBLE。
(3) TINYINT、SMALLINT、INT 都可以转换为 FLOAT。
(4) BOOLEAN 类型不可以转换为任何其它的类型。
2) 可以使用 CAST 操作显示进行数据类型转换例如 CAST(‘1’ AS INT)将把字符串’1’ 转换成整数 1;如果强制类型转换失败,如执行
CAST(‘X’ AS INT),表达式返回空值 NULL。

4 DDL数据定义

4.1 创建数据库

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment] //注释
[LOCATION hdfs_path] //存放路径
[WITH DBPROPERTIES (property_name=property_value, …)];//额外的参数信息

1) 创建一个数据库,数据库在 HDFS 上的默认存储路径是/user/hive/warehouse/*.db。
hive (default)> create database db_hive;
2) 避免要创建的数据库已经存在错误,增加 if not exists 判断。(标准写法)
hive (default)> create database db_hive; FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database db_hive already exists hive (default)> create database if not exists db_hive;
3) 创建一个数据库,指定数据库在 HDFS 上存放的位置
hive (default)> create database db_hive2 location ‘/db_hive2.db’;

4.2 查询数据库

1) 显示数据库
hive> show databases;
2) 过滤显示查询的数据库
hive> show databases like ‘db_hive*’; OK db_hive db_hive_1
3) 切换库
use 库名;
4)查询数据详情
desc database 库名

4.3 修改数据库

用户可以使用 ALTER DATABASE 命令为某个数据库的 DBPROPERTIES 设置键-值对属性值,
来描述这个数据库的属性信息。
alter database db_hive set dbproperties(‘createtime’=‘20170830’);

4.4 删除数据库

1) 删除空数据库
hive>drop database db_hive2;
2) 如果删除的数据库不存在,最好采用 if exists 判断数据库是否存在
hive> drop database db_hive;
FAILED: SemanticException [Error 10072]: Database does not exist: db_hive hive> drop database if exists db_hive2;
3) 如果数据库不为空,可以采用 cascade 命令,强制删除
hive> drop database db_hive;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database db_hive is not empty. One or more tables exist.)
hive> drop database db_hive cascade;

4.5 创建表

建表语句:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
[(col_name data_type [COMMENT col_comment], ...)] 
[COMMENT table_comment] 
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) 
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path] 
[TBLPROPERTIES (property_name=property_value, ...)] 
[AS select_statement] 

[EXTERNAL] :外部的---->Hive表中会有内外之分
[PARTITIONED BY:分区表
[CLUSTERED BY:分桶表
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS] :分桶表,指定分桶个数
[ROW FORMAT row_format] 定义行的格式
[STORED AS file_format] :指定文件格式
[LOCATION hdfs_path] :指定表的位置信息
[TBLPROPERTIES (property_name=property_value, …)] :额外属性
[AS select_statement] :后跟查询语句,根据查询结果创建表

4.5.1 管理表(内部表)

应用场景比较少–不安全。
1) 理论默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive 会(或多或少地)控制着数据的生命周期。
Hive 默认情况下会将这些表的数据存储在由配置项 hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。
当我们删除一个管理表时,Hive 也会删除这个表中数据
管理表不适合和其他工具共享数据。
内部表删除的时候元数据与数据都会删除。

4.5.2 外部表

1) 理论
因为表是外部表,所以 Hive 并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
2) 管理表和外部表的使用场景每天将收集到的网站日志定期流入 HDFS 文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过 SELECT+INSERT 进入内部表。

4.5.3 管理表与外部表相互转换

(2) 修改内部表 student2 为外部表
alter table 表名 set tblproperties(‘EXTERNAL’=‘TRUE’);
在这里插入图片描述
注意:(‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)为固定写法,区分大小写!
desc formatted student2; 查询表结构

4.5.4 创建表时指定分隔符

问题:假如创建一张表不指定分隔符,导出数据默认会在数据之间添加分割符,不利于其他程序使用。
案例:
1、创建一张表
指定分隔符
row format delimited fields terminated by “,”;
在这里插入图片描述
2、向表中插入数据
3、查询数据,数据中间有,分割
在这里插入图片描述
结论:如果我们不按逗号分割,hive将不会识别

4.6 修改表

4.6.1 重命名表明

1) 语法
ALTER TABLE table_name RENAME TO new_table_name
2) 实操案例
hive (default)> alter table dept_partition2 rename to dept_partition3;
注意:修改的表名必须不存在

4.6.2 增/修/替换列信息

1) 语法
(1) 更新列
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
hive (default)> alter table test1 change 旧列名 新列名 string(新列名数据类型); 注意字段的数据类型不能向下转
(2) 增加和替换列
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], …)
注:ADD 是代表新增一字段,字段位置在所有列后面(partition 列前),
REPLACE 则是表示替换表中所有字段。
hive (default)> alter table test1 add columns (name string);
(3) 替换列
hive (default)> alter table dept replace columns(deptno string, dname string, loc string);

5 DML数据操作

5.1 数据导入

1) 语法
hive> load data [local] inpath ‘数据的path’ [overwrite] into table student [partition (partcol1=val1,…)];
(1) load data:表示加载数据
(2) local:表示从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表
(3) inpath:表示加载数据的路径
(4) overwrite:表示覆盖表中已有数据,否则表示追加
(5) into table:表示加载到哪张表
(6) student:表示具体的表
(7) partition:表示上传到指定分区

5.2 案例

5.2.1 本地加载文件(重点)

1、创建表

create table student(id int,name string) row format delimited fields terminated by '\t';

2、在本地新建一个文件
2、在hive命令行中导入数据

load data local inpath "./student.txt" into table student;

实际上是把数据传到HDFS上
在这里插入图片描述insert 会走mr 会修改元数据
**put:**和hive没有关系,put上去的数据count查不到数据,
**load:**会修改元数据的numFiles 不会修改元数据中的numRows

5.2.2 HDFS数据导入

加载数据于文件大小没有关系。
1、将文件put到HDFS上
2、HDFS文件导入


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值