❶ 如何基于一个hdfs文件创建hive表
1. 创建一个表,带分区
create table if not exists kd_ud.tmp_sex
(
pid string
,phone string
,sex string
,source string
,prob string
)
partitioned by (pt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ STORED AS TEXTFILE;
2. 挂载hdfs目录下的一个文件到hive 表中
alter table kd_ud.tmp_sex add partition(pt=’2016-02-17’) location ‘/user/rd/dm/support/passenger/sex’;
❷ hive的分区和分桶有什么却别
1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
2、表和列名不区分大小写。
3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。
4、建表的语法(建分区可参见PARTITIONED BY参数):
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
5、分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
a、单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。
b、双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
❸ hive分区的作用
Hive分区。
是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。
下面从用shell命令操作分区表和从hdfs文件系统查看分区表相结合的方式加深对分区表的认识。
第一,创建分区表并将本地文件中的数据加载到分区表中。
要注意的是:首先,创建分区表的时候,要通过关键字 partitioned by (name string)声明该表是分区表,并且是按照字段name进行分区,name值一致的所有记录存放在一个分区中,分区属性name的类型是string类型。当然,可以依据多个列进行分区,即对某个分区的数据按照某些列继续分区。
其次,向分区表导入数据的时候,要通过关键字partition(name=“jack”)显示声明数据要导入到表的哪个分区,这里表示要将数据导入到分区为name=jack的分区。
再次,这里要重点强调,所谓分区,这是将满足某些条件的记录打包,做个记号,在查询时提高效率,相当于按文件夹对文件进行分类,文件夹名可类比分区字段。这个分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正在存储在数据表文件中,是所谓伪列。所以,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。比如上面的分区依据的列name并不真正的存在于数据表中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的,不是从数据表中读取之后根据值的不同将其分区。我们并不能按照某个数据表中真实存在的列,如userid来分区
❹ hive distribute by 和group by 的区别
hive
distribute
by
和group
by
的区别:
group
by是对检索结果的保留行进行单纯分组,一般总爱和聚合函数一块用例如AVG(),COUNT(),max(),main()等一块用。
distribute
by是控制在map端如何拆分数据给rece端的。hive会根据distribute
by后面列,对应rece的个数进行分发,默认是采用hash算法。sort
by为每个rece产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个recer,这通常是为了进行后续的聚集操作。distribute
by刚好可以做这件事。因此,distribute
by经常和sort
by配合使用。
注:Distribute
by和sort
by的使用场景
1.Map输出的文件大小不均。
2.Rece输出文件大小不均。
3.小文件过多。
4.文件超大。
抛砖引玉,不足之处还望大神指正~
❺ Hive分区过多有何坏处以及分区时的注意事项
1.当分区过多且数据很大时,可以使用严格模式,避免出发一个大的maprece任务。当分区数量过多且数据量较大时,执行宽范围的数据扫描会触发一个很大的maprece任务。在严格模式下,当where中没有分区过滤条件时会禁止执行。
2.hive如果有过多的分区,由于底层是存储在HDFS上,HDFS上只用于存储大文件 而非小文件,因为过多的分区会增加namenode的负担。
3.hive会转化为maprece,maprece会转化为多个task。过多小文件的话,每个文件一个task,每个task一个JVM实例,JVM的开启与销毁会降低系统效率。