hive小结 - 校招准备
行转列:explode
列转行:
使用函数:concat_ws(',',collect_set(column))
说明:collect_list 不去重,collect_set 去重。 column的数据类型要求是stringhive 基础知识的总结回顾 内含我收集的几个sql题目, 用来回顾练手的
包括一些优化相关的总结
是什么
- 为Hadoop上的任务提供一个sql的接口
- hive适用于数据仓库应用程序 OLAP 任务
- 静态数据分析
- 对实时性要求不高
- 不是一个完整的数据库
- 只有表的元数据
- 具体数据存储在HDFS中
数据模型
- db
- 在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
- table
- 在hdfs中表现所属db目录下一个文件夹
- external table
- 与table类似,不过其数据存放位置可以在任意指定路径(外部表)
- partition
- 在hdfs中表现为table目录下的子目录
- bucket
- 在hdfs中表现为同一个表目录下根据hash散列之后的多个文件
基本组成
- 用户接口
- CLI
- JDBC/ODBC
- WebGUI
- 元数据存储
- 解释器、编译器、优化器、执行器
- 完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成
hive服务
- cli
- 命令行接口
- hive
- -- 注释
- -d 定义kv值
- -f filename
- -h help
- -h hostname
- -e 一次性的命令
- hive -e "" > file
- hiveserver2
- 让hive以thrift服务运行
- beeline
- 嵌入式工作的hive命令行接口
- hwi
- hive的web接口
- hue
- 更加全面的web接口
- metastore
- 默认metostore和hive在同一个服务里
- 可以让其成为单独的元数据服务
特点
- 内部表 外部表
- 存储格式
- 文件
- 二进制格式
- 元数据
- 单机
- 元数据服务
- 若配置了,每次都要启动
- hive --service metastore &
- 视图
- 类似关系型数据库视图
- 索引
- Hive的索引目的是提高Hive表指定列的查询速度。
- 执行引擎
- mapreduce
- tez
- 读时模式 写时模式
- hive是读时模式
- 在加载的时候验证
分区与分桶
分区
- 每个分区建立一个文件夹
- 外部分区表
- 自己增加分区
- 自己挂载进来
分桶
- 桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件。
- 随机分数据
hql语法
基础
- 数据类型
- 基本数据类型
- String
- 集合数据类型
- hdfs支持的文件压缩格式
数据库操作
- 与mysql类似
- 可以用like
- show databases like "h.*"
- if not exists
表操作
- describe table
- 查勘表的情况
- show partitions XXX
- 显示XXX的分区情况
- create teble XXX like XXX
建表
建表语法 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]
说明: 1、CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。 2、EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。 3、LIKE 允许用户复制现有的表结构,但是不复制数据。 4、ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)] 用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive通过 SerDe 确定表的具体的列的数据。 5、STORED AS SEQUENCEFILE|TEXTFILE|RCFILE 如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
6、CLUSTERED BY 对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
- create table
- (name: type, ..)
- 属性
- ROW FORMAT DELIMITED
- 指定下面的分隔符
- 要先有这个
- FIELDS TERMINATED By '\001'
- 每列之间分割
- COLLECTION ITEMS TERMINATED by '\002'
- list之间
- MAP Keys TERMINATED by '\003'
- map之间
- Lines TERMINATED by '\n'
- 不需要粉色的 声明开头
- 每行之间
- PARTITIONED by (year int,day int)
- 划分分区
- CLUSTERED BY(userid) SORTED BY(viewTime) INTO n BUCKETS
- STORED as
- 存储的文件格式
- 默认 TEXTFILE
- SEQUENCEFILE
- RECFILE
- 还可以 自己制定 InputFormat 和OutputFormat
- LOCATION ''"
- 存储在哪里
- 默认是 /user/hive/warehouse
查询
- select中 可以使用 array下标和 map[key]
- case when then
- if语句
- CASE when then when then
- group having
- join
- inner
- left
- outer
- join优化
- mapside join
- sort by order by
- distribute by
- 控制reducer如何划分
- 可以和sort by一起用
- limit
函数类型
- 数学函数
- round
- 近似值
- abs
- 聚合函数
- count
- max min avg sum
- hive.map.aggr
- 生成函数
- explode
- 返回多个元素
- stack
- m列转为n行
- 其他
- cast( as )
- 类型装换
- length
- split
- ltrim
- lower
- repeat
- 重复n次
数据操作
- load data [ local] inpath "XXX" [overwrite] into table XXX [Partition (...)]
2.2.1Load 语法结构 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
说明: 1、Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。 2、filepath: 相对路径,例如:project/data1 路径,例如:/user/hive/project/data1 包含模式的完整 URI,列如: hdfs://namenode:9000/user/hive/project/data1 3、LOCAL关键字 如果指定了 LOCAL, load 命令会去查找本地文件系统中的 filepath。 如果没有指定 LOCAL 关键字,则根据inpath中的uri[如果指定了 LOCAL,那么: load 命令会去查找本地文件系统中的 filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。 load 命令会将 filepath中的文件复制到目标文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置。
如果没有指定 LOCAL 关键字,如果 filepath 指向的是一个完整的 URI,hive 会直接使用这个 URI。 否则:如果没有指定 schema 或者 authority,Hive 会使用在 hadoop 配置文件中定义的 schema 和 authority,fs.default.name 指定了 Namenode 的 URI。 如果路径不是的,Hive 相对于/user/进行解释。 Hive 会将 filepath 中指定的文件内容移动到 table (或者 partition)所指定的路径中。]查找文件
4、OVERWRITE 关键字 如果使用了 OVERWRITE 关键字,则目标表(或者分区)中的内容会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。 如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。
- 没有local的话 就是在hdfs中, 会将其移动过去
相关文章