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>

桶是更为细粒度的数据范围划分。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>

添加删除分区

addpartition(part='a') partition(part='b');
    ALTER TABLE table_name DROP partition_spec,partition_spec,...

增加删除列:


替换表中所有字段。

显示命令:

   

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 表名

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

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

        4>动态分区插入

nsert overwrite into table 表名 partition(p_name)  select 子句

            只指定了分区

13>

    关于导出表数据:

nsert 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中即可使用