| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Hive语法及进阶 -> 正文阅读 |
|
[大数据]Hive语法及进阶 |
一、基本语法1、Hive--建表[external]代表创建外部表 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] ???// 指定Hive储存格式:textFile、rcFile、SequenceFile 默认为:textFile ???[STORED AS file_format] ??? ???| STORED BY 'storage.handler.class.name' [ WITH SERDEPROPERTIES (...) ] ?(Note: ?only available starting with 0.6.0) ??] ??// 指定储存位置 ??[location hdfs_path] ??// 跟外部表配合使用,比如:映射HBase表,然后可以使用HQL对hbase数据进行查询,当然速度比较慢 ??[TBLPROPERTIES (property_name=property_value, ...)] ?(Note: ?only available starting with 0.6.0) ??[AS select_statement] ?(Note: this feature is only available starting with 0.5.0.) 例如: 建表格式1:不指定(location)数据的储存位置create table students ( ????id bigint, ????name string, ????age int, ????gender string, ????clazz string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; // 必选,指定列分隔符 (row format delimited fields terminated by ',';) 建表格式2:指定locationcreate table students2 ( ????id bigint, ????name string, ????age int, ????gender string, ????clazz string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/input1'; // 指定Hive表的数据的存储位置,一般在数据已经上传到HDFS,想要直接使用,会指定Location,通常Locaion会跟外部表一起使用,内部表一般使用默认的location 建表格式3:指定储存格式.create table students3 ( ????id bigint, ????name string, ????age int, ????gender string, ????clazz string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS rcfile; //指定储存格式为rcfile,inputFormat:RCFileInputFormat,outputFormat:RCFileOutputFormat,如果不指定,默认为textfile,注意:除textfile以外,其他的存储格式的数据都不能直接加载,需要使用从表加载的方式。 建表格式4(常用):create table xxxx as select_statement(SQL语句)?create table students4 as select * from students2; 建表格式5:create table xxxx like table_name ?只想建表,不需要加载数据create table students5 like students; 2、Hive加载数据1、使用```hdfs dfs -put '本地数据' 'hive表对应的HDFS目录下 dfs -put /usr/local/data/test.txt /user/hive/warehouse/shujia.db/test; ?2、使用 load data inpath 1)将Linux上的本地目录下的文件上传到hive表?需使用?local load data local inpath '/usr/local/data/test.txt' into table test; 否则会报错如下 ??2)将HDFS上的/input1目录下面的数据 移动至 students表对应的HDFS目录下,注意是 移动、移动、移动 load data inpath '/data/text.txt' into table test; ?3、清空表 truncate table test; 4、?overwrite 覆盖加载 load data local inpath '/usr/local/data/test.txt' overwrite into table test; 5、insert into table xxxx SQL语句 (没有as) 传输给别的格式的hive table到table xxxx ????????// 将 students表的数据插入到students2 这是复制 不是移动 students表中的表中的数据不会丢失 ????????????????insert into table test01 select * from test; ????????// 覆盖插入 把into 换成 overwrite(将原本的数据移除到回收站,传入新的数据) ????????????????insert overwrite table test01 select * from test; 3、内部表和外部表的区别1)、 建表:// 内部表
// 外部表
2)、加载数据:
##### 删除表:
> 可以看出,删除内部表的时候,表中的数据(HDFS上的文件)会被同表的元数据一起删除 > 删除外部表的时候,只会删除表的元数据,不会删除表中的数据(HDFS上的文件) > 一般在公司中,使用外部表多一点,因为数据可以需要被多个程序使用,避免误删,通常外部表会结合location一起使用 > 外部表还可以将其他数据源中的数据 映射到 hive中,比如说:hbase,ElasticSearch...... > 设计外部表的初衷就是 让 表的元数据 与 数据 解耦 > Managed tables are Hive owned tables where the entire lifecycle of the tables’ data are managed and controlled by Hive. External tables are tables where Hive has loose coupling with the data. > All the write operations to the Managed tables are performed using Hive SQL commands. If a Managed table or partition is dropped, the data and metadata associated with that table or partition are deleted. The transactional semantics (ACID) are also supported only on Managed tables. 4、Hive分区分区表实际上是在表的目录下在以分区命名,建子目录 ?作用:进行分区裁剪,避免全表扫描,减少MapReduce处理的数据量,提高效率 一般在公司的hive中,所有的表基本上都是分区表,通常按日期分区、地域分区 分区表在使用的时候记得加上分区字段 分区也不是越多越好,一般不超过3级,根据实际业务衡量 ##### 建立分区表:
##### 增加一个分区:
##### 删除一个分区:
##### 查看某个表的所有分区
##### 往分区中插入数据:
##### 查询某个分区的数据: // 全表扫描,不推荐,效率低
// 使用where条件进行分区裁剪,避免了全表扫描,效率高
// 也可以在where条件中使用非等值判断
#### Hive动态分区 有的时候我们原始表中的数据里面包含了 ''日期字段 dt'',我们需要根据dt中不同的日期,分为不同的分区,将原始表改造成分区表。 hive默认不开启动态分区 动态分区:根据数据中某几列的不同的取值 划分 不同的分区 ##### 开启Hive的动态分区支持 # 表示开启动态分区
# 表示动态分区模式:strict(需要配合静态分区一起使用)、nostrict
# 表示支持的最大的分区数量为1000,可以根据业务自己调整
##### 建立原始表并加载数据sql
##### 建立分区表并加载数据sql
##### 使用动态分区插入数据 // 分区字段需要放在 select 的最后,如果有多个分区字段 同理,它是按位置匹配,不是按名字匹配
// 比如下面这条语句会使用age作为分区字段,而不会使用student_dt中的dt作为分区字段
##### 多级分区
自己尝试一下多级分区 ?上单讲分区:https://developer.aliyun.com/article/81775 5、Hive分桶?分桶实际上是对文件(数据)的进一步切分 Hive默认关闭分桶 作用:在往分桶表中插入数据的时候,会根据 clustered by 指定的字段 进行hash分区 对指定的buckets个数 进行取余,进而可以将数据分割成buckets个数个文件,以达到数据均匀分布,可以解决Map端的“数据倾斜”问题,方便我们取抽样数据,提高Map join效率 分桶字段 需要根据业务进行设定 ##### 开启分桶开关
##### 建立分桶表
##### 往分桶表中插入数据 // 直接使用load data 并不能将数据打散
// 需要使用下面这种方式插入数据,才能使分桶表真正发挥作用
> https://zhuanlan.zhihu.com/p/93728864 Hive分桶表的使用场景以及优缺点分析 6、Hive--JDBC##### 启动hiveserver2 ```shell
或者
##### 新建maven项目并添加两个依赖
##### 编写JDBC代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:48:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |