DISTRIBUTE BY
我们都知道,MapReduce模型是默认是通过hashPartitioner()函数将key/value的keys的hash值来数据分发到对应的Reducers,
DISTRIBUTE BY可以让用户来控制如何将key/value对分发到哪个Reducer。
这在大多数的情况下通常很有用。但是在默写情况下,用户可能需要有自己来决定按某一个字段来将数据分发到Reducers,如下所示:
hive> SELECT s.ymd,s.symbol,s.price_close FROM stocks s
> DISTRIBUTE BY s.symbol
> SORT BY s.symbol ASC,s.ymd ASC;
需要注意的是,DISTRIBUTE BY通常要和SORT BY使用,并且DISTRIBUTE BY必须使用在SORT BY之前。
CLUSTER BY
在上个使用DISTRIBUTE BY的示例中,由DISTRIBUTE BY按s.symbol字段将数据分发到相应的Reducers,然后又SORT BY对Reducer最终输出的数据按s.symbol和s.ymd做升序排序。
CLUSTER BY关键字可以起到DISTRIBUTE BY和SORT BY相同的功能:
hive> SELECT s.ymd,s.symbol,s.price_close FROM stocks s
> CLUSTER BY s.symbol;
使用
DISTRIBUTE BY和
CLUSTER BY都可以起到对Reducers的输出做并行排倒序。
类型转化(Casting)
之前我们已经学习过数据类型转化的示例,如将一个数值转化为FLOAT类型,转换语法为cast(value AS TYPE),比如:
SELECT name,salary FROM employees
WHERE cast(salary AS FLOAT) < 100000.0
如果salary不能转换成FLOAT类型的值的话,Hive会返回NULL。
转换二进制类型的值
从Hive 0.80开始,Hive开始支持二进制类型的值的转换。将BINARY的值b转换成STRING:
SELECT (2.0 * cast(cast(b AS STRING) AS DOUBLE)) FROM src;
同样也可以讲STRING类型转换成BINARY类型。
采样查询
有些时候,用户并不想对一个大数据集的数据做全部的分析处理,对于这种情况,Hive提供了对bucket table的采样查询功能:
hive> SELECT * FROM numbers TABLESAMPLE(BUCKET 1 OUT OF 2 ON number)s;
Hive中的桶下标是从1开始的。
Block数据块数据采样(Block Sampling)
Hive还提供了另外一种采样的语法——Block数据块数据采样,用户可以一个数据块的数据行(rows)采样:
hive> SELECT * FROM numbersflat TABLESAMPLE(0.1 PERCENT) s;
UNION ALL
UNION ALL可以将两个或多个子查询的结果集合并到一块儿,这就要就要合并的结果集必须要有相同的列数,并且相对应的列要有相匹配的类型:
SELECT log.ymd,log.level,log.message
FROM(
SELECT l1.ymd,l1.level,l1.message,'log1' AS source FROM log1 l1
UNION ALL
SELECT l2.ymd,l3.level,l2.message,'log2' AS source FROM log2 l2
) log
SORT BY log.ymd ASC