`
landyer
  • 浏览: 138724 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hive sql语法解读

阅读更多

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://luobeng.blogbus.com/logs/104394168.html

http://ilovejavaforever.javaeye.com/blog/760731

    引言: 原本打算把所有hive相关的sql语法,全部写下来,但是写着写着,发现自己仅仅是在翻译hive的wiki,没有什么有价值的东西,就停止了。今天心情郁闷,又看到这篇一个月前写的学习笔记,防止它永远封存于硬盘。发上来,以资纪念。

 

 

                                              hive sql 学习笔记(1)

一、 创建表 
    在官方的wiki里,example是这样的:

Sql代码  
  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  
  5.     [COMMENT col_comment], ...)]  
  6.   [CLUSTERED BY (col_name, col_name, ...)  
  7.   [SORTED BY (col_name [ASC|DESC], ...)]  
  8.   INTO num_buckets BUCKETS]  
  9.   [ROW FORMAT row_format]  
  10.   [STORED AS file_format]  
  11.   [LOCATION hdfs_path]  

 

    [ROW FORMAT DELIMITED]关键字,是用来设置创建的表在加载数据的时候,支持的列分隔符;
[STORED AS file_format]关键字是用来设置加载数据的数据类型。Hive本身支持的文件格式只有:Text File,Sequence File。如果文件数据是纯文本,可以使用 [STORED AS TEXTFILE]。如果数据需要压缩,使用 [STORED AS SEQUENCE] 。通常情况,只要不需要保存序列化的对象,我们默认采用[STORED AS TEXTFILE]。

 

    那么我们创建一张普通的hive表,hive sql就如下:

Sql代码  
  1. CREATE TABLE test_1(id INTname STRING, city STRING) SORTED BY TEXTFILE ROW FORMAT DELIMITED‘\t’  

 

    其中,hive支持的字段类型,并不多,可以简单的理解为数字类型和字符串类型,详细列表如下:

Sql代码  
  1. TINYINT  
  2. SMALLINT  
  3. INT  
  4. BIGINT  
  5. BOOLEAN  
  6. FLOAT  
  7. DOUBLE  
  8. STRING  

 

    Hive的表,与普通关系型数据库,如mysql在表上有很大的区别,所有hive的表都是一个文件,它是基于Hadoop的文件系统来做的。

    hive总体来说可以总结为三种不同类型的表。


1. 普通表


    普通表的创建,如上所说,不讲了。其中,一个表,就对应一个表名对应的文件。

 

2. 外部表


    EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。具体sql如下:

Sql代码  
  1. CREATE EXTERNAL TABLE test_1(id INTname STRING, city STRING) SORTED BY TEXTFILE ROW FORMAT DELIMITED‘\t’ LOCATION ‘hdfs://../../..’  

 

3. 分区表


    有分区的表可以在创建的时候使用 PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。也可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。具体SQL如下:

Sql代码  
  1. CREATE TABLE test_1(id INTname STRING, city STRING) PARTITIONED BY (pt STRING) SORTED BY TEXTFILE ROW FORMAT DELIMITED‘\t’   

    Hive的排序,因为底层实现的关系,比较不同于普通排序,这里先不讲。

 

     桶的概念,主要是为性能考虑,可以理解为对分区内列,进行再次划分,提高性能。在底层,一个桶其实是一个文件。如果桶划分过多,会导致文件数量暴增,一旦达到系统文件数量的上限,就杯具了。哪种是最优数量,这个哥也不知道。

 

    分区表实际是一个文件夹,表名即文件夹名。每个分区,实际是表名这个文件夹下面的不同文件。分区可以根据时间、地点等等进行划分。比如,每天一个分区,等于每天存每天的数据;或者每个城市,存放每个城市的数据。每次查询数据的时候,只要写下类似 where pt=2010_08_23这样的条件即可查询指定时间得数据。

 

    总体而言,普通表,类似mysql的表结构,外部表的意义更多是指数据的路径映射。分区表,是最难以理解,也是最hive最大的优势。之后会专门针对分区表进行讲解。

 

二、 加载数据


    Hive不支持一条一条的用insert语句进行插入操作,也不支持update的操作。数据是以load的方式,加载到建立好的表中。数据一旦导入,则不可修改。要么drop掉整个表,要么建立新的表,导入新的数据。

官方指导为:

Sql代码  
  1. LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]  

 

    Hive在数据load这块,大方向分为两种方式,load文件或者查询一张表,或者将某张表里的额查询结果插入指定表。
如果划分更细一点个人归纳总结为4种不同的方式的load:

 

1. Load data到指定的表


    直接将file,加载到指定的表,其中,表可以是普通表或者分区表。具体sql如下:

Sql代码  
  1. LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' OVERWRITE INTO TABLE test_1  

     
    关键字[OVERWRITE]意思是是覆盖原表里的数据,不写则不会覆盖。
    关键字[LOCAL]是指你加载文件的来源为本地文件,不写则为hdfs的文件。
    其中
     ‘home/admin/test/test.txt’是相对路径
     ‘/home/admin/test/test.txt’为据对路径

 

2. load到指定表的分区


    直接将file,加载到指定表的指定分区。表本身必须是分区表,如果是普通表,导入会成功,但是数据实际不会被导入。具体sql如下:

Sql代码  
  1. LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' OVERWRITE INTO TABLE test_1 PARTITION(pt=’xxxx)  

 
    load数据,hive支持文件夹的方式,将文件夹内的所有文件,都load到指定表中。Hdfs会将文件系统内的某文件夹路径内的文件,分散到不同的实际物理地址中。这样,在数据量很大的时候,hive支持读取多个文件载入,而不需要限定在唯一的文件中。
    
3. insert+select


    这个是完全不同于文件操作的数据导入方式。官方指导为:

Sql代码  
  1. Standard syntax:  
  2. INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement   
  3.   
  4. Hive extension (multiple inserts):  
  5. FROM from_statement  
  6. INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1  
  7. [INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...  
  8.   
  9. Hive extension (dynamic partition inserts):  
  10. INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement  

 
    这个的用法,和上面两种直接操作file的方式,截然不同。从sql语句本身理解,就是把查询到的数据,直接导入另外一张表。这个暂时不仔细分析,之后查询章节,再细讲。


4. alter 表,对分区操作


    在对表结构进行修改的时候,我们可以增加一个新的分区,在增加新分区的同时,将数据直接load到新的分区当中。

Sql代码  
  1. ALTER TABLE table_name ADD  
  2.   partition_spec [ LOCATION 'location1' ]  
  3.   partition_spec [ LOCATION 'location2' ] ...  

 
三、 查询

   ……

 

分享到:
评论

相关推荐

    Hive_SQL语法大全

    Hive_Sql语法详述,平时工作中遇到的问题,用于Hadoop平台的数据挖掘。

    SQL、Hive SQL等SQL血缘解析工具

    // 具有子查询的sql String hql = "select id,name from (select id from table_1 where id={p0}) t1 inner join (select name --this is name\n from table_2) t2"; // 获取id字段的血缘 LineageNode idNode = ...

    hivesql语句练习

    1.上传tar包 2.解压 tar -zxvf hive-1.2.1.tar.gz 3.安装mysql数据库 推荐yum 在线安装 4.配置hive (a)配置HIVE_HOME环境变量 vi conf/hive-env.sh ... hive -e ‘sql’ bin/hive -e 'select * from t_test'

    HiveSQL基础(一).pdf

    HiveSQL基础(一).pdf

    基于 Antlr4 的 Hive SQL 解析.zip

    基于 Antlr4 的 Hive SQL 解析.zip 大学生课程设计 课程设计 自己大二写的课程设计

    大数据平台和HiveSQL.md

    40.大数据平台和HiveSQL.md40.大数据平台和HiveSQL.md40.大数据平台和HiveSQL.md40.大数据平台和HiveSQL.md40.大数据平台和HiveSQL.md40.大数据平台和HiveSQL.md40.大数据平台和HiveSQL.md40.大数据平台和HiveSQL.md...

    hive-sql语法大全

    hive-sql语法大全

    Hive-SQL语法大全

    Hive-SQL语法大全

    HiveSQL实战题目.docx

    包含HiveSQL题目以及Hive面试题

    HiveSQL解析原理.docx

    HiveSQL解析原理

    11-Hive-SQL语法

    HiveSQL思维导图,便捷整理思路,HiveBeeline、HiveDDL、HiveDML、Hive分区、HiveSerDe

    深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存

    深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存

    Hive sql系统学习教程

    Hive SQL是基于Hadoop的数仓解决方案之一,它提供了类似于SQL的数据操作...总体而言,Hive SQL是面向数据仓库的一种数据操作语言,它使用类似于SQL的语法,同时又能够利用Hadoop的分布式计算能力对海量数据进行处理。

    HiveSQL编译原理

    HiveSQL编译原理

    Hive基础,详解介绍HIVESQL中的语法

    Hive基础,详解介绍HIVESQL中的语法

    Hive SQL语法总结

    Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,它架构在Hadoop之上,通过SQL来对数据进行操作,了解SQL的人,学起来毫不费力。 Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,...

    hive sql解析

    hivesql解析 支持版本<!--<hive.version>1.0.0</hive.version> <hadoop.version>2.4.1</hadoop.version> --> <hive.version>2.0.1</hive.version> <hadoop.version>2.7.2</hadoop.version>

    HiveSQL详细和优化

    HiveSQL详细和优化,以及部分个人点评 This is a brief tutorial that provides an introduction on how to use Apache Hive HiveQL with Hadoop Distributed File System. This tutorial can be your first step ...

    HiveSQL窗口函数.pdf

    HiveSQL窗口函数.pdf

    Hive SQL 编译过程详解

    2.1 Phase1 SQL词法,语法解析 2.1.1 Antlr 2.1.2 抽象语法树AST Tree 2.1.3 样例SQL ........... 2.3 Phase3 逻辑操作符Operator ........... 2.4 Phase4 逻辑层优化器 ........... 2.5 Phase5 OperatorTree生成...

Global site tag (gtag.js) - Google Analytics