这种SQL便是Hive SQL,她可以将SQL语句转换为Map Reduce任务运行,通过分外的SQL去查询剖析须要的内容,使不熟习map reduce的用户很方便的利用SQL 措辞查询,汇总,剖析数据

一、根本命令

1、数据库操作

show databases; # 查看某个数据库use 数据库; # 进入某个数据库show tables; # 展示所有表desc 表名; # 显示表构造show partitions 表名; # 显示表名分区show create table_name; # 显示创建表的构造

2、表构造修正

phppdoodbchiveHive SQL常用敕令总结年夜数据开辟人员按需珍藏 Webpack

use xxdb; create table xxx; # 内部表create table xxx like xxx; # 创建一个表,构造与其他一样use xxdb; create external table xxx; # 外部表use xxdb; create external table xxx (l int) partitoned by (d string); # 分区表alter table table_name set TBLPROPROTIES ('EXTERNAL'='TRUE'); # 内部表转外部表alter table table_name set TBLPROPROTIES ('EXTERNAL'='FALSE');# 外部表转内部表

3、字段类型

基本类型: tinyint, smallint, int, bigint, float, decimal, boolean, string复合类型:struct, array, map二、常用函数

length() # 返回字符串长度trim() # 去除两边空格lower(), upper() # 大小写转换reverse() # 反转字符串cast(expr as type) # 类型转换substring(string A, int start, int len) # 字符串截取split(string str, string pat) # 按照pat字符串分割str,返回分割后的字符串数组coalesce(v1, v2, v3, ...) # 返回列表中第一个非空元素,如果所有值都为空,则返回nullfrom_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss') # 返回当前韶光instr(string str, string search_str) # 返回第二个参数在待查找字符串中的位置(找不到返回0)concat(string A, string B, string C, ...) # 字符串连接concat_ws(string sep, string A, string B, string C, ...) # 自定义分隔符sep的字符串连接str_to_map(string A, string item_pat, string dict_pat) # 将字符串转为mapmap_keys(map m) # 提取出map的key, 返回key的arraydatediff(date1, date2) # 日期比较函数,返回相差天数,datediff('${cur_date},d)explode(colname) # explode便是将hive一行中繁芜的array或者map构造拆分成多行三、干系观点

1、hive

hive是基于hadoop的一个数据仓库工具,可以将构造化的数据文件映射为一张数据库库表,并供应类SQL查询功能。

2、基本组成

用户接口:CLI,shell命令行;JDBC/ODBC是hive的java实现;webGUI是通过浏览器访问hive;元数据存储:常日是存储在关系数据库如mysql, derby中;hive的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表),表的数据所在目录等。

阐明器,编译器,优化器完成HQL查询语句从词法剖析,语法剖析,编译,优化以及查询操持的天生。
天生的查询存储在HDFS中,并随后有mapreduce调用实行。
因此,hive与Hadoop的关系可以理解为用户发出SQL查询语句,hive将查询存储在HDFS中,然后由mapreduce调用实行。

3、table

Hive 中的 Table 和数据库中的 Table 在观点上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据。
例如,一个表 pvs,它在 HDFS 中的路径为:/wh/pvs,个中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。

4、partition

Partition 对应于数据库中的 Partition 列的密集索引,但是 Hive 中 Partition 的组织办法和数据库中的很不相同。
在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。

5、buckets

Buckets 对指定列打算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。
将 user 列分散至 32 个 bucket,首先对 user 列的值打算 hash,对应 hash 值为 0 的 HDFS 目录为:/wh/pvs/ds=20090801/ctry=US/part-00000;hash 值为 20 的 HDFS 目录为:/wh/pvs/ds=20090801/ctry=US/part-00020

6、external table

External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。
它和 Table 在元数据的组织上是相同的,而实际数据的存储则有较大的差异。

Table 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。
删除表时,表中的数据和元数据将会被同时删除。

External Table 只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在 LOCATION 后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。
当删除一个 External Table 时,仅删除元数据,表中的数据不会真正被删除。

7、全量数据和增量数据

查看分区信息:如果分区的大小随韶光增加而增加,则最新的分区为全量数据。
如果分区的大小随韶光增加而大小高下变革,则每个分区都是增量数据。

四、HQL和SQL的异同

1、HQL和SQL常见不同,

select distinct 后必须指定字段名join 条件仅支持等值关联且不支持or条件子查询不能在select中利用;HQL中没有UNION,可利用distinct+ union all 实现 UNION;HQL以分号分隔,必须在每个语句结尾写上分号;HQL中字符串的比较比较严格,区分大小写及空格,因此在比较时建议upper(trim(a))=upper(trim(b))日期判断,建议利用to_date(),如:to_date(orderdate)=‘2016-07-18’关键字必须在字段名上加``符号,如select `exchange` from xxdb.xxtb;数据库和表/视图之间仅有1个点,如xx_db.xx_tb。

2、HQL不支持update,采取union all + left join (is null)变相实现update。

取出增量数据;利用昨日分区的全量数据通过主键左连接增量数据,并且只取增量表中主键为空的数据(即,取未发生变革的全量数据);合并1、2的数据覆盖至最新的分区,即实现了update。

3、HQL不支持delete,采取not exists/left join(is null)的方法变相实现。

取出已删除的主键数据(表B);利用上一个分区的全量数据(表A)通过主键左连接A,并且只取A中主键为空的数据,然后直接insert overwrite至新的分区。

对付会SQL的职员,转入Hive SQL还是比较随意马虎的,语法大部分是想通的,少部分函数不太同等。