一、 创建表

在官方的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. atexit()函数

    atexit()函数  头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: int atexit(void (*func)(v ...

  2. linux下进度条的简单实现

    在实现进度条之前,先学习一下makefile. 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编 ...

  3. 2014年度辛星html教程夏季版第一节

    从今天起开始在博客园开启自己的html教程啦,先从第一节开始把,首先推荐一个网站,就是http:/www.w3cschool.cc,这是一个公开的教学网站,但是它有一个问题,那就是虽然很全面,但是不是 ...

  4. u-boot Makefile整体解析

    一.概述   1.理解u-boot的makefile需要的准备 linux常用命令.shell脚本基础知识.makefile脚本基础知识 2.Makefile的元素 万变不离其宗,无论工程多么复杂,文 ...

  5. VOIP概述

    简介 VoIP(Voice over Internet Protocol)就是将模拟声音讯号(Voice)数字化,以数据封包(Data Packet)的型式在 IP 数据网络 (IP Network) ...

  6. bzoj 3572: [Hnoi2014]世界树 虚树 && AC500

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 520  Solved: 300[Submit][Status] ...

  7. 容斥原理算法总结(bzoj 2986 2839)

    容斥原理是一个从小学就开始学习的算法.但是很多难题现在都觉得做的十分吃力. 容斥原理大概有两种表现形式,一种是按照倍数进行容斥,这个东西直接用莫比乌斯函数就可以了. #include<iostr ...

  8. Android判断界面

         仿造微信,第一次进入去引导界面,否则进启动界面. package edu.hpu.init; import edu.hpu.logic.R; import android.app.Activ ...

  9. 关于ADMM的研究(一)

    关于ADMM的研究(一) 最近在研究正则化框架如何应用在大数据平台上.找到了<Distributed Optimization and Statistical Learning via the ...

  10. maven 根据不同的环境打war包-->资源文件的处理方式

    发现犯的错误: 1. 指定了testResource 文件夹与resource 为同一个文件夹.导致不论在resource 里面如何过滤文件,都不起作用.资源文件本来就是共享的.不必这样指定. 2. ...