刚刚看了一下hive的简单使用,只是一小部分,做下记录。

hive表的数据类型:
array_type            thiyint            boolean

 map_type            smallint         float

 struck_type          bigint            double  

                              int                string

1. 创建新表

  create table t_order(id int, name string, memory string, price double)

  row format delimited

  fields terminated by '\t';

  建表成功。其中表字段可以是数组或者集合。

       eg: 

    1.  – create table person(
    2.  – id int,
    3.  – name string,
    4.  – age int,
    5.  – likes array<string>,
    6.  – address map<string,string>
    7.  –)
    8.  – row format delimited
    9.  – FIELDS TERMINATED BY ','  ##指定一行数据的字段以 , 分割;
    10.  – COLLECTION ITEMS TERMINATED BY '-'  ##如果是集合,按照 - 分割;
    11.  – MAP KEYS TERMINATED BY ':'  ##如果是map,按照 : 分割;
    12.  – lines terminated by '\n';  ##行之间以换行符分割; 同时这也是默认的。

  其中可以使用MySQL客户端连接我们自己的hive库。可以看到自己创建表的详细信息,和所有字段的信息。相应的在hdfs集群上会创建相应的文件夹。

  也可以在hive库中创建自己想要的数据库:create database databasename;同时会自动的在hdfs集群上创建出相应的文件夹。


  可能表中需要存储的数据是:

  001  iPhone7s  128G  6888

  002  smartisan  64G  3888

  003  xiaomi  32G  2888    备注:hive库是没有主键约束和任何约束的。

  将上述想要入到表中的数据写进一个文件中,可以创建在本地,例如文件创建的目录为:/home/hadoop/hivetestdata/xxx.data

  接下来就是讲文件中的数据加载到创建的表中了:

  load data local inpath '/home/hadoop/hivetestdata/xxx.data' into table t_order;

  数据加载成功。这是相应的集群上目录已经多出了一个xxx.data的文件,内容便是刚才的数据文件的内容。

  然后就可以select * from t_order; sql语句会转换成mapreduce任务来执行

  结果:

  001  iPhone7s  128G  6888

  002  smartisan  64G  3888

  003  xiaomi  32G  2888

 

2. 自动put数据到库表中。

  例如有一个yyy.data 的文件,里面也是有手机的信息:

  004  iPhone7s  128G  6888

  005  smartisan  64G  3888

  006  xiaomi  32G  2888

  将本地的文件yyy.data可以put到集群库上,hadoop fs -put  yyy.data 集群上库表t_order的目录,然后 select * from t_order; 同样也会将yyy.data中的数据。

  001  iPhone7s  128G  6888

  002  smartisan  64G  3888

  003  xiaomi  32G  2888

  004  iPhone7s  128G  6888

  005  smartisan  64G  3888

  006  xiaomi  32G  2888

3. hive的表是有两大类的。managed_table和extend_table

  例如有一份数据uuu.data:
  101  iPhone7s  128G  6888

  102  smartisan  64G  3888

  103  xiaomi  32G  2888  将文件put到集群上根目录下 Hadoop fs -put uuu.data /

  将数据导到

  load dta inpath '/uuu.data' into table t_order;这时集群中根目录下发现uuu.data已经没有了。也就是说

  集群中的文件加载到相应的库表中的话,对应的相应集群中数据文件也会消失。

  创建外部表,会在hdfs中LOCATION指定的路径下创建和表名对应的目录

  (而创建内部表,会在hive-site.xml中配置的dir下创建对应的目录)

   现在就创建一个external表:

  create external table t_order_ex(id int, name string, memory string, price double)

  row format delimited

  fields terminated by '\t'

  location '/hive_ext';  发现对应相应的数据文件并没有发生改变,没有消失。

  加载数据文件到库表中的时候,若加载的是集群中的数据文件,内部表:集群中文件会消失,外部表不会消失。

  LOCAL如果数据存在本地需要加LOCAL;如果存在hdfs上就不用了

                 如果是本地,那麽这种方式先上传到hdfs中一个临时文件,再将临时文件移动到hive中对应的数据存放目录下
                 如果是将hdfs中的数据加载进表,那么这种方式实际是讲hdfs中的数据文件移动到了hive的dir下(/user/hive/warehouse)

 

       (内部表和外部表的区别

        建表时: 内部表不用指定数据文件存放的路径。

                     外部表需要指定数据文件存放的路径。

        删表时:  内部表会将元数据删除同时删除库表文件夹及

                      件中的数据。

                      外部表只删除元数据,不会删除文件夹数据

                       文件)

4.在创建新表时,可以同时将查询其他表的数据加载到新表中。用于创建一些临时表存储中间结果。

  create external table t_order_simple(id int, name string, memory string)

  as

  select id, name,price from t_order;

  查询结果:
  select * from t_order_simple;

  结果:
  001  iPhone7s  128G  6888

  002  smartisan  64G  3888

  003  xiaomi  32G  2888   这种方式通常使用查询的中间表使用。

