句中,而 s.symbol 和 s.ymd 位用 SOTR BY 语句中,如果这两个语句中涉及到的完全相同的列,而且采用的是升序的排序方式(也就是默认的排序方式)在这种情况下 cluster by 就等于前面的2个语句 ,相当于简写:
hive> SELECT s.ymd, s.symbol, s.price_close FROM stock s CLUSTER BY s.symbol;
使用 DISTRIBUTE BY ... SOTR BY 语句或其简化版的 CLUSTER BY 语句会剥夺 SORT BY 的并行性,然而这样可以实现输出文件的数据是全局排序的;
6.8 类型转换
SELECT name, salary FROM employees WHERE cast(salary AS FLOAT )< 10000.0 ; 类型转换的语法: cast(value AS TYPE) 如果不成功则返回 NULL;
需要注意的是 将浮点数转换成整数的推荐方式是使用 round() 或者 floor() 函数,而不是类型转换操作符 cast;
binary 类型只支持 BINARY 类型转换为 STRING 类型;
6.9 抽样查询:
Hive 可以通过对表进行分桶抽样来满足抽样查询
hive>SELECT * FOM numbers TABLESAMPLE (BUCKET 3 OUT OF 10 ON rand()) s; 分桶语句中的分母表示的是数据将会被散列的桶的个数,而分子表示将会选择的桶的个数;
hive>SELECT * FROM numberflat TABLESAMPLE(0.1 PERCENT) s; 按照百分比方式进行抽样,这种是基于行数的;
注意:这种抽样试不一定适用于所遥 文件格式,另外这种抽样方式的最小抽样单元是一个 HDFS 数据块,如果表的数据大小小于普通的块大小的 128M 那么会返回 所有行;
基于百分比的抽样提供了一个变量用于控制基于数据块的调优的种子信息:
<property>
<name>hive.sample.seednumber</name>
<value>0</value>
</property>
6.10 UNION ALL
可以将2 个或多个表进行合并,每个 union 子查询必须都需要有相同的列,而且对应的每个字段的字段类型必须是一致的;这个功能便于将一个长的复杂的 WHERE 语句分割成 2 个或多个 union 子查询,除非源表建立了索,否则 这个查询将会对同一份源数据进行多次拷贝分发;
FROM (FROM src SELECT src.key, src,value WHERE src.key <100
UNION ALL
FROM src SELECT src.key, src,value WHERE src.key >110
) unioninput
INSERT OVERWRITE DIRECTORY '/tmp/union.out' SELECT unionimput.*