HDFS(Hadoop分布式文件系统)管理着集群中的数据,每个数据块(block)被冗余多份。
HQL用于查询存储在Hadoop集群中的数据。
HQL不支持行级插入操作、更新操作和删除操作
MapReduce是一种计算模型,可将大型数据处理任务分解成很多单个的、可以在服务器集群中并行执行的任务,这些任务的计算结果可以合并在一起来计算最终的结果。
map操作会将集合中的元素从一种形式转换成另一种形式。reduce过程的目的是将值的集合转换成一个值,或者转换成另一个集合。job可以不需要reduce过程。
| 数据类型 | 长度 | 例子 |
|---|---|---|
| TINYINT | 1byte有符号整数 | 20 |
| SMALLINT | 2byte有符号整数 | 20 |
| INT | 4byte有符号整数 | 20 |
| BIGINT | 8byte有符号整数 | 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”) |
可以修改默认分隔符
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;
-- 创建数据库
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')
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;
-- 创建分区表,改变了数据存储的组织方式,会创建对应子目录,"/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) ;
-- 覆盖掉原内容,使用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;
-- 限制返回的行数
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;
| 返回值类型 | 样式 | 描述 |
|---|---|---|
| BIGINT | round(DOUBLE d) | 取整 |
| DOUBLE | round(DOUBLE d, INT n) | 保留n位小数 |
| BIGINT | floor(DOUBLE d) | 向下取整 |
| BIGINT | ceil(DOUBLE d) | 向上取整 |
| DOUBLE | rand(), rand(INT seed) | 返回DOUBLE随机数 |
| DOUBLE | exp(DOUBLE d) | 返回e的d次方 |
| DOUBLE | ln(DOUBLE d) | 以自然数为底,d的对数 |
| DOUBLE | log10(DOUBLE d) | 以10为底,d的对数 |
| DOUBLE | log2(DOUBLE d) | 以2为底,d的对数 |
| DOUBLE | log(DOUBLE base, DOUBLE d) | 以base为底,d的对数 |
| DOUBLE | pow(DOUBLE d, DOUBLE p) | d的p次幂 |
| DOUBLE | sqrt(DOUBLE d) | d的平方根 |
| STRING | bin(BIGINT i) | i的二进制形式 |
| STRING | hex(BIGINT i), hex(STRING str), hex(BINARY b) | 返回十六进制形式 |
| STRING | unhex(STRING i) | 十六进制转十进制 |
| STRING | conv(STRING/BIGINT num, INT from_base, INT to_base) | num从from_base进制转to_base进制 |
| DOUBLE | abs(DOUBLE d) | 返回绝对值 |
| INT | pmod(INT i1, INT i2) | i1对i2取模 |
| DOUBLE | pmod(DOUBLE d1, DOUBLE d2) | d1对d2取模 |
| DOUBLE | sin(DOUBLE d) | 返回d的正弦值 |
| DOUBLE | asin(DOUBLE d) | 返回d的反正弦值 |
| DOUBLE | cos(DOUBLE d) | 返回d的余弦值 |
| DOUBLE | acos(DOUBLE d) | 返回d的反余弦值 |
| DOUBLE | tan(DOUBLE d) | 返回d的正切值 |
| DOUBLE | atan(DOUBLE d) | 返回d的反正切值 |
| DOUBLE | degrees(DOUBLE d) | 弧度值d转换成角度值 |
| DOUBLE | radians(DOUBLE d) | 角度值d转换成弧度值 |
| INT | positive(INT i) | 返回正数值 |
| DOUBLE | positive(INT i) | 返回正数值 |
| INT | negative(INT i) | 返回负数值 |
| DOUBLE | negative(DOUBLE d) | 返回负数值 |
| FLOAT | sign(DOUBLE d) | d是正数返回1.0,负数则返回-1.0,否则返回0.0 |
| DOUBLE | e() | 数学常数e |
| DOUBLE | pi() | 数学常数pi |
| 返回值类型 | 样式 | 描述 |
|---|---|---|
| BIGINT | count(*) | 计算总行数,包括含有NULL值的行 |
| BIGINT | count([DISTINCT] expr) | 计算expr的值[去重后]非NULL的行数 |
| DOUBLE | sum([DISTINCT] col) | 计算指定行的值[去重后]的和 |
| DOUBLE | avg([DISTINCT] col) | 计算指定行的值[去重后]的和 |
| DOUBLE | min(col) | 计算指定行的最小值 |
| DOUBLE | max(col) | 计算指定行的最大值 |
| ARRAY | collect_set(col) | 返回集合col去重后的数组 |
| DOUBLE | var_pop(col) | 计算指定行的值的方差 |
| DOUBLE | var_samp(col) | 计算指定行的值的样本方差 |
| DOUBLE | stddev_pop(col) | 计算指定行的值的标准差 |
| DOUBLE | stddev_samp(col) | 计算指定行的值的样本标准差 |
| DOUBLE | covar_pop(col1, col2) | 计算两行的值的协方差 |
| DOUBLE | covar_samp(col1, col2) | 计算两行的值的样本协方差 |
| DOUBLE | corr(col1, col2) | 计算两行的值的相关系数 |
| DOUBLE | percentile(BIGINT int_expr, p) | int_expr在p(范围[0,1])出的对应百分比 |
| ARRAY | percentile(BIGINT int_expr, ARRAY(P1[,P2,…])) | int_expr在p(范围[0,1])出的对应百分比 |
| DOUBLE | percentile_approx(DOUBLE col, p[, NB]) | col在p处的对应百分比,NB是用于估计的直方图中的仓库数量 |
| ARRAY | percentile_approx(DOUBLE col, ARRAY(P1[,P2,…])[, NB]) | col在p处的对应百分比,NB是用于估计的直方图中的仓库数量 |
| ARRAY | histogram_numeric(col, NB) | 返回NB数量的直方图数组,返回结果中值x是中心,值y是高度 |
| 返回值类型 | 样式 | 描述 |
|---|---|---|
| N行结果 | explode(ARRAY array) | 返回0到多行结果,每行都对应输入的array数组中的一个元素 |
| N行结果 | explode(MAP map) | 返回0到多行结果,每行都对应每个map键值对,其中一个字段是键,另一个字段是值 |
| 结果插入表中 | inline(ARRAY | 将结构体数组提取出来并插入到表中 |
| TUPLE | json_tuple(STRING jsonStr, p1, p2,…, pn) | 与get_json_object UDF作用类似,可通过一次调用获得多个键值 |
| TUPLE | parse_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个字段 |
| 返回值类型 | 样式 | 描述 |
|---|---|---|
| STRING | ascii(STRING s) | 返回s中首个ASCII字符的整数值 |
| STRING | base64(BINARY bin) | 将二进制bin转换成基于64位的字符串 |
| BINARY | unbase64(STRING str) | 将字符串转换成二进制值 |
| BINARY | binary(STRING s), binary(BINARY b) | 将输入值转换成二进制值 |
| type | cast(/ AS | 类型转换,转换失败返回NULL |
| STRING | concat(STRING s1, STRING s2, …) | 拼接字符串 |
| STRING | concat_ws(STRING separator, STRING s1, STRING s2, …) | 用指定分隔符拼接字符串 |
| INT | find_in_set(STRING s, STRING commaSeparatedString) | 返回在以逗号分隔的字符串中s出现的位置,没有找到返回NULL |
| STRING | format_number(NUMBER x, INT d) | 将数值x转换成’1,234,567.89’格式字符串,并保留d位小数 |
| STRING | get_json_object(STRING json_string, STRING path) | 从给定路径上的JSON字符串中抽取出JSON对象,并返回这个对象的JSON字符串形式 |
| BOOLEAN | in | 判断是否包含于列表 |
| BOOLEAN | in_file(STRING s, STRING filename) | 判断是否文件filename中有一行数据与字符串s完全匹配 |
| INT | instr(STRING str, STRING substr) | 字符串str中字符串子串substr第一次出现的位置 |
| INT | length(STRING s) | 字符串的长度 |
| INT | size(MAP | MAP或ARRAY中的元素的个数 |
| INT | locate(STRING substr, STRING str[, INT pos]) | 查找在字符串str中pos位置后字符串substr第一次出现的位置 |
| STRING | lower(STRING), lcase(STRING) | 转换成小写 |
| STRING | upper(STRING), ucase(STRING) | 转换成大写 |
| STRING | lpad(STRING s, INT len, STRING pad) | 从左边对字符串s用字符串pad进行填充至长度len。若字符串s长度大于len,去掉多余部分 |
| STRING | rpad(STRING s, INT len, STRING pad) | 从右边对字符串s用字符串pad进行填充至长度len。若字符串s长度大于len,去掉多余部分 |
| STRING | ltrim(STRING s) | 字符串s前面全部空格去掉 |
| STRING | rtrim(STRING s) | 字符串s后面全部空格去掉 |
| STRING | trim(STRING s) | 字符串s前后全部空格去掉 |
| STRING | parse_url(STRING url, STRING partname[, STRING key]) | 从url中抽取指定部分内容 |
| STRING | printf(STRING format, Obj … args) | 按printf风格输出字符串 |
| STRING | regexp_extract(STRING subject, String regex_pattern, STRING index) | 抽取字符串subject中符合正则表达式regex_pattern的第index个部分的子字符串 |
| STRING | regexp_replace(STRING s, STRING regex, STRING replacement) | 将字符串s中符合条件的部分替换成replacement |
| STRING | repeat(STRING s, INT n) | 重复输出n次字符串s |
| STRING | reverse(STRING s) | 反转字符串 |
| STRING | space(INT n) | 返回n个空格 |
| ARRAY | split(STRING s, STRING pattern) | 按pattern分割字符串 |
| MAP | str_to_map(STRING s, STRING delim1, STRING delim2) | 将字符串按照指定分隔符转换成Map,delim1是键值对之间的分隔符,delim2是键和值之间的分隔符 |
| STRING | substr(STRING s, INT start_index, INT length) | 从start位置开始截取length长度的字符串 |
| STRING | translate(STRING input, STRING from, STRING to) | 将字符串input中含有的from中每个位置上的字符用to中对应位置的字符替换 |
| STRING | from_unixtime(BIGINT unixtime[, STRING format]) | 将时间戳秒数转换成UTC时间,format可指定输出格式 |
| BIGINT | unix_timestamp() | 获取当前本地时区下的当前时间戳 |
| BIGINT | unix_timestamp(STRING date) | 转换成Unix时间戳,date格式必须是yyyy-MM-dd HH:mm:ss |
| BIGINT | unix_timestamp(STRING date, STRING pattern) | 将指定时间字符串格式字符串转换成Unix时间戳 |
| STRING | to_date(STRING timestamp) | 返回时间字符串日期部分 |
| INT | year(STRING date) | 返回时间字符串的年份 |
| INT | month(STRING date) | 返回时间字符串的月份 |
| INT | day(STRING date), dayofmonth(STRING date) | 返回时间字符串的天 |
| INT | hour(STRING date) | 返回时间字符串的小时 |
| INT | minute(STRING date) | 返回时间字符串的分钟 |
| INT | second(STRING date) | 返回时间字符串的秒数 |
| INT | weekofyear(STRING date) | 返回时间字符串位于一年中第几个周内 |
| INT | datediff(STRING enddate, STRING startdate) | 两个时间的相差天数 |
| STRING | date_add(STRING date, INT days) | 增加days天 |
| STRING | date_sub(STRING date, INT days) | 减少days天 |
| TIMESTAMP | from_utc_timestamp(TIMESTAMP timestamp, STRING timezone) | 转换成指定时区下的时间戳 |
| TIMESTAMP | to_utc_timestamp(TIMESTAMP timestamp, STRING timezone) | 转换成UTC下的时间戳 |
| ARRAY | ngrams(ARRAY | 估算文件中前K个字尾,pf是精度系数 |
| ARRAY | context_ngrams(ARRAY | 从每个外层数组的第二个单词数组来查找前K个字尾 |
| STRING | decode(BINARY bin, STRING charset) | 使用指定字符集charset将二进制值bin解码成字符串,支持的字符集有’US_ASCII’, ‘ISO-8859-1’, ‘UTF-8’, ‘UTF-16BE’, ‘UTF-16LE’, ‘UTF-16’ |
| BINARY | encode(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;
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';
在严格模式 hive.mapred.mode=strict