一、SELECT…FROM…

  1. 查询语句
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);
  • . 关键字解析
    SELECT :
    指定要保存的列以及输出函数需要调用的一个或多个列
    FROM:
    标识从哪个表、视图或嵌套查询中选择记录
  • SELECT列字段的类型
    当用户选择的列是集合数据类型时,Hive会使用JSON语法应用于输出
    集合的字符串元素是加引号的,基本类型STRING的列值是不加引号的

数组类型:

查询结果使用一个被括在[…]内的以逗号分隔的列表表示
如subordinates列:

hive> SELECT name,subordinates FROM employees;
Join Doe 		 ["Mary Smith","Todd Jones"]
Mary Smith  	 ["Bill King"]
Todd Jones		 []
Bill King		 []

MAP类型:
使用JSON格式表达map,使用一个被括在{…}内的以逗号分隔的键:值对列表进行表示;
如deductions列:

hive> SELECT name,deductions FROM employees;
John Doe	{"Federal Taxes":0.2,"State Taxes":0.05,"Insurance":0.1}
Mary Smith	{"Federal Taxes":0.2,"State Taxes":0.05,"Insurance":0.1}
Todd Jones	{"Federal Taxes":0.15,"State Taxes":0.03,"Insurance":0.1}

STRUCT类型:
使用JSONmap格式进行表示
如address列:

hive> SELECT name,address FROM employees;
 John Doe 	{"street":"1 Michigan Ave.","city":"Chicago","state":"IL"}
 Mary Smith	{"street":"100 Ontario St.","city":"Chicago","state":"IL"}
 Todd Jones {"street":"200 Chicago Ave.","city":"Oak Park","state":"IL"}
  • 引用集合数据类型中的元素

SELECT 和WHERE子句中都可以使用这种引用方式

数组类型:
数组索引基于0
如subordinates数组中的第一个元素subordinates[0]
引用一个不存在的元素将返回NULL,同时提取出的STRING数据类型的值不加引号

hive> SELECT name,subordinates[0] FROM employees;
Join Doe 		Mary Smith
Mary Smith 		Bill King
Todd Jones		NULL
Bill King		NULL

MAP类型:
使用ARRAY[…]语法,但是使用的是键值而不是整数索引

hive> SELECT name,subordinates[0] FROM employees;
Join Doe 		0.05
Mary Smith 		0.05
Todd Jones		0.03
Bill King		0.03

STRUCT类型:
使用“点”符号引用STRUCT中的元素

hive> SELECT name,subordinates[0] FROM employees;
Join Doe 		Chicago
Mary Smith 		Chicago
Todd Jones		Oak Park
Bill King		Obscuria
  1. 使用正则表达式来指定列

SELECT symbol, 'price.*' FROM stocks; 从表stocks中选择symbol列和所有列名以price作为前缀的列

  1. 使用列值进行计算
SELECT  upper(name), salary, deductions["Federal Taxes"],
		round(salary*(1-deductions["Federal Taxes"]))
FROM employees;
  1. 算数运算符

接受任意的数值类型,如果数据类型不同,两种类型中值范围较小的那个数据类型将转换为其他范围更广的数据类型;
(范围更广,即一个类型具有更多的字节从而可以容纳更大范围的值)

运算符		类型		描述
A+B			数值		A加B
A-B			数值		A减去B
A*B			数值		A和B相乘
A/B			数值		A除以B,如果能整除,返回商数
A%B			数值		A除以B的余数
A&B			数值		A和B按位取与
A|B			数值		A和B按位取或
A^B			数值		A和B按位取异或
~A			数值		A按位取反
  1. 使用函数

数学函数:
处理单个列的数据

聚合函数:
处理多行数据的计算

表生成函数:
与聚合函数相反,可以将单列扩展成多列或者多行

  1. LIMIT语句

限制返回的行数

SELECT  upper(name), salary, deductions["Federal Taxes"],
		round(salary*(1-deductions["Federal Taxes"]))
FROM employees
LIMIT 2;
  1. 列别名
SELECT  
upper(name), salary, deductions["Federal Taxes"] as fed_taxes,
round(salary*(1-deductions["Federal Taxes"])) as salary_minus_ted_taxes
FROM employees
LIMIT 2;
  1. 嵌套SELECT语句
FROM(
SELECT upper(name), salary, deductions["Federal Taxes"] as fed_taxes,
round(salary*(1-deductions["Federal Taxes"])) as salary_minus_ted_taxes
FROM employees
)e
SELECT e.name,e.salary_minus_fed_taxes
WHERE e.salary_minus_fed_taxes>70000;

给结果集起了个别名,称之为e

  1. CASE…WHEN…THEN句式

和IF语句类似,用于处理单个列的查询结果

SELECT name,salary,
	CASE
		WHEN salary<50000.0 THEN 'low'
		WHEN salary<50000.0 	AND salary<70000.0 THEN 'middle'
		WHEN salary<70000.0 	AND salary<100000.0 THEN 'high'
		ELSE 'very high'
	END AS bracket FROM employees;
  1. 什么情况下Hive可以避免进行MapReduce

大多数情况下查询都会出发一个MapReduce任务(job)
Hive对某些情况的查询可以不必使用MapReduce,即本地模式

SELECT * FROM employees;
这种情况下Hive可以简单地读取employees对应的存储目录下的文件,然后输出格式化后的内容到控制台

对于WHERE语句中过滤条件只是分区字段(无论是否使用LIMIT语句限制输出记录条数),也无需MapReduce过程

SELECT * FROM employees
WHERE country='US' AND state='CA'
LIMIT 100;

如果属性hive.exec.mode.local.auto的值设置为true,Hive还会尝试使用本地模式执行其他操作;
set hive.exec.mode.local.auto=true 否则Hive使用MapReduce来执行其他所有的查询