$ HiveQL

$ Hive的变量

Hive的变量前面有一个命名空间:

命名空间 可省略 使用权限 详细描述
hivevar rw 用户自定义变量,通过--define k=v或者是--hivevar k=v来声明
hiveconf rw hive-site.xml下面的配置变量值
system rw 系统变量,包括JVM的运行环境
env r 环境变量,包括Shell环境下的变量信息

$ DQL

利用正则表达式过滤列名:

--其中col_name* 是指不要查询的列名。
select table.`(col_name1|col_name2|col_name3)?+.+`  from table;

支持的算术运算符:

A+B,A-B,A*B,A/B,A%B,A|B,A^B,~A

$ 数学函数

round(d),floor(d),log10(d),abs(d),sin(d)...

$ 聚合函数

函数 备注
count(*) 含有null的总行数
count(expr) 提供expr表达式的非null行数
count(distinct expr[,expr])
sum(distinct col)
avg(distinct col)
variance(col) 方差
var_sampl(col) 样本方差
stddev_pop(col) 标准差
stddev_samp(col) 标准样本方差
covar_pop(col) 协方差
covar_samp(col) 样本协方差
corr(col1, col2) 相关系数
percentile(bigint expr, double p)
histogram_numeric(col, NB)
collect_set(col) 返回集合col元素排重后的数组

$ JOIN

Hive中除了支持和传统数据库中一样的内关联、左关联、右关联、全关联,还支持LEFT SEMI JOIN和CROSS JOIN,但这两种JOIN类型也可以用前面的代替:

  • JOIN
  • LEFT JOIN
  • RIGTH JOIN
  • FULL OUTER JOIN
  • Hive LEFT SEMI JOIN
  • Hive Cross Join

注意

  • Hive中Join的关联键必须在ON ()中指定,不能在Where中指定,否则就会先做笛卡尔积,再过滤。
  • FULL JOIN时候,Hive不会使用MapJoin来优化。

$ DML

$ 装载数据

LOAD DATA LOCAL INPATH ''
OVERWRITE INTO TABLE emploees
PARTITION(country='us')

$ 参考

LanguageManualDML-Syntax.1 (opens new window)

$ 分区

您可以使用Hive ALTER TABLE命令 (opens new window)更改HDFS目录位置或添加新目录:

ALTER TABLE some_table PARTITION(year = 2012) 
SET LOCATION 'hdfs://user/user1/some_table/2012';

此命令不会移动旧数据,也不会删除旧数据。它只是将Hive表分区设置为新位置。

$ 删除或删除配置单元分区

您可以使用带有DROP PARTITION选项的ALTER TABLE来删除表的分区。

ALTER TABLE some_table DROP IF EXISTS PARTITION(year = 2012);

参考:How to Update or Drop Hive Partition? Steps and Examples (opens new window)

$ 动态分区

PARTITION()语句中必须列出所有分区字段。

INSERT ... SELECT ...语句中,动态分区字段必须按照PARTITION()语句中的顺序排列在SELECT字段的最后。

所有分区字段都是动态分区字段(nonstrict模式生效):

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT OVERWRITE TABLE T PARTITION (ds, hr)
SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr > 10;

混合动态分区字段和静态分区字段(如果静态分区字段是动态分区字段的子分区将会抛出异常):

INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)
SELECT key, value, /*ds,*/ hr FROM srcpart WHERE ds is not null and hr>10;

多表插入:

FROM S
INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)
SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr>10
INSERT OVERWRITE TABLE R PARTITION (ds='2010-03-03, hr=12)
SELECT key, value, ds, hr from srcpart where ds is not null and hr = 12;

CreateTableAS语句需要指定所有分区字段:

CREATE TABLE T (key int, value string) PARTITIONED BY (ds string, hr int) AS
  SELECT key, value, ds, hr+1 hr1 FROM srcpart WHERE ds is not null and hr>10;

$ 参考

DynamicPartitions (opens new window)

更新时间: 9/23/2020, 12:47:14 PM