写在前面的话:linux
该系列博文是我学习《 Hive源码解析与开发实战》视频课程的一个笔记,或者说总结,暂时没有对视频中的操做去作验证,只是纯粹的学习记录。sql
有兴趣看该视频的博友能够留言,我会共享出来,相互交流学习 ^.^。数据库
*********************************************************************************************************工具
由于hive执行的结果数据是保存在hdfs上面的,因此能够直接用hadoop命令将数据导出。主要包括get和text。oop
演示:学习
因而在相应目录下就多了一个newdata的文件,其中/*的星号表示获取该目录下全部文件的全部内容,而后追加到newdata文件中去。注意第一个路径是hdfs上的路径,第二个路径是得到的数据要存放到本地那个位置。spa
上面这个命令把/warehouse/testext/目录下全部文件的全部内容打印到控制台,固然若是想保存到本地某个文件能够用linux重定向写到一个文件中(固然也能够用>>来追加):3d
使用 hadoop fs -text 命令能够对多种数据格式文件进行操做,也就是说适合多种文件格式的数据导出。orm
把查询的结果保存到本地的一个目录或者hadoop的hdfs上。其中第二行的row format表示保存的数据以什么样的分隔符保存,这种只在本地保存的状况才支持,hdfs上保存不支持这种写法。视频
演示:
这种方式须要在hive客户的执行。
最终会在data3这个目录下生产一个文件,这个文件包含了查询结果的数据:
查看该文件内容:
这里因为咱们在insert的时候没有指定分隔符,因此在这里采用hive默认的分割符。咱们指定下分隔符:
因为这里我设置一'\t'做为分割符,因此结果为:
另外还能够将数据保存到hdfs上去,但这样就不可以使用row format,不然会报错,因此输入下面的命令:
执行完上述命令后会在hdfs相应的目录下产生结果。
查看结果以下:
因为这种方式没法指定分隔符,因此采用了系统默认的分隔符I,这能够说是Hive的缺陷,由于hdfs上不容许再指定分隔符了。这样的话不如写到本地目录,还能够指定分割符。
hive -f/e | sed/grep/awk >file
好比sqoop,把非关系型数据库和关系型数据库互相导入。
注意:下面动态分区的两个参数应该为nonstrict和strict而不是nonstrick;下面可能写错了。
使用动态分区以前,须要设定一些参数:
一个表一天产生的分区数最多不要超过1000个分区,不然的话,Mysql会出问题。
使用动态分区,上面配置的前两个必须设置,后面的设置是可选的。固然这些设置是直接在hive终端中设置,仅对当前hive终端有效。
演示:
①首先建立一个分区表:
虽然这个时候指明了分区字段,但此时尚未分区,同时也没有数据。
而后咱们考虑经过查询向其中插入数据:
首先对比以前往指定分区插入数据的区别:
①以前,在往指定分区中插入数据的时候,指定分区是须要些分区字段值的,好比:partition(vale='34'),可是在这里没有;
②以前,只须要select查询出要插入的字段值,不用查询并指定分区字段值,也就是这里多了:addr as value;
上面这条插入语句的意思是:从testext中查询name和addr字段的值,其中name字段的值直接插入到d_part相应字段,addr字段指定为分区字段;最后按照这样的方式
插入d_part表中;这就是动态分区。
演示一个分区的状况下的动态分区:
这里报错,由于hive默认是strict设置,即:静态分区,所以咱们须要进行设置hive为nonstrict,而且同时还要开启动态分区:
而后咱们能够看下该表是否有数据了,以及有哪些分区:
能够看到这里的几个分区是动态根据查询另一个表动态生成的。咱们能够按照下面的方式查看下,89分区下面的值:
查看下hdfs上该表的目录结构,发现确实产生了三个分区:
演示有两个分区状况下的动态分区:
①首先建立分区表:
②而后查询插入数据,在hive终端输入下面的语句:
另外查看属性值,用"set 属性名 " 的方式。
执行完插入以后,咱们能够查看下分区:
注意前面的value是以及分区目录,后面dt为二级分区。
另外若是是静态分区的话,那么第一个分区必须是静态分区,也就是在插入的时候,partition(...)中的第一个值必须进行赋值,固然也能够有多个静态分区,但静态分区必须放在前面,好比:
最后注意:partition(。。)括号中字段顺序必须和建立表的时候指定的分区顺序一致,同时和后面select查询插入字段的顺序一致。