一、 创建表

在官方的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. 在虚拟机的linux中利用VMware Tools实现与windows共享文件

        很多人都知道安装"VMware Tools"可以实现与windows共享,但是其实它的功能远不止此.安装了"VMware Tools"后,虚拟机的网络. ...

  2. iOS - 打电话, 发短信

    电话.短信是手机的基础功能,iOS中提供了接口,让我们调用.这篇文章简单的介绍一下iOS的打电话.发短信在程序中怎么调用. 1.打电话 [[UIApplication sharedApplicatio ...

  3. Latex 常用知识点存档

    前言: 本篇仅作为自己的知识存档. $Latex$是什么,就不用介绍了,网上好多教程和知识点,当忘记的时候搜一下就可以了. 本科做美赛和毕设的时候用的$Latex$排版,最近开始在博客园写点东东,发现 ...

  4. 这是从word发的第一篇博客。

    喜欢做的事,怎么样都不会厌倦. 以前只知道office功能强大,但不太清楚到底还能干些啥,印象最深的是outlook了,自己也在用,挺好 今天偶然发现,word还能发布博客,真是太惊喜了 这算是一篇实 ...

  5. XSS解决方案系列之四:关于编码

    本文准备说明以下几个问题: 1. 关于重复编码的问题 2. 关于编码的多种形式的问题 3. 关于编码的几个常见问题 [说明] 本文所述编码是指encode,可以理解为转义,而不是编程序写代码. 编码或 ...

  6. Best Sequence

    poj1699:http://poj.org/problem?id=1699 题意:给你nge串,让你求出这些串组成的最小的串重叠部分只算一次. 题解:我的做法是DFS,因为数据范围只有10,就算是n ...

  7. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  8. ANDROID_MARS学习笔记_S03_002_设置可见性及扫描蓝牙设备

    一.代码 1.xml(1)AndroidManifest.xml <uses-permission android:name="android.permission.BLUETOOTH ...

  9. 【HDOJ】2844 Coins

    完全背包. #include <stdio.h> #include <string.h> ], c[]; int n, m; ]; int mymax(int a, int b ...

  10. 能让你成为更优秀程序员的10个C语言资源

    能让你成为更优秀程序员的10个C语言资源 本文由 伯乐在线 - archychu 翻译自 mycplus.欢迎加入 技术翻译小组.转载请参见文章末尾处的要求. 一些人觉得编程无聊,一些人觉得它很好玩. ...