zoukankan      html  css  js  c++  java
  • Hive的基本操作

    一、Hive初识

      1.Hive的安装,前面的博客中已经介绍过,这里就不再赘述了

      2.Hive的基本语法

        查看Hive中有多少数据库:show  databases;

        创建一个数据库:create  database  数据库名;

        创建一个数据表:create  table  表名(字段   数据类型,字段   数据类型........)row  format  delimited  fields  terminated  by  ' ';

        查看某个数据库中有多少表:先进入该数据库下,命令是 use  数据库名,然后,show   tables;

        查看某个表的信息:desc   表名;

        查看某个表的详细信息:desc  extended  表名;

        格式化查看某个表的详细信息:desc  formatted  表名;

        查看数据库中有哪些函数:show   functions;

        查看数据库中某个函数:desc  function  函数名;

        详细查看数据库中某个函数:desc   function   extended  函数名;

        模糊查找某个数据库:show  databases  like  'db_hive*';

        查看某个数据库的信息:desc   database  数据库名;

        查看某个数据库的详细信息: desc  database  extended  数据库名;

        删除空的数据库(里面已经没有数据表了):drop   database  数据库名;

        删除数据库:drop   database  数据库名   cascade;

           标准删除数据库:drop  database  if   exists  数据库名;

        清空表中的数据:truncate   table   表名;

        创建一个与已有表结构相同的表:create  table  if  not  exists  新表名   like   旧表名;

        给表重命名:alter   table   旧表名   rename   to   新表名;

        标准删除表:drop  table  if   exists  表名;

        创建一张表的时候,就直接将已有表的某些字段信息加载进表中:create   table   if  not   exists  数据库名.新表名   AS   select   字段1,字段2 .... from   数据库名.旧表名;

      3.Hive的高级语法

        bin/hive   -e   SQL语句

          例如:bin/hive  -e   "select  * from  数据库名.表名;"

        bin/hive   -f   SQL脚本

          例如:touch  hivef.sql

               select  *  from  数据库名.表名

             bin/hive  -f  /opt/datas/hivef.sql

             bin/hive  -f  /opt/datas/hivef.sql  > /opt/datas/hivef-res.txt

        在hive  cli命令窗口中如何查看hdfs文件系统

          hive  (default)> dfs   -ls  / ;

        在hive  cli 命令窗口中如何查看本地文件系统

          hive  (default) > !ls  /opt/datas;

    二、Hive的深入

      1.创建一张表(默认是管理表),默认存储,并将本地的数据加载进表

        格式:create  table  if  not   exists  数据库名.表名(

            字段    数据类型,

            字段   数据类型        

           )

           row  format  delimited  fields  terminated  by  ' ';

           load  data  local  inpath  '/opt/datas/data.txt'  into  table   数据库名.表名;

      2.创建一张外部表(托管表),默认存储,并将本体的数据加载进表

        格式:create  external   table  if  not   exists  数据库名.表名(

            字段    数据类型,

            字段   数据类型        

           )

           row  format  delimited  fields  terminated  by  ' '

           location   '/user/xunzhang/hive/warehouse/biaoming';

           dfs  -put   /opt/datas/data.txt    /user/xunzhang/hive/warehouse/;

        注意:这里的location 后面的hdfs路径,一定要先创建出来,数据可以先上传,也可以后上传

      3.创建一张分区表,默认存储,并将本地的数据加载进表

        格式:create  external   table  if  not   exists  数据库名.表名(

            字段    数据类型,

            字段   数据类型        

           )

           partitioned  by  ( mouth (字段一)   数据类型,day (字段二)   数据类型)

           row   format   delimited  fields  terminated   by  ' ';

           load   data  local  inpath  '/opt/datas/data.txt'  into  table   数据库名.表名  partition (字段一=...  ,字段二 =....  );

        注意:

          查表之前:msck   repair  table  数据库名.表名  或者   alter   table  数据库名.表名   add   partition  (字段一=...  ,字段二 =....  ) ;

          这时候查找就变成这样:

            select   *   from   数据库名.表名   where   字段一  =  ...   and   字段二  =  ....;

       4、总结

          将文件数据加载进Hive表中的几种方法  

            1>加载本地文件到hive表

              load  data  local  inpath  '/opt/datas/data.txt'  (overwrite)  into  table  数据库名.表名;

            2>加载hdfs文件到hive表中  

              load  data  inpath  '/opt/datas/data.txt'  (overwrite)  into  table  数据库名.表名;

              或者

              import   table   数据库名.表名    from   '/user/xunzhang/hive/data.txt';

            3>创建表时,通过insert 加载

              create   table  数据库名.新表名  like   数据库名.旧表名;

              insert  into  table  数据库名.新表名   select  *  from   数据库名.旧表名;

            4>如果是外部表,创建表的时候通过location指定加载

        将hive表中的数据导出的几种方法

            1>将hive表中的数据导到本地

              insert  overwrite   local   directory  '/opt/datas/data.txt'

              row  format  delimited  fields  terminated  by  ' '   collection  items  terminated  by  ' '

              select   *   from   数据库名.表名;

              或者

              bin/hive   -e   "select  *  from   数据库名.表名;"   >  /opt/datas/data.txt

            2>将hive表中的数据导到hdfs上        

              insert  overwrite    directory  '/user/xunzhang/hive/data.txt'

              row  format  delimited  fields  terminated  by  ' '   collection  items  terminated  by  ' '

              select   *   from   数据库名.表名;

              或者

              export   table   数据库名.表名   to   '/user/xunzhang/hive/data.txt';

    三、Hive高级

      1.hive表中数据的存储方式

        常见有三种,分别是:orc  ,  parquet  ,  textfile  ,存储相同的数据,orc占的空间最少,但查询最慢,textfile占的空间最大,但查询最快

        1>  textfile方式

          create table page_views(
            track_time string,
            url string,
            session_id string,
            referer string,
            ip string,
            end_user_id string,
            city_id string
          )
          ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
          STORED AS TEXTFILE ;

          load data local inpath '/opt/datas/page_views.data' into table page_views ;
          dfs -du -h /user/hive/warehouse/page_views/ ;
          18.1 M /user/hive/warehouse/page_views/page_views.data

        2>  orc方式 

          create table page_views_orc(
            track_time string,
            url string,
            session_id string,
            referer string,
            ip string,
            end_user_id string,
            city_id string
          )
          ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
          STORED AS orc ;

          insert into table page_views_orc select * from page_views ;
          dfs -du -h /user/hive/warehouse/page_views_orc/ ;
          2.6 M /user/hive/warehouse/page_views_orc/000000_0

        3>parquet方式

          create table page_views_parquet(
            track_time string,
            url string,
            session_id string,
            referer string,
            ip string,
            end_user_id string,
            city_id string
          )
          ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
          STORED AS PARQUET ;

          insert into table page_views_parquet select * from page_views ;
          dfs -du -h /user/hive/warehouse/page_views_parquet/ ;
          13.1 M /user/hive/warehouse/page_views_parquet/000000_0

      2.hive表中的数据压缩存储

        最常见的压缩方式是:snappy压缩,hadoop本身是不支持压缩的,如果要想压缩存储,需要重新编译源码,这里我不做过多的介绍,这里面比较复杂

        1>snappy 压缩的三种方式

          create table page_views_orc_snappy(
            track_time string,
            url string,
            session_id string,
            referer string,
            ip string,
            end_user_id string,
            city_id string
          )
          ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
          STORED AS orc tblproperties ("orc.compress"="SNAPPY");

          insert into table page_views_orc_snappy select * from page_views ;
          dfs -du -h /user/hive/warehouse/page_views_orc_snappy/ ;

          或者

          set parquet.compression=SNAPPY ;
          create table page_views_parquet_snappy(
            track_time string,
            url string,
            session_id string,
            referer string,
            ip string,
            end_user_id string,
            city_id string
          )
          ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
          STORED AS parquet;
          insert into table page_views_parquet_snappy select * from page_views ;
          dfs -du -h /user/hive/warehouse/page_views_parquet_snappy/ ;

          或者

          set parquet.compression=SNAPPY ;
          create table page_views_par_snappy
          ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
          STORED AS parquet
          AS select * from page_views ;

          dfs -du -h /user/hive/warehouse/page_views_par_snappy/ ;

      3. udf 编程

        1>将编写好的udf程序打成一个jar包,比如jar包是:hiveudf.jar

        2>在hive  cli 命令行:

          add   jar  /opt/datas/hiveudf.jar;

        3>在hive  cli 命令行,创建临时函数

          命令:

            create temporary function 函数名(自己定义)    as   "com.beifeng.senior.hive.udf.RemoveQuotesUDF"(jar包中class文件路径) ;  

        4>使用临时函数,将处理好的数据重新加载进hive表

         命令:

           insert overwrite table default.bf_log_comm select my_removequotes(remote_addr), my_removequotes(time_local), my_removequotes(request), my_removequotes(http_referer) from  default.bf_log_src ;

        5>检查是否成功

         命令:

           select * from bf_log_comm limit 5 ;

    四、实战

      1、数据下载链接:     

        http://files.grouplens.org/datasets/movielens/ml-100k.zip

        或者
        http://files.grouplens.org/datasets/movielens/ml-100k.zip
     2.代码展示
        
     1 CREATE TABLE u_data_new (
     2   userid INT,
     3   movieid INT,
     4   rating INT,
     5   weekday INT)
     6 ROW FORMAT DELIMITED FIELDS TERMINATED BY '	';
     7 
     8 add FILE /opt/datas/ml-100k/weekday_mapper.py;
     9 
    10 INSERT OVERWRITE TABLE u_data_new
    11 SELECT
    12   TRANSFORM (userid, movieid, rating, unixtime)
    13   USING 'python weekday_mapper.py'
    14   AS (userid, movieid, rating, weekday)
    15 FROM u_data;
    16 
    17 SELECT weekday, COUNT(*) FROM u_data_new GROUP BY weekday;
    18 
    19 SELECT weekday, COUNT(1) cnt FROM u_data_new GROUP BY weekday order by cnt desc;
    20 
    21 //  weekday_mapper.py里面的内容如下:
    22 import sys
    23 import datetime
    24 
    25 for line in sys.stdin:
    26   line = line.strip()
    27   userid, movieid, rating, unixtime = line.split('	')
    28   weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
    29   print '	'.join([userid, movieid, rating, str(weekday)])
    View Code
  • 相关阅读:
    matlab基本数据结构struct
    matlab基本函数strcmp num2str 字符串格式
    matlab基本函数inf, isempty, round, floor, fix
    matlab基本函数randperm end数组索引
    matlab基本函数find
    【未通过】LintCode #366 斐波纳契数列
    LintCode #3 统计数字
    计算1至n中数字X出现的次数
    LintCode #2 尾部的零
    LintCode #1 A + B 问题
  • 原文地址:https://www.cnblogs.com/medal-li/p/7500890.html
Copyright © 2011-2022 走看看