sql
—
获取指定hive表或指定文件所hive表DDL按区则默认执行近7区DDL同table支持符合sql语则表达式表匹配则提示用户选择(使用file则自关闭该交互功能)Hive分区。
是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。
下面从用shell命令 *** 作分区表和从hdfs文件系统查看分区表相结合的方式加深对分区表的认识。
第一,创建分区表并将本地文件中的数据加载到分区表中。
要注意的是:首先,创建分区表的时候,要通过关键字 partitioned by (name string)声明该表是分区表,并且是按照字段name进行分区,name值一致的所有记录存放在一个分区中,分区属性name的类型是string类型。当然,可以依据多个列进行分区,即对某个分区的数据按照某些列继续分区。
其次,向分区表导入数据的时候,要通过关键字partition(name=“jack”)显示声明数据要导入到表的哪个分区,这里表示要将数据导入到分区为name=jack的分区。
再次,这里要重点强调,所谓分区,这是将满足某些条件的记录打包,做个记号,在查询时提高效率,相当于按文件夹对文件进行分类,文件夹名可类比分区字段。这个分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正在存储在数据表文件中,是所谓伪列。所以,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。比如上面的分区依据的列name并不真正的存在于数据表中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的,不是从数据表中读取之后根据值的不同将其分区。我们并不能按照某个数据表中真实存在的列,如userid来分区
报错,因为没有设置set hiveexecdynamicpartition=true和set hiveexecdynamicpartitionmore=nonstrick这两个参数
设置两个参数 当前窗口关闭之后这个设置就无效了,需要重新设置 ,再插入数据
再次查看d_part表,分区值已经被设置成salary的值了
查看此时d_part表的分区情况
partitioned by (dp string,value string) 、partition(dp,value) 、name as dp, salary as value这三个部分顺序必须一致
查看此时的d_part_2表,name字段作为分区字段dp的值,salary字段作为value字段的值
建表:create table T_user(id int, name string) partitioned by (country string ) row format delimited fieleds terminated by ','
导入数据:load data local inpath 'xx/xx/xxtxt' into table T_user; partition(country = 'USA') ;
建表:
create table T_user(id int, name string) partitioned by (dt string, hour string)
row format delimited fieleds terminated by ',' ——指定分隔符
注:
1、创建一个表,字段之间用 \t 分隔(也可以用其他字符分割,自定义默认‘\001’);
hive>create table student (id int, name string) row format delimited fields terminated by '\t' ;
2、将本地一个数据提交到hive里去
hive>load data local inpath '/home/studenttxt' into table student ;
21 增加分区表数据
alter table ZHIYOUBAOCHECK_RECORD add partition (years='xxxx',months='xx',days='xx') location '/ZYB/CHECK_RECORD/yy=xxxx/mm=xx/dd=xx/';
3、查询表里的数据:
hive>select from student ;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)