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)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

  • 相关阅读:
    db2新添用户
    merge的用法
    oracle常用命令
    oracle建用户
    获得当前时间的PRO
    全部快捷方式图标变成LNK文件怎么办
    随机生成数据的三种方法
    db2查看表空间
    db2疑难解决
    AVG()和to_date()函数的使用
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12091541.html
Copyright © 2011-2022 走看看