5. 用于向临时表中追加结果数据。表必须已经存在。

  insert overwrite 会覆盖已经存在的数据;

       eg: insert overwrite table table_1 select * from table_0;

             insert overwrite 

  insert into 只是简单的copy插入,不做重复性校验;

6. 分区

  为什么要创建分区表:

  一般集群中的数据量都是特别大的,所以查询数据的时候按分区来查询不会将集群中所有的数据都查询出来

  比如:

  需要对某些信息进行日管理,这时就可以对表来按天分区, 

 

  只是将相应的分区的数据查询出来。

  分区的时候可以以任何名称来分区,没有限制。

  create table t_order_pt(id int, name string, memory string)

  partitioned by (month string)

  row format delimited

  fields terminated by '\t';

  load data local inpath '/home/hadoop/hivetestdata/xxx.data' into table t_order_pt partition(month='2014')

  可以看到集群中相应的文件夹中会又创建了新的一层的文件夹:month=2014,里边会有xxx.data的数据文件

  

  

  hive命令行界面为CLI

  hive 还提供了jdbc和odbc访问hive的功能,这个功能是Thrift服务实现的。

  CLI显示的第一行是CLI将关于用户所执行的命令和嘻哈寻得日志数据所存放在的本地文件系统中的位置。

  Hive所需要的组件中只有一个外部组件是Hadoop没有的,那就是metastore(元数据存储)组件。元数据存储中存储了如表的模式和分区信息等的元数据信息。因为多用户和系统可能需要并发访问元数据存储,所以默认的内置数据库并不适用于生产环境。????不是很懂。

 

  为了使hive能够连接上MYsql,我们需要将JDBC驱动放置在类路径下。这个驱动可以放置在hive的库路径下,也就是$HIVE_HOME/lib目录下。有些团队会将所有这些支持类的库放置在Hadoop的库目录下。驱动和配置设置正确后,hive就会将元数据信息存储到mysql中。

 

. 使用hive命令行

  -d 定义一个变量值,这个变量可以在hive交互shell中引用,后面会介绍用法,比如:-d A=B

  -database 进入hive交互shell时候指定数据库,默认进入default数据库

  -e 命令行执行一段sql语句

  -f filename文件中保存hql语句,执行其中的语句

  -h 显示帮助信息

  -hiveconf 在命令行中设置hive的运行时配置参数,优先级高于hive-site.xml,但低于hive交互shell中使用set命令设置。

  -hivevar 同define

  -i 进图hive交互shell时候先执行filename中的hql语句

  -p 连接远程hive server的端口号

  -S 静默模式,制定后不显示执行进度信息,最后只显示结果

  -v 冗余模式,额外打印出执行的hql语句。

 

. 从文件中执行hive查询

  hive中可以使用-f 文件名方式执行指定文件中的一个或多个查询语句。按照惯例,一般吧这些hive查询文件保存为具有.q或者.hql后缀名的文件。  $ hive -f /path/file/withqueries.hql

  在hive shell中用户可以使用source命令来执行一个脚本文件。eg:
  $ cat /path/to/file/withqueries.hql

  select * from table

  $ hive souece /path/to/file/withqueries.hql

. hiverc文件 没有很懂

. 使用hive CLI的更多介绍

  自动补全功能: 如果用户在输入的过程中敲击Tab制表键,那么CLI会将可能的关键字或者函数补全。

. 查看操作命令历史

  hive会将最近的10000行命令记录到文件$HOME/.hivehistory中。

  如果用户想再次执行之前执行过的某条命令,只需要将光标移动那条记录然后按Enter键就可以了。或者左右键进行编辑修改再执行。

. 执行shell命令

  用户不需要退出hiveLCI就可以执行简单的bash shell 命令。只要在命令上加上!并且以分号(;)结束就可以。

  hive> !/bin/echo "hello world";

    "hello world"

. 在hive内使用Hadoop的dfs命令

  用户可以在hiveCLI中执行Hadoop的dfs命令,只需要将Hadoop命令中的关键字Hadoop去掉,然后以分号结尾就可以了。这种使用Hadoop命令的方式实际上比其等价的在bash shell中执行的Hadoop dfs命令要更高效。因为后者每次都会启动一个新的JVM实例,而会饿会在同一个进程中执行这些命令。

. hive脚本中如何进行注释

  对于hive 0.8.0版本,用户可以使用以--开头的字符串来标示注释。

. 显示字段名称

  我们可以通过设置hiveconf 配置项hive.cli.print.header为true来开启这个功能:

  hvie> set hive.cli.print.header=true;

  如果用户希望总是看到字段名称,那么只需要将set hive.cli.print.header=true; 添加到$HOME./hiverc.xml文件就可以。