1、Hive 表 DDL

    1.1、创建表

    Hive中创建表的完整语法如下:

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS]  table_name

      [ (col_name data_type [COMMET col_comment], . . .)]

      [COMMENT table_comment]

      [PARTITIONED BY (col_name data_type [COMMENT col_comment], . . . )]

      [CLUSTERED BY (col_name, col_name, . . . )]

      [SORTED BY (col_name [ASC|DESC], . . . )  INFO num_buckets BUCKETS]

      [ROW FORMAT row_format]

      [STORED AS file_format]

      [LOCATION hdfs_path]

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

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

    COMMENT:可以为表和字段增加注释

    ROW FORMAT:用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定的ROW FORMAT或者ROW FORMAT DELIMITED,将会使用自带的SerDe;在创建表时,用户还需要为表指定列,同时也会指定

            自定义的SerDe。Hive通过SerDe确定表的具体的列的数据。Serde是 Serializer/Deserializer的简写。hive使用Serde进行行对象的序列与反序列化。

      一条简单的建表语句如下:

      hive> CREATE TABLE  gripe(foo INT, bar STRING);

    Like:允许用户复制现有的表结构,但是不复制数据。例如:

      hive>CREATE TABLE empty_key_value_store LIKE  key_value_store

    另外还可以通过CREATE TABLE AS  SELECT的方式来创建表,例如:

      hive>CREATE TABLE new_key_value_store

         ROW FORMAT  SERDE  "org.apache.Hadoop.hive.serde2.columnar.ColumnarSerDe" STORED AS RCFile

         AS

         SELECT (key % 1024)  new_key , concat(key, value)  key_value_pair

         FROM  key_value_store

         SORT BY  new_key, key_value_pair;

    

    1.2、修改表

      修改表名的语法如下:

      hive> ALTER TABLE old_table_name  RENAME  TO  new_table_name;

      修改列名的语法如下:

      hive>ALTER  TABLE  table_name CHANGE  [COLUMN]  old_col_name  new_col_name  column_type  [COMMENT  col_comment] [FIRST|AFTER  column_name]

      上述语法允许改变列名、数据类型、注释、列位置或者它们的任意组合。建表后如果需要增加一列,则使用如下语法:

      hive>ALTER TABLE  gripe ADD COLUMNS (new_col  INT  COMMENT 'new col  comment');

    1.3、删除表

      DROP TABLE 语句用于删除表的数据和元数据。对应外部表,只删除Metastore中的元数据,而外部数据保存不动,例如:

      drop table my_table;

      如果只想删除表数据,保留表结构,跟MYSQL类似,使用TRUNCATE语句。

      TRUNCATE  TABLE my_table;

    1.4、插入表

      1、向表中加载数据

      LOAD DATA  [LOCAL] INPATH  'filepath'  [OVERWRITE]  INFO  TABLE  tablename [PARTITION(partcol1 = val1,  partcol2 = val2, . . .)]

      Load操作只是单纯的复制/移动操作,将数据 文件移动到Hive表对应的位置,filepath可以是相对路径,例如project/data1,  也可以是绝对路径,例如:/user/hive/project/data1, 或是包含模式的完整URI,例如:

      hdfs://namenode:9000/user/hive/project/data1。

      相对路径实例如下:

      hive> LOAD DATA  LOCAL  INPATH  './examples/files/kv1.txt'  OVERWRITE  INTO  TABLE gripe;

      2、将查询结果插入Hive表

      将查询结果写入HDFS文件系统。

        a、基本模式:

        INSERT OVERWRITE TABLE  tablename1  [PARTITION  (partcol1 = val1, partcol2 = val2, . .  .)]

        select_statements FROM from_statement

        b、多插入模式:

        INSERT OVERWRITE TABLE  tablename1

        [PARTITION (partcol1 = val1, partcol2 = val2, . . . )]

        select_statement1

        [ INSERT OVERWRITE TABLE  tablename2 [PARTITION . . . ]  select_statement2] . . .

        c、自动分区模式:

        INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] . . . )

        select_statement From from_statement

  2、Hive 表 DML

    1、基本的select操作

    Hive中的select操作的语法如下:

    SELECT  [ALL | DISTINCT]  select_expr, select_expr, . . .

    FROM table_reference

    [WHERE  where_condition]

    [GROUP  BY  col_list [ HAVING condition] ]

    [CLUSTER BY col_list  | [DISTRIBUTE  BY  col_list]  [SORT BY | ORDER BY col_list] ]

    [LIMIT number]

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

    WHERE条件:类似于传统的SQL的where条件,支持 AND 、OR、BETWEEN、IN、NOT IN等。

    ORDER BY与SORT BY的不同:ORDER BY指全局排序,只有一个Reduce任务,而SORT BY只在本机做排序。

    LIMIT:可以限制查询的记录条数,例如:SELECT *  FROM t1  LIMIT  5, 也可以实现Top k查询,比如下面的查询语句可以查询销售记录最多的5个销售代表:

        SET mapred.reduce.tasks = 1

        SELECT *  FROM test SORT BY amount DESC LIMIT 5

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

    SELECT '(ds|hr)?+.+'  FROM  test

    

    2、join表

    Hive中join表的语言如下:

      join_table:

        table_reference [INNER] JOIN  table_factor  [join_condition]

        |  table_reference {LEFT|RIGHT|FULL}  [OUTER]  JOIN  table_reference  join_condition

        | table_reference LEFT  SEMI JOIN table_reference join_condition

        |table_reference  CROSS JOIN  table_reference [join_condition]  (as of Hive 0.10)

      table_reference:

        table_factor

        | join_table

      table_factor:

        tbl_name [alias]

        | table_subquery alias

        | (table_references)

      join_confition:

        On expression

    对Hive中表Join操作的说明以及注意事项如下:

    1、Hive只支持等值连接、外连接和左半连接(left semi join),Hive 不支持所有的非等值连接,因为非等值连接很难转化到map/reduce任务(从2.2.0版本后开始支持非等值连接)。

    2、可以连接2个以上的表,例如:

      SELECT a.val,  b.val,  c.val  FROM a  JOIN  b on  (a.key = b.key1)  JOIN  c  on (c.key = b .key2)

    3、如果连接中多个表的join key是同一个,则连接会转化为单个Map/Reduce任务,例如:

      SELECT a.val,  b.val,  c.val  FROM a  JOIN  b on  (a.key = b.key1)  JOIN  c  on (c.key = b .key1)

    4、join时大表放在最后。这是因为每次Map/Reduce任务的逻辑是这样的:Reduce会缓存join序列中除最后一个表之外的所有表的记录,再通过最后一个表将将结果序列化文件系统,因此在实践中,应该把最大的那个表写在最后。

    5、如果想限制join的输出,应该在where子句中写过滤条件,或是在join子句中写,但是表分区的情况很容易混淆,比如下面的第一个SQL语句所示,如果d表中找不到对应c表的记录,d表的所有列都会列出NULL,包括ds列,

      也就是说,join会过滤d表中不能找到 c表join key 的所有记录。这样,LEFT OUTER 就使得查询结果与WHERE子句无关,解决办法是在join时指定分区(如下面的第二个SQL语句)。

      //第一个SQL语句

      SELECT c.val, d.val  FROM  c  LEFT  OUTER  JOIN d  ON (c.key = d.key) where c.ds = '2010-08-08'  AND d.ds ='2010-08-08'

      

      //第一个SQL语句

      SELECT c.val, d.val  FROM  c  LEFT  OUTER  JOIN d  ON (c.key = d.key AND c.ds = '2010-08-08'  AND d.ds ='2010-08-08')

    6、LEFT SEMI JOIN是IN/EXISTS子查询的一种更高效的实现。其限制是:JOIN子句中右边的表只能在On子句中设置过滤条件,在WHERE子句、SELECT子句、或其他地方过滤都不行。

      SELECT a.key,  a.value  FROM  a  WHERE  a.key  in (SELECT b.key  FROM  b);

      可以被重写为:SELECT a.key,  a.value  FROM a  LEFT SEMI  JOIN  b on (a.key = b.key)

     

    参考资料:《离线和实时大数据开发实战》

