Hive和SQL编码新手指南
Apache Hive通常被称为建立在Apache Hadoop之上的数据仓库基础架构。 最初由Facebook开发,每天查询大约20TB的数据,目前,程序员可使用它对存储在文件系统(例如HDFS(Hadoop分布式框架系统))中的大型数据集进行临时查询和分析,而无需了解地图的详细信息 -减少。 Hive最好的部分是Hive引擎将查询隐式转换为有效的链映射减少任务。
Hive的功能:
· 支持不同的存储类型,例如纯文本,csv,Apache Hbase等
· 数据建模,例如创建数据库,表等
· 易于编码; 使用称为HiveQL的类似SQL的查询语言
· ETL功能,例如将数据提取,转换和将数据加载到与联接,分区等结合在一起的表中。
· 包含内置的用户定义函数(UDF)以操纵日期,字符串和其他数据挖掘工具
· 无论布局如何,非结构化数据均以数据形式显示为表格
· 自定义映射器,Reducer和UDF的插件功能
· Hadoop上的增强查询
Hive的用例:
· 文本挖掘-使用map-reduce覆盖和分析具有方便结构的非结构化数据
· 文档索引编制—将标签分配给多个文档,以便于恢复
· 业务查询-查询大量历史数据以获得可行的见解,例如 交易记录,付款记录,客户数据库等
· 日志处理-处理各种类型的日志文件,例如呼叫日志,Web日志,机器日志等。
Hive中的编码
我们将使用一个称为"事务"的表来查看如何在Hive中查询数据。 交易表包含属性ID,项目和销售。
这是任何编程语言的一些最佳编码实践。
Hive中的DDL命令
DDL是数据定义语言(Data Definition Language)的简称,它处理数据库模式和描述,以及如何将数据保留在数据库中。 一些常见的例子是
建立表格
· 创建表-CREATE TABLE transaction(id INT, item STRING, sales FLOAT);
· 对表进行分区- CREATE TABLE transaction(id INT, item STRING, sales FLOAT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\001’ STORED AS TEXTFILE LOCATION <HDFS path name>;
删除表格
· DROP TABLE transaction;
修改表
· ALTER TABLE transaction RENAME TO transaction_front_of_stores;
· 添加列— ALTER TABLE transaction ADD COLUMNS (customer_name STRING);
显示表
· SHOW TABLES;
描述表
· DESCRIBE transaction;
· DESCRIBE EXTENDED transaction;
HIVE中的DML命令
DML是处理数据操作的数据操作语言的简称,包括最常用的SQL语句,例如SELECT,INSERT,UPDATE,DELETE等。它主要用于存储,修改,检索,删除和更新数据。 数据库。
加载数据中
· 从外部文件加载数据— LOAD DATA LOCAL INPATH “<file_path>” [OVERWRITE] INTO TABLE <table name>;
· LOAD DATA LOCAL INPATH “/documents/datasets/transcation.csv” [OVERWRITE] INTO TABLE transaction;
· 从单独的表写入数据集-INSERT OVERWRITE TABLE transaction SELECT id, item, date, volume FROM transaction_updated;
选择声明
select语句用于从数据库表中获取数据。 主要用于查看记录,选择所需的字段元素,获取不同的值以及显示来自任何过滤器,限制或按操作分组的结果。
要从事务表中获取所有记录:
SELECT * FROM Transaction;
要从交易表中获取不同的交易ID:
SELECT DISTINCT ID FROM Transaction;
限制声明
与Select语句一起使用以限制编码器要查看的行数。 任何交易数据库都包含大量数据,这意味着选择每一行都将导致更长的处理时间。
SELECT * FROM transaction LIMIT 10;
过滤条件
SELECT * FROM transaction WHERE sales>100;
按声明分组
分组依据语句用于汇总不同级别的数据。 想一想我们要按项目计算总销售额的情况。
SELECT item, SUM(sales) as sale FROM transaction GROUP BY item;
如果我们想过滤掉所有销售额至少达到1000的商品怎么办?
SELECT item, SUM(sales) as sale FROM transaction GROUP BY item HAVING sale>1000;
Jion Hive
为了合并和检索来自多个表的记录,我们使用了Hive Join。 当前,Hive支持两个或更多表的内部,外部,左和右联接。 语法类似于我们在SQL中使用的语法。 在研究语法之前,让我们了解不同的联接如何工作。
SELECT A.* FROM transaction A {LEFT|RIGHT|FULL} JOIN transaction_date B ON (A.ID=B.ID);
笔记:
· Hive不支持IN / EXISTS子查询
· Hive不支持不包含相等条件的联接条件
· 可以联接多个表,但可以组织表,以使最大的表出现在序列的最后
在Hive中优化查询
要优化配置单元中的查询,这是您应该知道的5条经验法则
· 分组依据,聚合功能和联接默认情况下在化简器中进行,而过滤器操作在映射器中进行
· 使用hive.map.aggr = true选项直接在地图任务中执行第一级聚合
· 根据执行的任务类型设置映射器/还原器的数量。 对于过滤条件,请使用set mapred.mapper.tasks = X;。 对于聚合操作:设置mapred.reduce.tasks = Y;
· 在联接中,序列中的最后一个表通过简化器流式传输,而其他表则被缓冲。 整理表格,使最大的表格出现在序列的最后
· 可以使用STREAM TABLE和MAP JOINS加快连接任务的速度
本文重点介绍Hive,它的功能,用例和Hive查询。 由于许多DML和DDL查询与SQL非常相似,因此它可以充当SQL新手的基础或构建块。
(本文翻译自Angel Das的文章《Introduction to Hive》,参考:https://towardsdatascience.com/introduction-to-hive-859ba31a5769)