zoukankan      html  css  js  c++  java
  • Hive建表

    一、Hive建表语句

    (1)创建内部表

    (2)创建外部表

    drop table yum_area_dw.dw_community_base_info_aoi_clean;
    CREATE EXTERNAL TABLE `yum_area_dw.dw_community_base_info_aoi_clean`(
      `id` bigint comment '小区id',
      `community_name` string comment '小区名称',
      `city_id` bigint comment '城市id')
      comment '表备注'
    PARTITIONED BY (
    dt string comment '日期分区')
      row format delimited fields terminated by 'u0001' lines terminated by '
    '
    stored as textfile;

    二、数据导入

    1、Hive客户端中将数据导入hive表:根据数据源不同划分

    (1)从本地文件系统中导入数据到hive表中:

    load data local inpath "path" [OVERWRITE] into table tablename;

    (2)从HDFS上导入数据到hive表中:

    load data inpath "path" [OVERWRITE] into table tablename;

    (3)从别的表查询出来的数据导入到hive表中:

    insert overwrite table tablename_1 partition() 

    select .... from tablename_2 where ......

    三、内部表和外部表

    1、Hive内部表和外部表区别:主要分为两方面,数据加载load、删除表drop。

    数据加载:创建内部表时,会将数据移动到hive指向的路径,并且由hive来管理数据的生命周期。

                      创建外部表时,只是记录数据所在的路径,不对数据位置做改变。

    删除表:删除内部表,数据和元数据会一起删除掉。

                   删除外部表,只是删除元数据,数据不会删除。

    四、分区和分桶

    1、分区:分区是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找,避免全表扫描,可以提高查询效率。

    注意:分区只是添加了一个伪列,这个伪劣使我们人为规定的,只在查询的时候显示,实际在表中并不存在这个列。不能按照某个数据表中真实存在的列,如userid来分区。

      分区的目的就是提高查询效率,查询分区数据的方式就是指定分区名,指定分区名之后就不再全表扫描,直接从指定分区(如name=jack的分区)中查询,从hdfs的角度看就是从相应的文件系统中(如name=jack文件夹下)去查找特定的数据

    create table dept_partition(deptno  int , dname string,loc string)
    partitioned by (month string)
    row format delimited fields terminated  by '	';

    2、分桶:分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。

    注意:分桶的列是表中已存在的列,而不是伪列。分桶的信息在hdfs上看不到相关的文件,但是可以查询到分桶中的数据,说明确实分桶了。

    create table test_bucket (
    id int comment 'ID', 
    name string comment '名字'
    )
    comment '测试分桶'
    clustered by(id) into 4 buckets
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

    3、分区和分桶的区别:

    (1)分区是指定伪列进行分区,分桶是表格中真实存在的列。

    (2)分区信息在hdfs上显示的是分区文件夹,而分桶在hdfs上看不到,但是查询分桶数据们可以查询到。

    (3)分桶是数据的更精细的划分。

    4、分桶的使用场景:

    (1)当使用分区进行数据划分的时候,出现有些分区数据过多,而有些分区数据过少的时候,这时候可以采用分桶,对数据进行划分。

    (2)提升Join查询的效率,若两个表都在连接的字段上进行了分桶,那么在join的时候可以使用 Map 端连接 (Map-side join)高效的实现。比如Join 操作。对于Join 操作两个表有一个相同的列,如果对这两个表都进行了分桶操作。那么将保存相同列值的桶进行Join 操作就可以,可以大大减少Join 数据量。

    (3)方便抽样:使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

  • 相关阅读:
    Unity 3(一):简介与示例
    MongoDB以Windows Service运行
    动态SQL中变量赋值
    网站发布IIS后堆栈追踪无法获取出错的行号
    GridView Postback后出错Operation is not valid due to the current state of the object.
    Visual Studio 2010 SP1 在线安装后,找到缓存在本地的临时文件以便下次离线安装
    SQL Server 问题之 排序规则(collation)冲突
    IIS 问题集锦
    linux下安装mysql(ubuntu0.16.04.1)
    apt-get update 系列作用
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12091541.html
Copyright © 2011-2022 走看看