大数据开发实战:Hive表DDL和DML的更多相关文章

  1. 大数据开发实战:Hive优化实战3-大表join大表优化

    5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...

  2. 大数据开发实战:Hive优化实战2-大表join小表优化

    4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...

  3. 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...

  4. 大数据开发实战:离线大数据处理的主要技术--Hive,概念,SQL,Hive数据库

    1.Hive出现背景 Hive是Facebook开发并贡献给Hadoop开源社区的.它是建立在Hadoop体系架构上的一层SQL抽象,使得数据相关人员使用他们最为熟悉的SQL语言就可以进行海量数据的处 ...

  5. 大数据开发实战:Stream SQL实时开发一

    1.流计算SQL原理和架构 流计算SQL通常是一个类SQL的声明式语言,主要用于对流式数据(Streams)的持续性查询,目的是在常见流计算平台和框架(如Storm.Spark Streaming.F ...

  6. 大数据开发实战:Spark Streaming流计算开发

    1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...

  7. 大数据开发实战:Stream SQL实时开发三

    4.聚合操作 4.1.group by 操作 group by操作是实际业务场景(如实时报表.实时大屏等)中使用最为频繁的操作.通常实时聚合的主要源头数据流不会包含丰富的上下文信息,而是经常需要实时关 ...

  8. 大数据开发实战:Stream SQL实时开发二

    1.介绍 本节主要利用Stream SQL进行实时开发实战,回顾Beam的API和Hadoop MapReduce的API,会发现Google将实际业务对数据的各种操作进行了抽象,多变的数据需求抽象为 ...

  9. 大数据开发实战:Hadoop数据仓库开发实战

    1.Hadoop数据仓库架构设计 如上图. ODS(Operation Data Store)层:ODS层通常也被称为准备区(Staging area),它们是后续数据仓库层(即基于Kimball维度 ...

随机推荐

  1. [TC11326]ImpossibleGame

    [TC11326]ImpossibleGame 题目大意: 一类字符串仅由'A','B','C','D'四种字母组成.对于这样的一个字符串\(S\),可以用以下两种方式之一修改这个字符串: 交换\(S ...

  2. 二叉查找树(二叉排序树)的详细实现,以及随机平衡二叉查找树Treap的分析与应用

    这是一篇两年前写的东西,自我感觉还是相当不错的Treap教程.正好期末信息科学技术概论课要求交一个论文,就把这个东西修改了一下交了,顺便也发到这里吧. 随机平衡二叉查找树Treap的分析与应用 1.序 ...

  3. 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

    分为4个步骤: 1)  当发送一个 URL 请求时,不管这个 URL 是 Web 页面的 URL 还是 Web 页面上每个资源的 URL,浏览器都会开启一个线程来处理这个请求,同时在远程 DNS 服务 ...

  4. ASP.Net中关于WebAPI与Ajax进行跨域数据交互时Cookies数据的传递

    本文主要介绍了ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据传递的相关知识.具有很好的参考价值.下面跟着小编一起来看下吧 前言 最近公司项目进行架构调整,由原来的三层架构改 ...

  5. PGXZ-腾讯全功能分布式关系数据集群

    PGXZ-腾讯全功能分布式关系数据集群

  6. log4j deadlock

    用了这么久的Log4j这次倒下了,而且官方也还没有给出解决方案. 描述:tomcat 经过一天多时间的访问,出现了hang ,使用 Jstack 查看堆栈后,发现现成 blocked ,主要是 Log ...

  7. Java 遍历类中的属性

    public static void testReflect(Object model) throws NoSuchMethodException, IllegalAccessException, I ...

  8. .NET:Assembly.CodeBase vs. Assembly.Location

    The CodeBase is a URL to the place where the file was found, while the Location is the path from whe ...

  9. Java锁的设计

    1.自旋锁 自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区.如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public ...

  10. MySQL递归查询树状表的子节点、父节点具体实现

    mysql版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算 ...