热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HadoopHivesql语法详解GarfieldEr007

Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并

Hadoop Hive sql 语法详解

2017-07-07 22:41  GarfieldEr007  阅读(36404)  评论(1)  编辑  收藏  举报

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据。而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持Hive 做更复杂的数据分析。

它与关系型数据库的SQL 略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。

HIVE的特点:可伸缩(在Hadoop的集群上动态的添加设备),可扩展,容错,输入格式的松散耦合。

Hive 的官方文档中对查询语言有了很详细的描述,请参考:http://wiki.apache.org/hadoop/Hive/LanguageManual ,本文的内容大部分翻译自该页面,期间加入了一些在使用过程中需要注意到的事项。

1. DDL 操作

建表:

  1. CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
  2. [(col_name data_type [COMMENT col_comment], ...)]
  3. [COMMENT table_comment]
  4. [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  5. [CLUSTERED BY (col_name, col_name, ...)
  6. [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  7. [ROW FORMAT row_format]
  8. [STORED AS file_format]
  9. [LOCATION hdfs_path]

CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常

EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)

LIKE 允许用户复制现有的表结构,但是不复制数据

COMMENT可以为表与字段增加描述

ROW FORMAT

  1. DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
  2. [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
  3. | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表的具体的列的数据。

STORED AS

  1. SEQUENCEFILE
  2. | TEXTFILE
  3. | RCFILE
  4. | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。

  • 创建简单表:
  1. hive> CREATE TABLE pokes (foo INT, bar STRING);
  • 创建外部表:
  1. CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
  2. page_url STRING, referrer_url STRING,
  3. ip STRING COMMENT \'IP Address of the User\',
  4. country STRING COMMENT \'country of origination\')
  5. COMMENT \'This is the staging page view table\'
  6. ROW FORMAT DELIMITED FIELDS TERMINATED BY \'\054\'
  7. STORED AS TEXTFILE
  8. LOCATION \'\';
  • 建分区表
  1. CREATE TABLE par_table(viewTime INT, userid BIGINT,
  2. page_url STRING, referrer_url STRING,
  3. ip STRING COMMENT \'IP Address of the User\')
  4. COMMENT \'This is the page view table\'
  5. PARTITIONED BY(date STRING, pos STRING)
  6. ROW FORMAT DELIMITED \t
  7. FIELDS TERMINATED BY \'\n\'
  8. STORED AS SEQUENCEFILE;
  • 建Bucket表
  1. CREATE TABLE par_table(viewTime INT, userid BIGINT,
  2. page_url STRING, referrer_url STRING,
  3. ip STRING COMMENT \'IP Address of the User\')
  4. COMMENT \'This is the page view table\'
  5. PARTITIONED BY(date STRING, pos STRING)
  6. CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
  7. ROW FORMAT DELIMITED \t
  8. FIELDS TERMINATED BY \'\n\'
  9. STORED AS SEQUENCEFILE;
  • 创建表并创建索引字段ds
  1. hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
  • 复制一个空表
  1. CREATE TABLE empty_key_value_store
  2. LIKE key_value_store;

例子

  1. create table user_info (user_id int, cid string, ckid string, username string)
  2. row format delimited
  3. fields terminated by \'\t\'
  4. lines terminated by \'\n\';

导入数据表的数据格式是:字段之间是tab键分割,行之间是断行。

及要我们的文件内容格式:

  1. 100636 100890 c5c86f4cddc15eb7 yyyvybtvt
  2. 100612 100865 97cc70d411c18b6f gyvcycy
  3. 100078 100087 ecd6026a15ffddf5 qa000100
  • 显示所有表:
  1. hive> SHOW TABLES;

按正条件(正则表达式)显示表,

  1. hive> SHOW TABLES \'.*s\';

修改表结构

  • 表添加一列 :
  1. hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
  • 添加一列并增加列字段注释
  1. hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT \'a comment\');
  • 更改表名:
  1. hive> ALTER TABLE events RENAME TO 3koobecaf;
  • 删除列:
  1. hive> DROP TABLE pokes;

增加、删除分区

  • 增加
  1. ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec
  2. [ LOCATION \'location1\' ] partition_spec [ LOCATION \'location2\' ] ...
  3. partition_spec:
  4. : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
  • 删除
  1. ALTER TABLE table_name DROP partition_spec, partition_spec,...
  • 重命名表
  1. ALTER TABLE table_name RENAME TO new_table_name
  • 修改列的名字、类型、位置、注释:
  1. ALTER TABLE table_name CHANGE [COLUMN] col_old_name
  2. col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

这个命令可以允许改变列名、数据类型、注释、列位置或者它们的任意组合

  • 表添加一列 :
  1. hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
  • 添加一列并增加列字段注释
  1. hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT \'a comment\');
  • 增加/更新列
  1. ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)

ADD是代表新增一字段,字段位置在所有列后面(partition列前)

REPLACE则是表示替换表中所有字段。

  • 增加表的元数据信息
  1. ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties:
  2. :[property_name = property_value…..]

用户可以用这个命令向表中增加metadata

  • 改变表文件格式与组织
  1. ALTER TABLE table_name SET FILEFORMAT file_format
  2. ?ALTER TABLE table_name CLUSTERED BY(userid) SORTED BY(viewTime) INTO num_buckets BUCKETS

这个命令修改了表的物理存储属性

  • 创建/删除视图
  1. CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...)
  2. ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT
  • 增加视图

如果没有提供表名,视图列的名字将由定义的SELECT表达式自动生成

如果修改基本表的属性,视图中不会体现,无效查询将会失败

视图是只读的,不能用LOAD/INSERT/ALTER

  • 删除视图
  1. DROP VIEW view_name
  • 创建数据库
  1. CREATE DATABASE name
  • 显示命令
  1. show tables;
  2. ?show databases;
  3. ?show partitions ;
  4. ?show functions
  5. ?describe extended table_name dot col_name

2. DML 操作:元数据存储

hive不支持用insert语句一条一条的进行插入操作,也不支持update操作。数据是以load的方式加载到建立好的表中。数据一旦导入就不可以修改。

DML包括:INSERT插入、UPDATE更新、DELETE删除

  • 向数据表内加载文件
  1. LOAD DATA [LOCAL] INPATH \'filepath\' [OVERWRITE] INTO TABLE tablename
  2. [PARTITION (partcol1=val1, partcol2=val2 ...)]

Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。

  • filepath

    • 相对路径,例如:project/data1
    • 绝对路径,例如: /user/hive/project/data1

包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1

例如:

  1. hive> LOAD DATA LOCAL INPATH \'./examples/files/kv1.txt\' OVERWRITE INTO TABLE pokes;
  • 加载本地数据,同时给定分区信息

    加载的目标可以是一个表或者分区。如果表包含分区,必须指定每一个分区的分区名

    filepath 可以引用一个文件(这种情况下,Hive 会将文件移动到表所对应的目录中)或者是一个目录(在这种情况下,Hive 会将目录中的所有文件移动至表所对应的目录中)

  • LOCAL关键字

    指定了LOCAL,即本地

    load 命令会去查找本地文件系统中的 filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的 URI,比如:file:///user/hive/project/data1.

load 命令会将 filepath 中的文件复制到目标文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置

3. DQL 操作:数据查询SQL

3.1 基本的Select 操作

  1. SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  2. FROM table_reference
  3. [WHERE where_condition]
  4. [GROUP BY col_list [HAVING condition]]
  5. [ CLUSTER BY col_list
  6. | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
  7. ]
  8. [LIMIT number]

使用ALL和DISTINCT选项区分对重复记录的处理。默认是ALL,表示查询所有记录。DISTINCT表示去掉重复的记录

  • Where 条件

类似我们传统SQL的where 条件

目前支持 AND,OR ,0.9版本支持between

  • IN, NOT IN

  • 不支持EXIST ,NOT EXIST

  • ORDER BY与SORT BY的不同

  • ORDER BY 全局排序,只有一个Reduce任务

  • SORT BY 只在本机做排序

  • Limit

Limit 可以限制查询的记录数

  1. SELECT * FROM t1 LIMIT 5
  • 实现Top k 查询

下面的查询语句查询销售记录最大的 5 个销售代表。

  1. SET mapred.reduce.tasks = 1
  2. SELECT * FROM test SORT BY amount DESC LIMIT 5
  3. REGEX Column Specification

SELECT 语句可以使用正则表达式做列选择,下面的语句查询除了 ds 和 hr 之外的所有列:

  1. SELECT `(ds|hr)?+.+` FROM test

4. 从SQL到HiveQL应转变的习惯

1、Hive不支持等值连接

SQL中对两表内联可以写成:

  1. select * from dual a,dual b where a.key = b.key;

Hive中应为

  1. select * from dual a join dual b on a.key = b.key;

而不是传统的格式:

  1. SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2
  2. WHERE t1.a2 = t2.b2

2、分号字符

分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

  1. select concat(key,concat(\';\',key)) from dual;

但HiveQL在解析语句时提示:

  1. FAILED: Parse Error: line 0:-1 mismatched input \'\' expecting ) in function specification

解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

  1. select concat(key,concat(\'\073\',key)) from dual;

3、IS [NOT] NULL

SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.

4、Hive不支持将数据插入现有的表或分区中,仅支持覆盖重写整个表,示例如下:

  1. INSERT OVERWRITE TABLE t1
  2. SELECT * FROM t2;

from: http://blog.leanote.com/post/mouto/Untitled-553318f738f41124b200001b-38


推荐阅读
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • MapReduce统计每个用户的使用总流量
    1、原始数据2、使用java程序1)新建项目2)导包  hadoop-2.7.3\share\hadoop\mapreducehsfs的那些包commo ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • 如何提升Python处理约1GB数据集时的运行效率?
    如何提升Python处理约1GB数据集时的运行效率?本文探讨了在后端开发中使用Python处理大规模数据集的优化方法。通过分析常见的性能瓶颈,介绍了多种提高数据处理速度的技术,包括使用高效的数据结构、并行计算、内存管理和代码优化策略。此外,文章还提供了在Ubuntu环境下配置和测试这些优化方案的具体步骤,适用于从事推荐系统等领域的开发者。 ... [详细]
  • Hadoop——实验七:MapReduce编程实践
    文章目录一.实验目的二.实验内容三.实验步骤及结果分析 1.基于ubuntukylin14.04(7)版本,安装hadoop-eclipse-kepler-plugi ... [详细]
author-avatar
柯韵亚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有