您的位置:首页 > 其它

Hive个人学习总结

2018-03-14 21:57 274 查看
1>
   关于load 数据的时候,如果数据不是在本地,那么是不需要加上local关键字;此时,表示的是数据在HDFS上,可能会问:数据本来就是在HDFS上,那为什么还要load呢?load的目的就是将数据的目录修改,修改指向到/usr/hive/warehouse下面。因此,如果考虑和规划不当,那么会导致HDFS上目录的很大变化。
    关于overwrite 关键字,一定要小心使用,本人就曾错误使用overwrite,错将原来的数据覆盖掉了,还好就丢了百兆!!

2>
    开启一个hive服务:./hive --servcie hiveserver2

    查询监听端口:netstat -nplt |grep 10000
    本地测试:./beeline  !connect jdbc:hive2://node1:10000            

    开启成功:出现事务可重复读字样:TRANSACTION_REPEATABLE_READ
    此时,可以书写像java连接数据库一样的 增删改查的代码。
3>

UDF:
       函数的输入数据为一条数据,输出数据也为一条数据。
如字符串连接函数:concat;For example, concat('foo', 'bar') results in 'foobar'. Note that this function can take any number of input strings.
UDAF:
        Built-in Aggregate Functions (UDAF)

       函数的输入数据为多行数据,输出数据不定。如聚合函数Count,avg, max(a,b),min(a,b)
4>
    Hive的特点:
    Ø  可扩展
        Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
    Ø  延伸性(灵活)
        Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
    Ø  容错
        良好的容错性,节点出现问题SQL仍可完成执行。
5>
  关于数据格式,Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。

注:
  由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。不像在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。

6>

    Hive中包含以下数据模型:DB、Table,External Table,Partition,Bucket。        ²  db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹        ²  table:在hdfs中表现所属db目录下一个文件夹        ²  external table:与table类似,不过其数据存放位置可以在任意指定路径        ²  partition:在hdfs中表现为table目录下的子目录        ²  bucket:在hdfs中表现为同一个表目录下根据hash散列之后的多个文件
7>
    创建分区表,需要添加partitioned by (fieldname fieldtype)

    创建外部表,需要使用external关键字,并在最后加上location ‘your external file path’
    加载数据时,对于分区表,在表名后面加上partition(fieldname = 'you defined name of this part')
   注意:
        只是在创建分区表的时候才指定了分区的名字,而只有在导数据的时候才创建具体的分区!!!

       查询时,使用where子句进行查询。
8>
    可以使用:

        hive -e  sql语句来执行

        hive -f   sql文件来执行

    可以考虑使用第一种,编写脚本执行。
9>

    对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大减少JOIN的数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
10>
  
distributeby field1 sort by field2
作用:在生成的mapreduce程序中,根据field1进行partition,根据field2进行reduce内排序,所以查询的结果,会生成多个文件,每个文件内部有序;
示例:
select* from student distribute by sno sort by sage;
注意:
       order by 与sort by的区别是:order by编译时默认会把reduce tasks的个数设置为1;而sort by的是会按照set reducetasks的个数决定的,如果是个数是1,则和order by一样;否则是局部有序的。
为了避免数据倾斜【默认是采用随机的column name作为key】,最好指定改变数据分发,使用distribute by (column name) 后+ sort by (column name1)

clusterby field1
作用:在生成的mapreduce程序中,根据field1进行partition,根据field1进行reduce内排序,所以查询的结果,会生成多个文件,每个文件内部有序;
它就相当于 distribute by field1 sort by field1
示例:select * from student cluster by sno;
注意,在建表时:只能使用clustered by   sorted by   into xx buckets;
示例:
create table t_ (id string,name string)
clustered by (id)
sorted by (name)
into 4 buckets
row format delimited
fields terminated by '\001';
该建表语句,指明了:该表中的数据应该是按照id哈希散列成了4桶,并且在桶内按照name排好了序;
11>
添加删除分区:
    alter table student_p addpartition(part='a') partition(part='b');

    ALTER TABLE table_name DROP partition_spec,partition_spec,...
增加删除列:

   ADD是代表新增一字段,字段位置在所有列后面(partition列前),REPLACE则是表示替换表中所有字段。
显示命令:
   
  show tables
  show databases
  show partitions
  show functions
  desc t_name
  desc extended t_name;
  desc formatted table_name;
12>
  关于insert:
        1>查询结果插入新的表

                insert overwrite into table 表名 partition(p_name =''..")  select 子句

        2>像SQL一样普通的插入一条记录 insert。。。
        3>多重插入模式
                from 表名

               insert overwrite into table 表名 partition(p_name =''..")  select 子句
              insert overwrite into table 表名 partition(p_name =''..")  select 子句
        4>动态分区插入
            insert overwrite into table 表名 partition(p_name)  select 子句
            只指定了分区名
13>
    关于导出表数据:

        insert overwrite local directory  path    select 子句

    多重导出:
       select  表名
       insert overwrite local directory  path    select 子句
       insert overwrite local directory  path    select 子句

   注:此处的path也可以是HDFS上的path
14>
     关于select:

1、order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
2、sort by不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的输出有序,不保证全局有序。
3、distribute by(字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。
4、Cluster by(字段) 除了具有Distributeby的功能外,还会对该字段进行排序。
注:
    cluster  by = distribute by + sort by 

15>
    关于join:

      hive支持等值连接,如on a.x = b.x 但是不知道非等值的连接;
     hive还支持外链接,此外,hive支持多于两个表的连接。
  注:
     如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务。

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

16>
  UDF 定义:
       java类继承UDF,并重载evalutate方法
      jar包添加至hive的classpath下:add JAR ...
     创建临时函数与java  class 关联
             create  temporary  function  function_name  as "包名.类名”  
     在HQL中即可使用   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hive