大数据入门第十一天——hive详解(二)基本操作

一、基本操作

  1.DDL

    官网的DDL语法教程:点击查看

    建表语句

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
   [(col_name data_type [COMMENT 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], ...)] INTO num_buckets BUCKETS]
   [ROW FORMAT row_format]
   [STORED AS file_format]
   [LOCATION hdfs_path]

data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type  -- (Note: Available in Hive 0.7.0 and later)

primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
  | STRING
  | BINARY      -- (Note: Available in Hive 0.8.0 and later)
  | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)
  | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)
  | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)
  | DATE        -- (Note: Available in Hive 0.12.0 and later)
  | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)
  | CHAR        -- (Note: Available in Hive 0.13.0 and later)

array_type
  : ARRAY < data_type >

map_type
  : MAP < primitive_type, data_type >

struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>

union_type
   : UNIONTYPE < data_type, data_type, ... >  -- (Note: Available in Hive 0.7.0 and later)
 

数据类型

 说明:

    1、CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
    2、EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
    3、LIKE 允许用户复制现有的表结构,但是不复制数据。
    4、ROW FORMAT
      DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
      [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
      | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
    用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe序列化工具。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的     SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive通过 SerDe 确定表的具体的列的数据。
    5、STORED AS
      SEQUENCEFILE|TEXTFILE|RCFILE
      如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

    6、CLUSTERED BY
      对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
    (1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
    (2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

    示例:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT ‘IP Address of the User‘)
 COMMENT ‘This is the page view table‘
 PARTITIONED BY(dt STRING, country STRING)
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ‘\001‘
STORED AS SEQUENCEFILE;

  2.DML

    Load

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

    说明:

      1、 Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。

      2、 filepath:

        相对路径,例如:project/data1

        绝对路径,例如:/user/hive/project/data1

      包含模式的完整 URI,列如:

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

      3、 LOCAL关键字

        如果指定了 LOCAL, load 命令会去查找本地文件系统中的 filepath。

        如果没有指定 LOCAL 关键字,则根据inpath中的uri查找文件

      4、 OVERWRITE 关键字

       如果使用了 OVERWRITE 关键字,则目标表(或者分区)中的内容会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。

       如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。

二、分区表与分桶表

  1.分区表

    在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。分区表指的是在创建表时指定的partition的分区空间。

Hive可以对数据按照某列或者某些列进行分区管理,所谓分区我们可以拿下面的例子进行解释。 
当前互联网应用每天都要存储大量的日志文件,几G、几十G甚至更大都是有可能。存储日志,其中必然有个属性是日志产生的日期。在产生分区时,就可以按照日志产生的日期列进行划分。把每一天的日志当作一个分区。 
将数据组织成分区,主要可以提高数据的查询速度。至于用户存储的每一条记录到底放到哪个分区,由用户决定。即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。

    建立分区表

create table t_user_part (id int, name string) partitioned by (country string) row format delimited fields terminated by ‘\t‘;

    向分区表中导入数据

[[email protected] ~]$ cat user.dat
1    Join
2    Mary
3    Bob
4    Tom

user.dat

LOAD DATA LOCAL INPATH ‘/home/hadoop/user.dat‘ INTO TABLE t_user_part PARTITION(country=‘USA‘);

0: jdbc:hive2://localhost:10000> SELECT * FROM t_user_part;
+-----------------+-------------------+----------------------+--+
| t_user_part.id  | t_user_part.name  | t_user_part.country  |
+-----------------+-------------------+----------------------+--+
| 1               | Join              | USA                  |
| 2               | Mary              | USA                  |
| 3               | Bob               | USA                  |
| 4               | Tom               | USA                  |
+-----------------+-------------------+----------------------+--+
4 rows selected (0.801 seconds)
0: jdbc:hive2://localhost:10000> 

  // 分区字段是一个伪字段

0: jdbc:hive2://localhost:10000> SELECT * FROM t_user_part WHERE country=‘USA‘;

    增加分区

ALTER TABLE table_name ADD partition_spec [ LOCATION ‘location1‘ ] partition_spec [ LOCATION ‘location2‘ ] ... partition_spec: : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)

用户可以用 ALTER TABLE ADD PARTITION 来向一个表中增加分区。当分区名是字符串时加引号。例:

ALTER TABLE test_table ADD PARTITION (dt=‘2016-08-08‘, hour=‘10‘) location ‘/path/uv1.txt‘ PARTITION (dt=‘2017-08-08‘, hour=‘12‘) location ‘/path/uv2.txt‘;

    删除分区

ALTER TABLE table_name DROP partition_spec, partition_spec,...

用户可以用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。例:

ALTER TABLE test_table DROP PARTITION (dt=‘2016-08-08‘, hour=‘10‘);

    查看分区

show partitions tablename

show partitions t_user_part;

  2.分桶表

    建立桶表以及桶的介绍,参考http://blog.csdn.net/u013850277/article/details/65937122?utm_source=itdadao&utm_medium=referral

原文地址:https://www.cnblogs.com/jiangbei/p/8467537.html

时间: 2024-08-29 19:29:00

大数据入门第十一天——hive详解(二)基本操作的相关文章

大数据入门第七天——MapReduce详解(下)

一.mapTask并行度的决定机制 1.概述 一个job的map阶段并行度由客户端在提交job时决定 而客户端对map阶段并行度的规划的基本逻辑为: 将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split,然后每一个split分配一个mapTask并行实例处理 这段逻辑及形成的切片规划描述文件,由FileInputFormat实现类的getSplits()方法完成,其过程如下图: // 完整的笔记介绍,参考:http://blog.csdn.net/qq_26

大数据入门第零天——总体课程体系概述

主要包括以下几大块: 大数据基础课程     离线数据分析 离线数据分析hbase 实时数据分析 Scala函数式编程 Spark内存计算 机器学习增强 前五天的课程都是基础课,主要包含Linux基础,shell编程基础以及Java中的多线程.JVM等基础知识,如果你没有相关的基础知识,请自己提前学习. 离线部分课程主要包括:hadoop.hive.flume.azkban.hbase等以及项目实战 实时部分课程主要包括:storm.kafka.redis以及项目实战 内存计算部分课程主要包括:

大数据hadoop入门之hadoop家族详解

大数据这个词也许几年前你听着还会觉得陌生,但我相信你现在听到hadoop这个词的时候你应该都会觉得"熟悉"!越来越发现身边从事hadoop开发或者是正在学习hadoop的人变多了.作为一个hadoop入门级的新手,你会觉得哪些地方很难呢?运行环境的搭建恐怕就已经足够让新手头疼.如果每一个发行版hadoop都可以做到像大快DKHadoop那样把各种环境搭建集成到一起,一次安装搞定所有,那对于新手来说将是件多么美妙的事情!闲话扯得稍微多了点,回归整体.这篇准备给大家hadoop新入门的朋友

大数据入门第十四天——Hbase详解(一)入门与安装配置

一.概述 1.什么是Hbase 根据官网:https://hbase.apache.org/ Apache HBase™ is the Hadoop database, a distributed, scalable, big data store. HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统 中文简明介绍: Hbase是分布式.面向列的开源数据库(其实准确的说是面向列族).HDFS为Hbase提供可靠的底层数据存储服务,MapReduce为Hbase提供高性能的计算能力,

大数据入门第十七天——storm上游数据源 之kafka详解(一)入门

一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro 的解释呢,是这样的: Apache Kafka® is a distributed streaming platform ApacheKafka®是一个分布式流媒体平台 l Apache Kafka是一个开源消息系统,由Scala写成.是由Apache软件基金会开发的一个开源消息系统项目. l K

大数据入门第八天——MapReduce详解(三)

1/mr的combiner 2/mr的排序 3/mr的shuffle 4/mr与yarn 5/mr运行模式 6/mr实现join 7/mr全局图 8/mr的压缩 今日提纲 一. 原文地址:https://www.cnblogs.com/jiangbei/p/8403478.html

大数据入门第十六天——流式计算之storm详解(二)常用命令

一.常用命令 1.提交命令 提交任务命令格式:storm jar [jar路径] [拓扑包名.拓扑类名] [拓扑名称] torm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount 原文地址:https://www.cnblogs.com/jiangbei/p/8513989.html

大数据入门第十七天——storm上游数据源 之kafka详解(二)常用命令

一.kafka常用命令 1.创建topic bin/kafka-topics.sh --create --topic topic_1 --partitions 4 --replication-factor 2 --zookeeper mini1:2181 // 如果配置了PATH可以省略相关命令路径,相关命令参数暂不深入,字面意思也可以大概推断.后续给出完整参数参考. 2.查看所有topic bin/kafka-topics.sh --list --zookeeper mini1:2181 3.

大数据入门第十二天——sqoop入门

一.概述 1.sqoop是什么 从其官网:http://sqoop.apache.org/ Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases 中文来说,就是: sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具.