一、 创建表

在官方的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]keyword,是用来设置创建的表在载入数据的时候,支持的列分隔符;

[STORED AS file_format]keyword是用来设置载入数据的数据类型。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 keyword能够让用户创建一个外部表,在建表的同一时候指定一个指向实际数据的路径(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

keyword[OVERWRITE]意思是是覆盖原表里的数据,不写则不会覆盖。

    keyword[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. Hive extension (multiple inserts):
  4. FROM from_statement
  5. INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
  6. [INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...
  7. Hive extension (dynamic partition inserts):
  8. 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 语法解读的更多相关文章

  1. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  2. Hive SQL 语法学习与实践

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

  3. Hive SQL语法总结

    Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,它架构在Hadoop之上,通过SQL来对数据进行操作. Hive 查询操作过程严格遵守Hadoop MapReduce 的作业 ...

  4. 【hive】——Hive sql语法详解

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

  5. hive sql 语法详解

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

  6. Hadoop Hive sql 语法详细解释

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

  7. [转]Hadoop Hive sql语法详解

    转自 : http://blog.csdn.net/hguisu/article/details/7256833 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式 ...

  8. Hadoop Hive sql 语法详解

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

  9. Hive sql语法详解

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

随机推荐

  1. [转]EJS入门

    今天学习了EJS,转个再点个赞,动态创网页的好方法! 主页:http://www.embeddedjs.com/ 转自:http://www.csser.com/board/4fddc4f0b28ed ...

  2. FFMPEG视音频编解码零基础学习方法-b

    感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅 ...

  3. Dynamips做CCNA的实验,说是找不到telnet的解决方案

    01.如果你的系统是32位的系统. 控制面板-程序与功能-启动或关闭windows功能-开启telnet(重启计算机就可以用telnet了) 02.如果你的系统是64位的系统. (1)控制面板-程序与 ...

  4. Python连接Redis连接配置

    1. 测试连接: Python 2.7.8 (default, Oct 20 2014, 15:05:19) [GCC 4.9.1] on linux2 Type "help", ...

  5. Eclipse怎样导入github上的项目

    国外有些比较好的源代码网站,经常需要从这些网站上导入项目到eclipse中,我最近就发现github.com这个网站上有很多开源项目.这里就以从github网站上导入项目到eclipse中为例来详细的 ...

  6. BOM的来源是不可能出现的字符,GB2312双字节高位都是1,Unicode理论的根本缺陷导致UTF8的诞生

    Unicode字符编码规范   http://www.aoxiang.org 2006-4-2 10:48:02Unicode是一种字符编码规范 . 先从ASCII说起.ASCII是用来表示英文字符的 ...

  7. 《鸟哥的Linux私房菜》读书笔记三

    1.在Linux系统中,每个设备都被当成一个文件来对待,每个设备都会有设备文件名.比如 IDE接口的硬盘文件名为/dev/hd[a-d] 括号内的字母为a-d当中任意一个,即/dev/hda,/dev ...

  8. 17.1.1.5 Creating a Data Snapshot Using mysqldump

    一种方式创建一个数据库的快照在一个存在的master 数据库是使用mysqldump 来创建你需要复制的所有数据库的dump. 一旦数据dump 是完成,你然后倒入数据到slave 在开始复制过程前 ...

  9. Learning WCF Chapter1 Exposing Multiple Service Endpoints

    So far in this chapter,I have shown you different ways to create services,how to expose a service en ...

  10. bzoj3238

    都LCP了很显然是要用到后缀数组的 显然前面的那个东西是可以直接算出来的 关键在于LCP的和怎么快速的计算 不难想到穷举height[i],然后判断这个height[i]可能成为多少对后缀的LCP 考 ...