• 【学习笔记】HQL


    HDFS(Hadoop分布式文件系统)管理着集群中的数据,每个数据块(block)被冗余多份。
    HQL用于查询存储在Hadoop集群中的数据。
    HQL不支持行级插入操作、更新操作和删除操作

    MapReduce

    MapReduce是一种计算模型,可将大型数据处理任务分解成很多单个的、可以在服务器集群中并行执行的任务,这些任务的计算结果可以合并在一起来计算最终的结果。

    map操作会将集合中的元素从一种形式转换成另一种形式。reduce过程的目的是将值的集合转换成一个值,或者转换成另一个集合。job可以不需要reduce过程。

    数据类型

    基本数据类型

    数据类型长度例子
    TINYINT1byte有符号整数20
    SMALLINT2byte有符号整数20
    INT4byte有符号整数20
    BIGINT8byte有符号整数20
    BOOLEAN布尔类型TRUE
    FLOAT单精度浮点数3.14159
    DOUBLE双精度浮点数3.14159
    STRING字符序列‘This is apple’
    TIMESTAMP整数,浮点数或者字符串1327882394,1327882394 .123465,‘2012-02-03 13:13:44.454121’
    BINARY字节数组

    数据类型转换 cast(s AS INT);

    集合数据类型

    数据类型描述字面语法示例
    STRUCT和C语言中的struct类似,可以通过"."符号访问元素内容struct(‘A’,“B”)
    MAP键-值对元组集合,使用数组表示法可以访问元素map(“first”, “A”, “last”, “B”)
    ARRAY具有相同类型和名称的变量的集合,编号从零开始array(“A”,“B”)

    默认分隔符

    • \n:分割文本文件
    • ^A:分隔字段
    • ^B:分隔ARRAY或STRUCT中的元素,或MAP中的键值对
    • ^C:分隔MAP中键和值

    可以修改默认分隔符

    CREATE TABLE employees (
    	name			STRING,
    	salary			FLOAT,
    	subordinates	ARRAY<STRING>,
    	deductions		MAP<STRING, FLOAT>,
    	address			STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\001'
    COLLECTION ITEMS TERMINATED BY '\002'
    MAP KEYS TERMINATED BY '\003'
    LINES TERMINATED BY '\n'
    STORED AS TEXTFILE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    数据库

    -- 创建数据库
    CREATE DATABASE financials;
    -- 创建数据库且检查是否存在
    CREATE DATABASE IF NOT EXISTS financials;
    -- 查看包含的数据库
    SHOW DATABASES;
    -- 创建数据库且修改默认位置
    CREATE DATABASE financials
    LOCATION '/my/other/directory';
    -- 切换工作目录
    USE financials;
    -- 删除数据库,加关键字CASCADE可以删除包含有表的数据库
    DROP DATABASES IF EXISTS financials [CASCADE];
    -- 修改数据库
    ALTER DATABASES financials SET DBPROPERTITIES('edited-by'='Ann')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    CREATE TABLE [IF NOT EXISTS] mydb.employees (
    	name			STRING COMMENT 'Emplyee name',
    	salary			FLOAT COMMENT 'Emplyee salary',
    	subordinates	ARRAY<STRING> COMMENT 'Names of subordinates',
    	deductions		MAP<STRING, FLOAT> COMMENT 'Keys are deductions names, values are percentages',
    	address			STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> COMMENT 'Home address'
    )
    COMMENT 'Description of the Table'
    TBLPROPERTIES ('creator'='me', 'created_at'='2022-01-01')
    LOCATION '/user/hive/warehouse/mydb.db/employees';
    
    -- 拷贝已经存在的表的表模式
    CREATE TABLE [IF NOT EXISTS] mydb.employees2
    LIKE mydb.employees;
    
    -- 查看表的结构信息
    DESCRIBE EXTENDED mydb.employees;
    -- 只看某列的信息
    DESCRIBE mydb.employees.salary;
    
    -- 创建外部表,可以读取location目录下的数据,无法删除该数据
    CREATE EXTERNAL TABLE ex_table (
    	....
    )
    LOCATION '/data/ex_directory';
    
    -- 修改列信息,修改列名,类型,注释和位置
    ALTER TABLE a
    CHANGE COLUMN old_name new_name INT
    COMMENT 'new comment'
    AFTER column_c;
    
    -- 增加列
    ALTER TABLE a ADD COLUMNS (
    	new_column STRING COMMENT 'add new column'
    );
    
    -- 删除表
    DROP TABLE [IF EXISTS] employees;
    
    -- 表重命名
    ALTER TABLE a RENAME TO b;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    -- 创建分区表,改变了数据存储的组织方式,会创建对应子目录,"/pt_table/country=A/state=B"
    CREATE TABLE pt_table (
    	....
    )
    PARTITIONED BY (country STRING, state STRING);
    
    -- 增加表分区
    ALTER TABLE a IF NOT EXISTS
    PARTITION (year=2022, month=1) LOCATION '/user/2022/01'
    PARTITION (year=2022, month=2) LOCATION '/user/2022/02';
    
    -- 修改表分区
    ALTER TABLE a PARTITION (year=2022, month=1) 
    SET LOCATION '/user/2022/01';
    
    -- 删除表分区
    ALTER TABLE a DROP IF EXISTS PARTITION (year=2022, month=1) ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    插入数据

    -- 覆盖掉原内容,使用INTO则是追加写入
    INSERT OVERWRITE TABLE a
    PARTITION (year=2022, month=1)
    SELECT * FROM b
    WHERE b.yr=2022 AND b.mon=1;
    
    -- 动态分区插入,根据最后2列来确定分区字段的值
    INSERT OVERWRITE TABLE a
    PARTITION (year, month)
    SELECT ..., yr, mon FROM b;
    
    -- 混合使用动态和静态分区,镜头分区键必须在动态分区之前
    INSERT OVERWRITE TABLE a
    PARTITION (year=2022, month)
    SELECT ..., yr, mon FROM b
    WHERE b.yr=2022;
    
    -- 查询结果载入表
    CREATE TABLE a
    AS SELECT name, salary, address
    FROM employees
    WHERE yr=2022;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    查询

    -- 限制返回的行数
    SELECT * FROM a
    LIMIT 2;
    
    -- 列别名
    SELECT deductions["Tax"] AS tax FROM employees;
    
    -- 嵌套select语句, 结果集需要起别名
    SELECT e.name
    FROM (
    	SELECT upper(name), salary
    	FROM emplyees
    ) e;
    
    -- case, when, then句式
    SELECT name, salary,
    	CASE
    		WHEN salary < 50000.0 THEN 'low'
    		WHEN salary >= 50000.0 AND salary < 70000.0 THEN 'mid'
    		WHEN salary >= 70000.0 AND salary < 100000.0 THEN 'high'
    		ELSE 'very high'
    	END AS bracket
    FROM employees;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    谓词操作符

    • A=B:A等于B
    • A<=>B:A等于B,A和B都为NULL则返回TRUE
    • A<>B, A!=B:A不等于B
    • AB:A小于/大于B
    • A<=B, A>=B:A小于等于/大于等于B
    • A [NOT] BETWEEN B AND C:A的值大于等于B且小于等于C
    • A IS [NOT] NULL:A为NULL
    • A [NOT] LIKE B:A与B匹配,B为简单正则表达式,‘x%‘以x开头,’%x’以x结尾,’%x%'A包含有字母x
    • A RLIKE B, A REGEXP B:A与B匹配,B为Java正则表达式

    函数

    数学函数

    返回值类型样式描述
    BIGINTround(DOUBLE d)取整
    DOUBLEround(DOUBLE d, INT n)保留n位小数
    BIGINTfloor(DOUBLE d)向下取整
    BIGINTceil(DOUBLE d)向上取整
    DOUBLErand(), rand(INT seed)返回DOUBLE随机数
    DOUBLEexp(DOUBLE d)返回e的d次方
    DOUBLEln(DOUBLE d)以自然数为底,d的对数
    DOUBLElog10(DOUBLE d)以10为底,d的对数
    DOUBLElog2(DOUBLE d)以2为底,d的对数
    DOUBLElog(DOUBLE base, DOUBLE d)以base为底,d的对数
    DOUBLEpow(DOUBLE d, DOUBLE p)d的p次幂
    DOUBLEsqrt(DOUBLE d)d的平方根
    STRINGbin(BIGINT i)i的二进制形式
    STRINGhex(BIGINT i), hex(STRING str), hex(BINARY b)返回十六进制形式
    STRINGunhex(STRING i)十六进制转十进制
    STRINGconv(STRING/BIGINT num, INT from_base, INT to_base)num从from_base进制转to_base进制
    DOUBLEabs(DOUBLE d)返回绝对值
    INTpmod(INT i1, INT i2)i1对i2取模
    DOUBLEpmod(DOUBLE d1, DOUBLE d2)d1对d2取模
    DOUBLEsin(DOUBLE d)返回d的正弦值
    DOUBLEasin(DOUBLE d)返回d的反正弦值
    DOUBLEcos(DOUBLE d)返回d的余弦值
    DOUBLEacos(DOUBLE d)返回d的反余弦值
    DOUBLEtan(DOUBLE d)返回d的正切值
    DOUBLEatan(DOUBLE d)返回d的反正切值
    DOUBLEdegrees(DOUBLE d)弧度值d转换成角度值
    DOUBLEradians(DOUBLE d)角度值d转换成弧度值
    INTpositive(INT i)返回正数值
    DOUBLEpositive(INT i)返回正数值
    INTnegative(INT i)返回负数值
    DOUBLEnegative(DOUBLE d)返回负数值
    FLOATsign(DOUBLE d)d是正数返回1.0,负数则返回-1.0,否则返回0.0
    DOUBLEe()数学常数e
    DOUBLEpi()数学常数pi

    聚合函数

    返回值类型样式描述
    BIGINTcount(*)计算总行数,包括含有NULL值的行
    BIGINTcount([DISTINCT] expr)计算expr的值[去重后]非NULL的行数
    DOUBLEsum([DISTINCT] col)计算指定行的值[去重后]的和
    DOUBLEavg([DISTINCT] col)计算指定行的值[去重后]的和
    DOUBLEmin(col)计算指定行的最小值
    DOUBLEmax(col)计算指定行的最大值
    ARRAYcollect_set(col)返回集合col去重后的数组
    DOUBLEvar_pop(col)计算指定行的值的方差
    DOUBLEvar_samp(col)计算指定行的值的样本方差
    DOUBLEstddev_pop(col)计算指定行的值的标准差
    DOUBLEstddev_samp(col)计算指定行的值的样本标准差
    DOUBLEcovar_pop(col1, col2)计算两行的值的协方差
    DOUBLEcovar_samp(col1, col2)计算两行的值的样本协方差
    DOUBLEcorr(col1, col2)计算两行的值的相关系数
    DOUBLEpercentile(BIGINT int_expr, p)int_expr在p(范围[0,1])出的对应百分比
    ARRAYpercentile(BIGINT int_expr, ARRAY(P1[,P2,…]))int_expr在p(范围[0,1])出的对应百分比
    DOUBLEpercentile_approx(DOUBLE col, p[, NB])col在p处的对应百分比,NB是用于估计的直方图中的仓库数量
    ARRAYpercentile_approx(DOUBLE col, ARRAY(P1[,P2,…])[, NB])col在p处的对应百分比,NB是用于估计的直方图中的仓库数量
    ARRAYhistogram_numeric(col, NB)返回NB数量的直方图数组,返回结果中值x是中心,值y是高度

    表生成函数

    返回值类型样式描述
    N行结果explode(ARRAY array)返回0到多行结果,每行都对应输入的array数组中的一个元素
    N行结果explode(MAP map)返回0到多行结果,每行都对应每个map键值对,其中一个字段是键,另一个字段是值
    结果插入表中inline(ARRAY)将结构体数组提取出来并插入到表中
    TUPLEjson_tuple(STRING jsonStr, p1, p2,…, pn)与get_json_object UDF作用类似,可通过一次调用获得多个键值
    TUPLEparse_url_tuple(url, partname1, partname2, …, partnameN)从url中解析出N个部分信息,抽取部分名称有HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO, QUERY
    N行结果stack(INT n, col1, …, colM)把M列转换成N行,每行有M/N个字段

    其他内置函数

    返回值类型样式描述
    STRINGascii(STRING s)返回s中首个ASCII字符的整数值
    STRINGbase64(BINARY bin)将二进制bin转换成基于64位的字符串
    BINARYunbase64(STRING str)将字符串转换成二进制值
    BINARYbinary(STRING s), binary(BINARY b)将输入值转换成二进制值
    typecast(/ AS )类型转换,转换失败返回NULL
    STRINGconcat(STRING s1, STRING s2, …)拼接字符串
    STRINGconcat_ws(STRING separator, STRING s1, STRING s2, …)用指定分隔符拼接字符串
    INTfind_in_set(STRING s, STRING commaSeparatedString)返回在以逗号分隔的字符串中s出现的位置,没有找到返回NULL
    STRINGformat_number(NUMBER x, INT d)将数值x转换成’1,234,567.89’格式字符串,并保留d位小数
    STRINGget_json_object(STRING json_string, STRING path)从给定路径上的JSON字符串中抽取出JSON对象,并返回这个对象的JSON字符串形式
    BOOLEANin判断是否包含于列表
    BOOLEANin_file(STRING s, STRING filename)判断是否文件filename中有一行数据与字符串s完全匹配
    INTinstr(STRING str, STRING substr)字符串str中字符串子串substr第一次出现的位置
    INTlength(STRING s)字符串的长度
    INTsize(MAP), size(ARRAY/)MAP或ARRAY中的元素的个数
    INTlocate(STRING substr, STRING str[, INT pos])查找在字符串str中pos位置后字符串substr第一次出现的位置
    STRINGlower(STRING), lcase(STRING)转换成小写
    STRINGupper(STRING), ucase(STRING)转换成大写
    STRINGlpad(STRING s, INT len, STRING pad)从左边对字符串s用字符串pad进行填充至长度len。若字符串s长度大于len,去掉多余部分
    STRINGrpad(STRING s, INT len, STRING pad)从右边对字符串s用字符串pad进行填充至长度len。若字符串s长度大于len,去掉多余部分
    STRINGltrim(STRING s)字符串s前面全部空格去掉
    STRINGrtrim(STRING s)字符串s后面全部空格去掉
    STRINGtrim(STRING s)字符串s前后全部空格去掉
    STRINGparse_url(STRING url, STRING partname[, STRING key])从url中抽取指定部分内容
    STRINGprintf(STRING format, Obj … args)按printf风格输出字符串
    STRINGregexp_extract(STRING subject, String regex_pattern, STRING index)抽取字符串subject中符合正则表达式regex_pattern的第index个部分的子字符串
    STRINGregexp_replace(STRING s, STRING regex, STRING replacement)将字符串s中符合条件的部分替换成replacement
    STRINGrepeat(STRING s, INT n)重复输出n次字符串s
    STRINGreverse(STRING s)反转字符串
    STRINGspace(INT n)返回n个空格
    ARRAYsplit(STRING s, STRING pattern)按pattern分割字符串
    MAPstr_to_map(STRING s, STRING delim1, STRING delim2)将字符串按照指定分隔符转换成Map,delim1是键值对之间的分隔符,delim2是键和值之间的分隔符
    STRINGsubstr(STRING s, INT start_index, INT length)从start位置开始截取length长度的字符串
    STRINGtranslate(STRING input, STRING from, STRING to)将字符串input中含有的from中每个位置上的字符用to中对应位置的字符替换
    STRINGfrom_unixtime(BIGINT unixtime[, STRING format])将时间戳秒数转换成UTC时间,format可指定输出格式
    BIGINTunix_timestamp()获取当前本地时区下的当前时间戳
    BIGINTunix_timestamp(STRING date)转换成Unix时间戳,date格式必须是yyyy-MM-dd HH:mm:ss
    BIGINTunix_timestamp(STRING date, STRING pattern)将指定时间字符串格式字符串转换成Unix时间戳
    STRINGto_date(STRING timestamp)返回时间字符串日期部分
    INTyear(STRING date)返回时间字符串的年份
    INTmonth(STRING date)返回时间字符串的月份
    INTday(STRING date), dayofmonth(STRING date)返回时间字符串的天
    INThour(STRING date)返回时间字符串的小时
    INTminute(STRING date)返回时间字符串的分钟
    INTsecond(STRING date)返回时间字符串的秒数
    INTweekofyear(STRING date)返回时间字符串位于一年中第几个周内
    INTdatediff(STRING enddate, STRING startdate)两个时间的相差天数
    STRINGdate_add(STRING date, INT days)增加days天
    STRINGdate_sub(STRING date, INT days)减少days天
    TIMESTAMPfrom_utc_timestamp(TIMESTAMP timestamp, STRING timezone)转换成指定时区下的时间戳
    TIMESTAMPto_utc_timestamp(TIMESTAMP timestamp, STRING timezone)转换成UTC下的时间戳
    ARRAY>ngrams(ARRAY>, INT N, INT K, INT pf)估算文件中前K个字尾,pf是精度系数
    ARRAY>context_ngrams(ARRAY>, ARRAY, INT K, INT pf)从每个外层数组的第二个单词数组来查找前K个字尾
    STRINGdecode(BINARY bin, STRING charset)使用指定字符集charset将二进制值bin解码成字符串,支持的字符集有’US_ASCII’, ‘ISO-8859-1’, ‘UTF-8’, ‘UTF-16BE’, ‘UTF-16LE’, ‘UTF-16’
    BINARYencode(STRING src, STRING charset)使用指定字符集将src编码成二进制值
    ARRAY>sentences(STRING s, STRING lang, STRING locale)将字符串s转换成句子数组

    视图

    视图可以允许保存一个查询并像对待表一样对这个查询进行操作,但不会像表一样存储数据。可以通过使用视图将查询语句分割成多个小的、更可控的片段来降低复杂度,常见的使用场景是基于一个或多个列的值来限制输出结果。

    CREATE VIEW v AS
    SELECT * FROM t1 JOIN t2
    ON (t1.id=t2.id) WHERE t1.firstname='jack';
    
    SELECT lastname from v WHERE id=3;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    索引

    • 索引(Index)用于提高数据表的查询速度。一个表可以创建多个索引,一个索引可以包含一个或者多个字段。
    • 索引是根据表的一个或者多个字段生成的子表,该子表中的数据已经进行了排序。子表除了包含指定字段中的数据,还包含一个 rowid 列,用于存储当前记录在原始表中的位置。用户无法看到索引,它只是用来加快查询速度。
    • 在表中插入、修改或者删除数据时,数据库引擎也必须维护索引,以保持索引和原始表的同步;也就是说,使用索引是有额外开销的。
    CREATE TABLE employees (
    	name			STRING,
    	salary			FLOAT,
    	subordinates	ARRAY<STRING>,
    	deductions		MAP<STRING, FLOAT>,
    	address			STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
    )
    PARTITIONED BY (country STRING, state STRING);
    
    -- 对分区字段country建立索引
    CREATE INDEX employees_index
    ON TABLE employees (country)
    AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
    WITH DEFERRED REBUILD
    INXPROPERTIES ('created_at'='2022')
    IN TABLE employees_index_table
    PARTITIONED BY (country, name)
    COMMENT 'Employees indexed by country and name';
    
    -- Bitmap索引
    CREATE INDEX employees_index
    ON TABLE employees (country)
    AS 'BITMAP'
    WITH DEFERRED REBUILD
    INXPROPERTIES ('created_at'='2022')
    IN TABLE employees_index_table
    PARTITIONED BY (country, name)
    COMMENT 'Employees indexes';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    注意事项

    严格模式 hive.mapred.mode=strict

    • 对于分区表必须含有分区字段过滤条件
    • 使用了order by 必须使用LIMIT
    • 限制笛卡尔积查询,执行JOIN查询时不能用where代替on
  • 相关阅读:
    【可靠性测试】什么是可靠性测试:定义、方法和工具
    面试系列多线程:Tomcat线程池的原理
    webrtc基于DTLS的端口复用技术
    黑马程序员spring+springMVC+Maven高级+springboot+MyBatisPlus总结之SpringMvc参数传递
    【老生谈算法】matlab实现分形树源码——分形树
    jsbarcode生成条码
    gulimall基础篇回顾Day-10
    CEX暴雷怎么办 一文读懂加密钱包产业现状
    ESP8266-Arduino编程实例-ML8511紫外线(UV)传感器驱动
    (数据结构)数据结构的三要素
  • 原文地址:https://blog.csdn.net/qq_31478771/article/details/126728080