windows10 安装hive库 hivesql安装
安装 brew
国内安装brew使用下面的脚本:
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装hive
brew install hiveHIVE执行sql语句
hive能直接将sql语句转化为mapreduce代码(下面链接写的非常好)
https://geek-docs.com/hive/hive-tutorial/introduction-of-hive.html
第二张图reduce的过程是拿<x,y>, 每一项的y,分别作为pageid, age
如果我们提交的是查询分析数据的DQL(数据查询语句),Driver就会将该语句提交给自己的编译器Compiler进行语法分析、语法解析、语法优化等一系列操作,最后生成一个MapReduce执行计划。然后根据执行计划生成一个MapReduce的作业,提交给Hadoop MapReduce计算框架处理。
Hive内部预置了很多函数,Hive的执行计划就是根据SQL语句生成这些函数的DAG(有向无环图),然后封装进MapReduce的map和reduce函数中。这个例子中,map函数调用了三个Hive内置函数TableScanOperator、FilterOperator、FileOutputOperator,就完成了map计算,而且无需reduce函数。
SQL教程
SQL不分大小写
查询和更新指令构成了 SQL 的 DML 部分:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
SQL 中最重要的 DDL 语句:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
SELECT
SELECT LastName,FirstName FROM Persons #选取所有列 SELECT * FROM Persons #返回唯一的值 SELECT DISTINCT 列名称 FROM 表名称Where
SELECT * FROM Persons WHERE City='Beijing' #关于数值的值 这是正确的: SELECT * FROM Persons WHERE FirstName='Bush' SELECT * FROM Persons WHERE Year>1965AND和OR
#使用括号来一起使用and和or SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'Order by
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASCInsert
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')Update
# UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'TOP
#选择开头几个或者开头50% SELECT TOP 2 * FROM Persons SELECT TOP 50 PERCENT * FROM PersonsLike
指定pattern
现在,我们希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人 SELECT * FROM Persons WHERE City LIKE 'N%' 接下来,我们希望从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人: SELECT * FROM Persons WHERE City LIKE '%gIN
指定选值范围 SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')BETWEEN
指定数据范围 SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2 如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL: SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'ALIAS
表的别名
假设我们有两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"。 现在,我们希望列出 "John Adams" 的所有定单。 SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'使用别名就是为了好读, 精简sql语句
JOIN
where和join
**where** SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P **join** SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastNameinner join:理解为“有效连接”,两张表中都有的数据才会显示
left join:理解为“有左显示”,比如on a.field=b.field,则显示a表中存在的全部数据及a、b中都有的数据,a中有、b中没有的数据以null显示
right join:理解为“有右显示”,比如on a.field=b.field,则显示b表中存在的全部数据及a、b中都有的数据,b中有、a中没有的数据以null显示
full join:理解为“全连接”,两张表中所有数据都显示,实际就是inner +(left-inner)+(right-inner)
join等同于inner join 等同于where
Full join
现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastNameFULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 “Persons” 中的行在表 “Orders” 中没有匹配,或者如果 “Orders” 中的行在表 “Persons” 中没有匹配,这些行同样会列出。
UNION
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
# 只返回两张表不同的值 SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 # 返回两张表所有值 SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2数据库和表
数据库: database
CREATE DATABASE database_name表: table
本例演示如何创建名为 "Person" 的表。 该表包含 5 个列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City": CREATE TABLE Persons ( Id_P int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) )NULL
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
SQL function
SELECT function(列) FROM 表FIRST() 函数返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
还有Max, min, sum
Group by
我理解下来就是最后, 展现的是多行分组情况,没有group by就是返回一个数据
Having
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value现在我们希望查找客户 “Bush” 或 “Adams” 拥有超过 1500 的订单总金额。
我们在 SQL 语句中增加了一个普通的 WHERE 子句:
CASE
判断,如果gender为'男'或'女',分别设置1,最后统计每个年龄段男女人数 select age, sum(case gender when '男' then 1 else 0 end) male_count, sum(case gender when '女' then 1 else 0 end) female_count from student group by age;IF
以下代码等价于上面的case when select age, sum(if(gender='男',1,0)) male_count, sum(if(gender='女',1,0)) female_count from student group by age;