• Hive基本操作



    一,DDL操作

      1,创建表

      创建内部表 

    create table if not exists mytable(sid int, sname string )
    row format delimited fields terminated by  ','  stored as textfile;

      创建内部表

    create table if not exists pageview(pageid int, page_url string )
    row format delimited  fields terminated by ','
    location 'hdfs://192.168.184.131:9000/user/hive/warehouse/';

      创建分区表      分表就是在加入数据前,对表进行相应需求的分开存储。

    1 create table if exists invites (id int , name string  )
    2 partitioned by (ds string)
    3 row format delimited fields terminated by ','  lines terminated by '
    ' stored as textfile;

       创建分桶表 

    1 //开启分桶
    2 set hive.enforce.bucketing = true;

      对于每一个表或者是分区,Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive是针对某一列进行分桶。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶中。分桶的好处是可以获得更高的查询处理效率。使取样更高效。

      当从桶表中进行查询时,hive会根据分桶的字段进行计算分析出数据存放的桶中,然后直接到对应的桶中去取数据,这样做就很好的提高了效率。

    1 create table student (id int , name string )
    2 clustered by (id) sorted by(name) into 4 buckets
    3 row format delimited fields terminated by ',';

      2,修改表

      添加分区

    1 alter table student_p add partition(part='a') partition (part='b');

      删除分区

    alter table student_p drop partition(part='a');
    

      重命名表

    alter table table_name rename to new_table_name;

      增加列

    alter table student add columns (sex  string);

      更新列

    alter table student replace columns (id int ,age int ,name string);
    

      3,显示命令

      show tables显示表

      show databases显示数据库

      show partitions显示分区表的分区

      show functions显示方法

      desc extended t_name;

      desc formatted table_name;

    二,DML操作

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

      加载相对路径的数据

    load data local  inpath  'buckets.txt' into table student_p partition(stat_data='20131231');

      加载绝对路径数据

    load data local inpath '/root/app/datafile/buckets.txt'  into table student_p partition(stat_data='20131230');

      加载包含模式数据

    load data local inpath 'hdfs://192.168.184.131:9000/user/hive/warehouse/student/stat_data=20131230/buckets.txt' 

    into table student_p partition(stat_data='20131229');

      overwrite关键字

    load data local inpath 'buckedts.txt'  overwrite into table student  partition(stat_data='20131229');

      2,Insert

      基本模式插入(非分表插入)

    1 insert into table student3 (key1,key2,key3) values('11','wodsa','222');

      基本模式插入(分表插入)

    insert into table student3 partition(type='xiaomi') select id,name,price from student3 where type='huawei';

      高级语法,多条插入

    from  student
    insert overwrite table  student  partition(stat_data='20140102')
    select id,age,name where stat_data='201401229'
    insert overwrite table  student  partition(stat_data='20140103')
    select id,age,name where  stat_data='20140125';

      自动分区模式

    set hive.exec.dynamic.partition=true; //使用动态分区
    set hive.exec.dynamic.partition.mode=nonstrict;//无限制模式 
    
    insert into table student1 partition(stat_data)
    select id,age,name,stat_data from student where stat_data='20140101';

      3,导出表数据

      单行导出到本地

    1 insert overwrite local directory '/home/data/student' select *from student3;

      多行导出到本地

    1 from student_p
    2 insert overwrite local directory '/home/data/student1' select Sno,Sname,Sage
    3 insert overwrite local directory '/home/data/student2' select Sno,Sname,Sage;

      导出数据到HDFS

    insert into directory 'hdfs://server1:9000/user/hive'
    select * from student1;

      4,Select

      order by ,order by 会对输入做全局排序

    select *from good order by price desc;

      sort by不是全局排序,其在数据进入reducer前完成排序

    select *from good sort by price desc; 

      distribute by根据distribute by指定的内容将数据分到同一个reducer

        Cluster by 除了具有Distribute by的功能外,还会对该字段在进入reduce之前进行排序。

    三,Hive Join

      1,Hive支持等值连接,外连接,内连接,左右连接,支持多与2个表的连接,不支持非等值的连接。

      2,join 时,每次 map/reduce 任务的逻辑:reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统。这一实现有助于在 reduce 端减少内存的使用量。实践中,应该把最大的那个表写在最后(否则会因为缓存浪费大量内存)。

      3,LEFT,RIGHT 和 FULL OUTER 关键字用于处理 join 中空记录的情况:

      右连接-->右表的所有数据和左表的关联数据。

    1 select a.id,a.name,b.id,b.ordernum,b.price from customers a 
    2 right outer join orders b on a.id = b.cid;

      左连接-->左表的所有数据和右表的关联数据。

    1 hive (hive1)> select a.id,a.name,b.id,b.ordernum,b.price from customers a 
    2 left  join orders b on a.id = b.cid;

      内连接-->两表的关联数据。

    select a.id,a.name,b.id,b.ordernum,b.price from customers a 
    join orders b on a.id = b.cid;

      4,Join 是不能交换位置的。无论是 LEFT 还是 RIGHT join,都是左连接的。多连接时为了防止左表数据为null,影响右表的连接。


  • 相关阅读:
    Charles截获iPhone网络请求
    android小Demo--圆球跟随手指轨迹移动
    《腾讯网UED体验设计之旅》读后感
    eatwhatApp开发实战(十四)
    [Unity2d系列教程] 006.Unity如何根据图片自动生成Animator
    [Unity2d系列教程] 005.Unity如何使用外部触控插件FingerGuesture
    eatwhatApp开发实战(十三)
    微服务平台技术架构
    Istio 流量劫持过程
    Istio 组件常用端口
  • 原文地址:https://www.cnblogs.com/songweideboke/p/9839473.html
Copyright © 2020-2023  润新知