精华内容
下载资源
问答
  • Hive分区

    万次阅读 2017-08-29 17:27:49
    hive对表进行分区,如按照日期,城市等方式区分,可以起到提升查询速度的作用。 创建一个新的employee表,存储如下数据:id, name, dept 1 lllis tp 2 sssll hr 3 jslsj sc 4 lslsl sc 然后我们按照年份来对数据...

    hive对表进行分区,如按照日期,城市等方式区分,可以起到提升查询速度的作用。
    创建一个新的employee表,存储如下数据:

    id, name, dept
    1       lllis   tp      
    2       sssll   hr      
    3       jslsj   sc      
    4       lslsl   sc      

    然后我们按照年份来对数据进行分区存储。
    1、添加分区基本语法:

    ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location1']   partition_spec [LOCATION 'location2'] …
    partition_spec:
    : (p_column = p_col_value, p_column = p_col_value, ...)

    以下语句是将employee表按照年份分区的命令:

    ALTER TABLE employee ADD PARTITION (year='2013') location '/2013/part2013';

    执行这个语句的时候直接报了如下的错:

    Error: Error while compiling statement: FAILED: ValidationFailureSemanticException table is not partitioned but partition spec exists: {year=2013} (state=42000,code=40000)

    大意是表不是一个分区表,无法创建分区。搜索之后了解到需要在创建表时就创建分区。
    删除employee表,重新创建,创建语句如下:

    CREATE EXTERNAL TABLE IF NOT EXISTS userdb.employee(eid int,name String,dept String)
    PARTITIONED BY (year_p int)
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY '\t'
    LINES TERMINATED BY '\n'
    STORED AS TEXTFILE;

    数据格式:

    1       lllis   tp
    2       sssll   hr
    3       jslsj   sc
    4       lslsl   sc

    导入数据语句:

    LOAD DATA LOCAL INPATH '/home/hadoop/HivePy/employee.txtn' OVERWRITE INTO TABLE userdb.employee PARTITION(year_p=2017);

    导入之后的结果为:
    这里写图片描述

    经验证,不能直接给一个表添加分区,可能是我没用对方法。。。
    2、重命名分区:

    ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;

    修改employee表分区

    ALTER TABLE employee PARTITION (year_p='2017') 
    RENAME TO PARTITION (year_p='2016');

    执行命令之后查看表数据,如图所示:
    这里写图片描述

    3、删除分区:

    ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spc,…

    删除employee表分区

    ALTER TABLE employee DROP PARTITION (year_p='2016');

    执行语句之后会删除此分区的所有数据,如图所示:
    这里写图片描述

    展开全文
  • hive分区

    2014-03-18 17:38:29
    hive中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash分区、混合分区等)。分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说在表的数据文件中实际上并不保存分区列的信息与数据。

    原文地址:http://www.itpub.net/redirect.php?tid=1466017&goto=lastpost#
    所介绍内容基本上是翻译官方文档,比较肤浅,如有错误,请指正!
    hive中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash分区、混合分区等)。分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说在表的数据文件中实际上并不保存分区列的信息与数据。
    下面的语句创建了一个简单的分区表:
    
    create table partition_test
    (member_id string,
    name string
    )
    partitioned by (
    stat_date string,
    province string)
    row format delimited fields terminated by ',';
    
    这个例子中创建了stat_date和province两个字段作为分区列。通常情况下需要先预先创建好分区,然后才能使用该分区,例如:
    
    alter table partition_test add partition (stat_date='20110728',province='zhejiang');
    
    这样就创建好了一个分区。这时我们会看到hive在HDFS存储中创建了一个相应的文件夹:
    
    $ hadoop fs -ls /user/hive/warehouse/partition_test/stat_date=20110728
    Found 1 items
    drwxr-xr-x - admin supergroup 0 2011-07-29 09:53 /user/hive/warehouse/partition_test/stat_date=20110728/province=zhejiang
    
    每一个分区都会有一个独立的文件夹,下面是该分区所有的数据文件。在这个例子中stat_date是主层次,province是副层次,所有stat_date='20110728',而province不同的分区都会在/user/hive/warehouse/partition_test/stat_date=20110728 下面,而stat_date不同的分区都会在/user/hive/warehouse/partition_test/ 下面,如:
    
    $ hadoop fs -ls /user/hive/warehouse/partition_test/
    Found 2 items
    drwxr-xr-x - admin supergroup 0 2011-07-28 19:46 /user/hive/warehouse/partition_test/stat_date=20110526
    drwxr-xr-x - admin supergroup 0 2011-07-29 09:53 /user/hive/warehouse/partition_test/stat_date=20110728
    
    注意,因为分区列的值要转化为文件夹的存储路径,所以如果分区列的值中包含特殊值,如 '%', ':', '/', '#',它将会被使用%加上2字节的ASCII码进行转义,如:
    
    hive> alter table partition_test add partition (stat_date='2011/07/28',province='zhejiang');
    OK
    Time taken: 4.644 seconds
    
    $hadoop fs -ls /user/hive/warehouse/partition_test/
    Found 3 items
    drwxr-xr-x - admin supergroup 0 2011-07-29 10:06 /user/hive/warehouse/partition_test/stat_date=2011/07/28
    drwxr-xr-x - admin supergroup 0 2011-07-28 19:46 /user/hive/warehouse/partition_test/stat_date=20110526
    drwxr-xr-x - admin supergroup 0 2011-07-29 09:53 /user/hive/warehouse/partition_test/stat_date=20110728
    
    我使用一个辅助的非分区表partition_test_input准备向partition_test中插入数据:
    
    hive> desc partition_test_input;
    OK
    stat_date string
    member_id string
    name string
    province string
    
    hive> select * from partition_test_input;
    OK
    20110526 1 liujiannan liaoning
    20110526 2 wangchaoqun hubei
    20110728 3 xuhongxing sichuan
    20110728 4 zhudaoyong henan
    20110728 5 zhouchengyu heilongjiang
    
    然后我向partition_test的分区中插入数据:
    
    hive> insert overwrite table partition_test partition(stat_date='20110728',province='henan') select member_id,name from partition_test_input where stat_date='20110728' and province='henan';
    Total MapReduce jobs = 2
    ...
    1 Rows loaded to partition_test
    OK
    
    还可以同时向多个分区插入数据,0.7版本以后不存在的分区会自动创建,0.6之前的版本官方文档上说必须要预先创建好分区:
    
    hive>
    > from partition_test_input
    > insert overwrite table partition_test partition (stat_date='20110526',province='liaoning')
    > select member_id,name where stat_date='20110526' and province='liaoning'
    > insert overwrite table partition_test partition (stat_date='20110728',province='sichuan')
    > select member_id,name where stat_date='20110728' and province='sichuan'
    > insert overwrite table partition_test partition (stat_date='20110728',province='heilongjiang')
    > select member_id,name where stat_date='20110728' and province='heilongjiang';
    Total MapReduce jobs = 4
    ...
    3 Rows loaded to partition_test
    OK
    
    特别要注意,在其他数据库中,一般向分区表中插入数据时系统会校验数据是否符合该分区,如果不符合会报错。而在hive中,向某个分区中插入什么样的数据完全是由人来控制的,因为分区键是伪列,不实际存储在文件中,如:
    
    
    hive> insert overwrite table partition_test partition(stat_date='20110527',province='liaoning') select member_id,name from partition_test_input;
    Total MapReduce jobs = 2
    ...
    5 Rows loaded to partition_test
    OK
    
    hive> select * from partition_test where stat_date='20110527' and province='liaoning';
    OK
    1 liujiannan 20110527 liaoning
    2 wangchaoqun 20110527 liaoning
    3 xuhongxing 20110527 liaoning
    4 zhudaoyong 20110527 liaoning
    5 zhouchengyu 20110527 liaoning
    
    可以看到在partition_test_input中的5条数据有着不同的stat_date和province,但是在插入到partition(stat_date='20110527',province='liaoning')这个分区后,5条数据的stat_date和province都变成相同的了,因为这两列的数据是根据文件夹的名字读取来的,而不是实际从数据文件中读取来的:
    
    $ hadoop fs -cat /user/hive/warehouse/partition_test/stat_date=20110527/province=liaoning/000000_0
    1,liujiannan
    2,wangchaoqun
    3,xuhongxing
    4,zhudaoyong
    5,zhouchengyu
    这样操作太他妈的麻烦了
    下面介绍一下动态分区,因为按照上面的方法向分区表中插入数据,如果源数据量很大,那么针对一个分区就要写一个insert,非常麻烦。况且在之前的版本中,必须先手动创建好所有的分区后才能插入,这就更麻烦了,你必须先要知道源数据中都有什么样的数据才能创建分区。
    使用动态分区可以很好的解决上述问题。动态分区可以根据查询得到的数据自动匹配到相应的分区中去。 
    使用动态分区要先设置hive.exec.dynamic.partition参数值为true,默认值为false,即不允许使用:
    
    hive> set hive.exec.dynamic.partition;
    hive.exec.dynamic.partition=false
    hive> set hive.exec.dynamic.partition=true;
    hive> set hive.exec.dynamic.partition;
    hive.exec.dynamic.partition=true
    
    动态分区的使用方法很简单,假设我想向stat_date='20110728'这个分区下面插入数据,至于province插入到哪个子分区下面让数据库自己来判断,那可以这样写:
    
    hive> insert overwrite table partition_test partition(stat_date='20110728',province)
    > select member_id,name,province from partition_test_input where stat_date='20110728';
    Total MapReduce jobs = 2
    ...
    3 Rows loaded to partition_test
    OK
    
    stat_date叫做静态分区列,province叫做动态分区列。select子句中需要把动态分区列按照分区的顺序写出来,静态分区列不用写出来。这样stat_date='20110728'的所有数据,会根据province的不同分别插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夹下,如果源数据对应的province子分区不存在,则会自动创建,非常方便,而且避免了人工控制插入数据与分区的映射关系存在的潜在风险。
    
    注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区:
    
    hive> insert overwrite table partition_test partition(stat_date,province='liaoning')
    > select member_id,name,province from partition_test_input where province='liaoning';
    FAILED: Error in semantic analysis: Line 1:48 Dynamic partition cannot be the parent of a static partition 'liaoning'
    
    动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数hive.exec.dynamic.partition.mode :
    
    hive> set hive.exec.dynamic.partition.mode;
    hive.exec.dynamic.partition.mode=strict
    
    它的默认值是strick,即不允许分区列全部是动态的,这是为了防止用户有可能原意是只在子分区内进行动态建分区,但是由于疏忽忘记为主分区列指定值了,这将导致一个dml语句在短时间内创建大量的新的分区(对应大量新的文件夹),对系统性能带来影响。
    所以我们要设置:
    hive> set hive.exec.dynamic.partition.mode=nostrick;
    
    再介绍3个参数:
    hive.exec.max.dynamic.partitions.pernode (缺省值100):每一个mapreduce job允许创建的分区的最大数量,如果超过了这个数量就会报错
    hive.exec.max.dynamic.partitions (缺省值1000):一个dml语句允许创建的所有分区的最大数量
    hive.exec.max.created.files (缺省值100000):所有的mapreduce job允许创建的文件的最大数量
    
    当源表数据量很大时,单独一个mapreduce job中生成的数据在分区列上可能很分散,举个简单的例子,比如下面的表要用3个map:
    1
    1
    1
    2
    2
    2
    3
    3
    3
    
    如果数据这样分布,那每个mapreduce只需要创建1个分区就可以了: 
             |1
    map1 --> |1 
             |1 
    
             |2
    map2 --> |2 
             |2 
    
             |3
    map3 --> |3 
             |3
    但是如果数据按下面这样分布,那第一个mapreduce就要创建3个分区: 
    
             |1
    map1 --> |2 
             |3 
    
             |1
    map2 --> |2 
             |3 
    
             |1
    map3 --> |2 
             |3
    
    下面给出了一个报错的例子:
    hive> set hive.exec.max.dynamic.partitions.pernode=4;
    hive> insert overwrite table partition_test partition(stat_date,province)
    > select member_id,name,stat_date,province from partition_test_input distribute by stat_date,province;
    Total MapReduce jobs = 1
    ...
    [Fatal Error] Operator FS_4 (id=4): Number of dynamic partitions exceeded hive.exec.max.dynamic.partitions.pernode.. Killing the job.
    Ended Job = job_201107251641_0083 with errors
    FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask
    
    为了让分区列的值相同的数据尽量在同一个mapreduce中,这样每一个mapreduce可以尽量少的产生新的文件夹,可以借助distribute by的功能,将分区列值相同的数据放到一起:
    
    hive> insert overwrite table partition_test partition(stat_date,province)
    > select member_id,name,stat_date,province from partition_test_input distribute by stat_date,province;
    Total MapReduce jobs = 1
    ...
    18 Rows loaded to partition_test
    OK
    
    好了,关于hive的分区表先简单介绍到这里,后续版本如果有功能的更新我也会再更新。


    展开全文
  • Hive 分区

    万次阅读 2016-05-10 08:28:41
    1. 建立多个表,每个表导入不同的数据 create table test_1 (id int); create table test_2 (id int); create table test_3 (id int);... 创建分区表 create table test(id int) partitioned by (name sting);
    1. 建立多个表,每个表导入不同的数据
    create table test_1 (id int);
    create table test_2 (id int);
    create table test_3 (id int);
    ............
    2. 创建分区表
    create table test(id int) partitioned by (name sting);
    alter table test add partition (name = '1')
    alter table test add partition (name = '2')
    切忌分区过多, namenode 压力太大
    3. 分区数目太多可以考虑分桶
    create table test(id int, name string) partitioned by (age int) clustered by (id) into 96 buckets;
    展开全文
  • hive 分区

    2013-05-05 23:28:27
    create table day_table (id int, content string) partitioned by (dt string);...动态分区 set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict;   INS

    create table day_table (id int, content string) partitioned by (dt string);

    schematool -dbType MySQL -initSchema


    动态分区

    set hive.exec.dynamic.partition=true;

    set hive.exec.dynamic.partition.mode=nonstrict;




     

    INSERT OVERWRITE TABLE target PARTITION (dt)
    SELECT id,user_id,app_id,time,ip,substr(time,0,10) FROM origin

    可以将老数据load 到hive表中后, 然后在用insert select 方式给老数据创建分区。

     

    在处理好老数据分区后,用静态分区:

     

    create table partuserview(userid string,hourid string,cityid string,fronturl string,contentype int)  partitioned by (dt string) row format delimited fields terminated by '\t';

    load data local inpath '/home/xincl/hive-0.6.0/data/userview.txt' into table partuserview partition(dt='20101110');

     

    创建bucket表语句:
    > create  table butuserview(userid string,hourid string,cityid string,fronturl string,contentype int)  clustered by (hourid) into 12 buckets row format delimited fields terminated by '\t';
    上面指定使用hourid来做bucket,有12个bucket。用hourid的hashcode MOD bucket个数。

     


    sqoop 引用分区:


      sqoop import --connect jdbc:postgresql://ip/db_name --username user_name  --table table_name  --hive-import -m 5 --hive-table hive_table_name  (--hive-partition-key partition_name --hive-partition-value partititon_value);

     

     

    修改字段类型:

     ALTER TABLE MUSER_BASICINFO_CPA CHANGE USERINDEX USERINDEX bigint;


    展开全文
  • Hive分区partition详解

    万次阅读 多人点赞 2017-11-01 20:57:59
    Hive分区partition详解
  • Hive分区的概念与传统关系型数据库分区不同。传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区。Hive的分区方式:由于Hive实际是存储在HDFS上的抽象...
  • hive分区以及动态分区

    2019-06-06 14:07:55
    hive分区主要是为了提高检索效率,内部表和外部表都可以创建分区) hive静态分区操作 静态分区操作数据 1,小明1,lol-book-move,beijing:shangxuetang-shanghai:pudong 2,小明2,lol-book-move,beijing:...
  • Spark操作Hive分区

    千次阅读 2018-12-07 00:11:32
    前面学习总结了Hive分区表,现在学习总结一下Spark如何操作Hive分区表,包括利用Spark DataFrame创建Hive的分区表和Spark向已经存在Hive分区表里插入数据,并记录一下遇到的问题以及如何解决。 1、Spark创建分区表 ...
  • Hive 分区

    千次阅读 2018-08-30 14:02:18
    Hive 分区表创建 hive> CREATE TABLE t3(id int,name string,age int) PARTITIONED BY (Year INT, Month INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ; OK Time taken: 0.147 seconds 查看表的...
  • Hive分区表实战

    2018-03-13 12:25:50
    1. Hive分区表 2. 静态分区 应用场景1 应用场景2 应用场景3 2. 动态分区 应用场景1 应用场景2 应用场景3 3. 修改分区 1. 添加分区 2. 重命名 3. 交换分区 4. 恢复分区 5. 删除分区 1. Hive分区表 ...
  • 文章目录第二十一天 -- hive补充 -- hive分区、分桶 -- hive数据导入导出一、Hive基础补充二、Hive分区hive分区的目的hive分区和mysql分区的区别hive的分区技术hive分区根据分区关键字分区本质hive分区练习hive分区...
  • hive分区

    千次阅读 2017-07-17 00:32:10
    hive分区表假设有海量的数据保存在hdfs的某一个hive表明对应的目录下,使用hive进行操作的时候,往往会搜索这个目录下的所有文件,这有时会非常的耗时,如果我们知道 这些数据的某些特征,可以事先对他们进行分裂,...
  • Hive 分区表 Select 优化

    2020-07-09 15:45:45
    hive分区表执行select操作时,经常执行很慢,原因竟是因为一个点! 优化适配情况: 分区表执行select操作where选择某一分区或多个分区查询 操作: where条件内分区选择时 在分区字段上加单引号' ' 原始写法...
  • hive 分区字段为空

    千次阅读 2019-09-03 20:42:08
    hive 分区字段为空
  • [Hive]Hive分区表新增字段

    万次阅读 2015-04-03 09:58:23
    [Hive]Hive分区表新增字段
  • 一、hive分区概念(partition) 1.hive的概念 hive 是基于Hadoop的一个数据仓库工具,底层存储是基于 HDFS 进行存储,Hive 的计算底层是转换成 MapReduce任务进行计算,hive可以将结构化的数据文件映射为一张数据库表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,475
精华内容 17,790
关键字:

hive分区