精华内容
下载资源
问答
  • 最近接手一个项目,要求与Oracle数据库做对接,分区表还是要做的,可是网上根本涉及内容很少,没办法,用一下午才弄明白,截至发稿,饭都没吃呢。。。。。。。。 分区表概念: 正常增删改查都行,SQL语句正常写,...

    前言(絮叨絮叨)

    最近接手一个项目,要求与Oracle数据库做对接,分区表还是要做的,可是网上根本涉及内容很少,没办法,用一下午才弄明白,截至发稿,饭都没吃呢。。。。。。。。

    分区表概念:

    正常增删改查都行,SQL语句正常写,但是查询可以通过分区表进行区分查询,可以限定范围什么的,特别方便,而且快,不絮叨,直接说主题。

    分区表创建

    先说下,里面有两个地方需要注意,一个是分区字段名,这里用的是:WORKDATE,需要有个分区字段;
    另外一个是划分分区时间的 less than(XXXX),这个时间是比较特殊,超过这个时间会自动创建额外的分区,但暂时这么理解吧,我一般管它叫默认时间,也可以创建多个,但是我都只创建一个,后续会自增。
    月的,年的建议设置时间为每个月的01月1日。

    创建日分区表

    create table TTT(WORKDATE date)
    PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTODSINTERVAL(1,'day'))
    (    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    创建月分区表

    create table TTT(WORKDATE date)
    PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTOYMINTERVAL(1,'month'))
    (    partition P_1995 values less than (TO_DATE('1995-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    创建年分区表

    create table TTT(WORKDATE date)
    PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTOYMINTERVAL(1,'year'))
    (    partition P_1995 values less than (TO_DATE('1995-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    报错信息解决:

    报错:
    ORA-14752: 间隔表达式不是正确类型的常数

    解决:你写错了,日和周的是 NUMTODSINTERVAL,年的和月的 是 NUMTOYMINTERVAL
    在这里插入图片描述

    报错
    ORA-14767: 无法使用现有上限指定此间隔

    解决:你时间写的不对,时间不可以超过指定时间
    月不超过 28号
    年不能超过31号

    在这里插入图片描述

    问题:

    **为什么我创建的都是第二天的分区表?

    需求:我想建分区表时候,插一条数据是创建当前时间的分区

    对于日频度的来说:

    默认日期建议是,是 TO_DATE(‘1995-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’),在这个时间里就会创建当天的分区,超过会创建下一天的分区。

    (    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    对于月频度的来说:

    1号最好

    (    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    对于年频度的来说

    1号最好

    (    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    如果给你提供到了帮助,评论下,点个关注,给个赞。

    展开全文
  • 分区表,子分区表

    千次阅读 2016-04-21 14:56:57
    分区表: 当一张表的数据不断累积增大,使得查询的速度变慢,业务程序性能降低。这个时候可以考虑分区表分区表逻辑上是一张表,单表的数据文件可以放到不同的表空间下面,提高查询的速度。 分区表partition 分为...

    分区表:

    当一张表的数据不断累积增大,使得查询的速度变慢,业务程序性能降低。这个时候可以考虑分区表,分区表逻辑上是一张表,单表的数据文件可以放到不同的表空间下面,提高查询的速度。

    分区表partition 分为list,range,hash分区以及组合分区

    子分区表subpartition 分为list,range,hash以及组合分区


    举例说明:

    现在业务上有一张表  test,表中包涵字段id,createtime,deptno,name,city等等字段

    我们在设计分区表的时候选择createtime作为范围分区,deptno作为子分区list分区

    语句:

    create table test_p_s (id number,createtime date,deptno number,name varchr2(20),city varchar2(20) ....... )

    partition by range(createtime)

    subpartition by list(deptno)

    (

    partition p1 values less than (to_date('2016-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))

    (subpartition s1_1 values(10)  tablespace  x1,

    subpartition s1_2  values(20)  tablespace x2),

    partition p2 values less than (to_date('2016-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))

    (subpartition s2_1 values(10)  tablespace  x1,

    subpartition s2_2  values(20)  tablespace x2));


    增加分区表

    alter table test_p_s add partition p3 values  less than (to_date('2016-03-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))

    (subpartition s3_1 values(10)  tablespace  x1,

    subpartition s3_2  values(20)  tablespace x2));


    展开全文
  • Hive中静态分区表 & 动态分区表

    千次阅读 2017-10-15 23:30:47
    Hive静态单级分区表、静态多级分区表的使用,动态分区表的使用、动态分区表与静态分区表的对比介绍;通过实际操作来验证Hive中分区表的如何使用

    概念的引入

    在Web系的统日志表中,当我们的操作很多时,通常所会采取的办法是:每一次操作都要记录一条日志,而这些日志很多都是按日/月进行分区的;如果不这样做,到时候查起表来回非常非常大。
    假设有以下分区:
    CLICK_LOG_20180801
    CLICK_LOG_20180802
    CLICK_LOG_20180803
    当我们进行这样进行分区之后,对比原来只有一张表CLICK_LOG,会有以下优点:可以提高我们的查询效率

    通过打印的日志观察不使用分区表所带来的问题:

    hive>select deptno, count(1) from emp group by deptno;

    这里写图片描述

    打印的信息中有:
    HDFS Read: 8012,表示读取数据量大小为8012(读取方式为全表读取)

    我们假设:emp表中有10亿条数据
    那么在我们进行全表读取的时候,效率就会很低

    但是当我们使用分区表之后,HDFS上数据存储的目录就会成为:

    /user/hive/warehouse/emp/day=20180808/
    /user/hive/warehouse/emp/day=20180809/

    而我们去Hive表中查询数据时,可以这样写:

    hive>select ... from xxx where day=20180808

    从而抛出Hive中要使用分区表的原因:
    这样的操作,可以减少数据的读取量,进而提升效率

    报错解决方案

    在创建Hive表之后,导入数据的时候,可能会出现报错:

    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes

    报错解决方案/乱码解决办法:
    注意:改变mysql设置,不能改变已经存在的表。我们需要转换表的编码。

    mysql>alter database 数据库名称 character set latin1;
    mysql>use 数据库名称;
    mysql>alter table PARTITIONS convert to character set latin1;
    mysql>alter table PARTITION_KEYS convert to character set latin1;

    静态单级分区表的使用

    从本地导入数据 & Hive表数据与HDFS数据的区别 & Hive表结构的变化

    创建一张表

    create table order_partition(
    order_number string,
    event_time string
    )
    PARTITIONED BY(event_month string)
    row format delimited fields terminated by '\t';

    加载数据:

    hive>load data local inpath '/opt/data/order_created.txt' overwrite 
         into table order_partition PARTITION(event_month='201405');

    数据导入成功,对比hive中查表得到的数据与hdfs中存储的数据:

    hive>select * from order_partition;

    这里写图片描述

    $>hadoop fs -text /user/hive/warehouse/order_partition/event_month=201405/order_created.txt

    这里写图片描述

    发现
    在Hive表中,能查到分区列的数据,但是在HDFS的数据表中查不到分区列的数据
    因为:分区列不是表中的一个实际的列,其实质是一个伪列,而HDFS中存储的是真正的数据,因此肯定看不到该列

    查看表结构:

    hive>desc formatted order_partition;

    多了Partition Information的信息:
    这里写图片描述

    从HDFS导入数据 & 两种方式修改表的分区信息 & 表的分区信息的查询

    在HDFS上创建相应的目录,并上传数据:

    $>hadoop fs -mkdir /user/hive/warehouse/order_partition/event_month=201406
    $>hadoop fs -put /opt/data/order_created.txt /user/hive/warehouse/order_partition/event_month=201406

    HDFS中event_month=201406目录下,已经传入数据:
    这里写图片描述

    但是,出现了一个问题:
    虽然,我们在HDFS上添加了event_month=201406的分区数据,但是Hive表中的数据却仍然没有改变
    我们通过查询Hive表上的数据,验证发现数据确实没有添加进来,数据仍然是5条

    hive>select * from order_partition;

    这里写图片描述

    开始查找原因:
    首先,我们对mysql里的元数据信息进行查询:

    mysql>use zhaotao_hive;
    mysql>select * from PARTITIONS;
    mysql>select * from PARTITION_KEYS;

    发现mysql中,分区信息并没有发生改变
    这里写图片描述

    解决方法
    我们需要对表的分区信息进行修改,因此查阅官方文档
    网址:
    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterPartition

    语法:

    ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
    partition_spec:
      : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

    修改分区信息:

    hive>ALTER TABLE order_partition ADD IF NOT EXISTS PARTITION(event_month='201406'); 

    成功解决,再度查询数据

    hive>select * from order_partition;
    mysql>select * from PARTITIONS;
    mysql>select * from PARTITION_KEYS;

    Hive表中的数据:
    这里写图片描述

    MySQL中的元数据信息:
    这里写图片描述

    通过上图,我们发现数据都进来了,从HDFS中导入分区数据成功

    另一种修改表的分区信息方式(不建议这样操作,暴力执行)
    网址:
    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-RecoverPartitions(MSCKREPAIRTABLE)

    语法:

    MSCK REPAIR TABLE table_name;
    $>hadoop fs -mkdir /user/hive/warehouse/order_partition/event_month=201407
    $>hadoop fs -put /opt/data/order_created.txt /user/hive/warehouse/order_partition/event_month=201407           
    hive>MSCK REPAIR TABLE order_partition; 

    执行完这句话之后,Hive表中的数据直接进来了,mysql的元数据信息也增加了
    这里写图片描述
    这里写图片描述

    不建议这样使用,太暴力了
    举个例子:
    metastore存了一年了,5分钟1个分区,1天就是288个分区
    假设有100条业务线
    一旦这样一执行,可能会造成的情况,就是整个数据库出现风险
    因此,生产上建议使用alter

    查询分区信息

    hive>show partitions order_partition;

    这里写图片描述
    (可以通过查阅源码,去验证show partitions从mysql的哪张表里来读取分区数据信息 )

    【注意】
    如果没有mysql上的元数据信息,HDFS上的数据是和hive中执行的sql无法关联起来的
    因此,每次执行一个SQL语句,都必须要知晓底层的metastore到底干了些什么事情,这对学习Hive会有很大的帮助

    静态多级分区表的使用

    创建表

    create table order_mulit_partition(
    order_number string,
    event_time string
    )
    PARTITIONED BY(event_month string, step string)
    row format delimited fields terminated by '\t';

    从本地向静态多级分区表导入数据

    hive>load data local inpath '/opt/data/order_created.txt' overwrite 
         into table order_mulit_partition PARTITION(event_month='201405', step='1');

    这里写图片描述

    注意:在多分区使用的时候注意: 每个分区字段要写明,包括顺序等等

    动态分区表的使用

    在Hive中,使用动态分区表,这种方式在工作中常用

    需求

    按照不同部门作为分区导数据到目标表

    使用静态分区表来完成

    创建静态分区表:

    create table emp_static_partition(
    empno int, 
    ename string, 
    job string, 
    mgr int, 
    hiredate string, 
    sal double, 
    comm double)
    PARTITIONED BY(deptno int)
    row format delimited fields terminated by '\t';

    插入数据:

    hive>insert into table emp_static_partition partition(deptno=10)
         select empno , ename , job , mgr , hiredate , sal , comm from emp where deptno=10;

    查询数据:

    hive>select * from emp_static_partition;

    这里写图片描述

    使用动态分区表来完成

    创建动态分区表:

    create table emp_dynamic_partition(
    empno int, 
    ename string, 
    job string, 
    mgr int, 
    hiredate string, 
    sal double, 
    comm double)
    PARTITIONED BY(deptno int)
    row format delimited fields terminated by '\t';

    【注意】动态分区表与静态分区表的创建,在语法上是没有任何区别的

    插入数据:

    hive>insert into table emp_dynamic_partition partition(deptno)
         select empno , ename , job , mgr , hiredate , sal , comm, deptno from emp;

    【注意】分区的字段名称,写在最后,有几个就写几个 与静态分区相比,不需要where了

    需要设置属性的值:

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

    这里写图片描述
    【注意】不设置,会报错

    查询数据:

    hive>select * from emp_dynamic_partition;

    这里写图片描述
    分区列为deptno,实现了动态分区

    动态分区表的总结

    动态分区无需手工指定数据导入的具体分区
    而是由select的字段(字段写在最后,有几个写几个)自行决定导出到哪一个分区中
    并自动创建相应的分区,使用上更加方便快捷
    工作中用的非常多

    展开全文
  • 分区 1适用于处理大数据量,如TB级的 2为了提高巨型数据库的...5对表进行分区时,必须为表中每一条记录指定所属分区,该记录属于哪个分区是由分区表对该记录的匹配字段决定的。 6分区字段可以是一个字段或者多个字

    分区
    1适用于处理大数据量,如TB级的
    2为了提高巨型数据库的读写和查询速度
    3用户可以在创建表是应用分区技术,将数据以分区形式保存
    4分区是指将巨型的表或者索引分隔成相对较小的,可独立管理的部分。分区后的表与未分区的表在执行DML语句没有区别.
    5对表进行分区时,必须为表中每一条记录指定所属分区,该记录属于哪个分区是由分区表对该记录的匹配字段决定的。
    6分区字段可以是一个字段或者多个字段的组合。
    7当分区表确定是,用户对分区表进行插入更新或者删除操作时,oracle会自动根据分区字段的值来选择存储存取。
    8创建分区表时,不指定分区名,oracle将自动对分区进行命名。

    分区表的分类
    范围分区:对数据表的某个值的范围进行分区,需要使用partition by range字句。
    散列分区:
    列表分区:
    组合范围散列分区:
    组合范围列表分区:

    创建范围分区表
    create table student_partition(
    sno varchar2(10) ,
    sname varchar2(20),
    sage number(2),
    score number(2)
    )partition by range(score)–范围分区表
    (
    partition part1 values less than(60) tablespace myspace,
    partition part2 values less than(80) tablespace myspace,
    partition part3 values less than(maxvalue) tablespace users
    );

    insert into student_partition values(‘1’,’我叫分区1’,12,55);
    insert into student_partition values(‘2’,’我叫分区1’,12,56);

    insert into student_partition values(‘3’,’我叫分区2’,12,76);
    insert into student_partition values(‘4’,’我叫分区3’,12,86);
    这里写图片描述

    解释:
    partition by range(score)–范围分区表
    range(score):按socre列进行分区
    part1:分区的名称
    tablespace myspace:为part1分区指定存储表空间

    查询分区里面的数据
    select * from student_partition partition(part1);
    select * from student_partition partition(part2);
    select * from student_partition partition(part3);
    这里写图片描述

    展开全文
  • --说明:把非分区表改为分区表适用于历史表 ---1、创建分区表(结构和非分区表TBL_STOCK_BALANCE_LOG相同) CREATE TABLE TBL_STOCK_BALANCE_LOG_PART1 ( ACCOUNT_ID VARCHAR2(20 BYTE), OCCUR_DATE DATE, BRANCH...
  • 如何将硬盘分区表转换为GUID(GPT)分区表 如果不知道自己的硬盘分区表类型可以参看 Windows–如何查看硬盘分区表类型 1、使用PE 制作U盘PE启动盘 进入PE 在PE里打开磁盘精灵 (DG) 右键磁盘 菜单中有转换为...
  • 静态分区表和动态分区表

    千次阅读 2018-01-09 23:15:57
    在Hive中处理数据时,当处理的一张表的数据量过大的时候,每次查询都是遍历整张表,显然对于计算机来说,是负担比较重的。...静态分区表静态分区表的创建 create table order_partition( number string, tim
  • 关键词partition 分区subpartition 辅助分区已经存在的表没有方法可以直接转化为分区表。分区索引一、分区表类型1、范围分区1-1、按指定要求划分假设有一个CUSTOMER表,表中有数据200000行,我们将此表通过CUSTOMER_...
  • PostgreSQL分区表

    千次阅读 2018-09-19 19:01:45
    下面我们将讲述分区表的创建过程。  创建一个学生表,按照学生的成绩对该表分区。插入学生信息时,根据成绩将信息存入不同的分区表中。 1.创建“父表”  所有分区都从“父表”继承,通常情况下,“父表”没有...
  • 原来的采集数据表...直接将原来的非分区表改成分区表的sql如下,是将数据按照采集时间的日期进行分区。 alter table collect_data PARTITION BY LIST (day(collect_time)) ( partition p1 values in(1), par...
  • Hive分区表的分区操作

    万次阅读 2018-05-09 11:11:34
    为了对表进行合理的管理以及提高查询效率,Hive可以将...1、创建分区表通过PARTITIONED BY子句指定,分区的顺序决定了谁是父目录,谁是子目录。创建有一个分区的分区表:CREATE TABLE IF NOT EXISTS part_test( c1 ...
  • MySQL分区表

    千次阅读 2019-04-07 02:01:18
    1.确认Mysql服务是否支持分区表 命令: 2.Mysql分区表特点 1.在逻辑上为一个表,在物理上存储在多个文件中, 2.创建分区表语句: 注意:区别 生成的文件: 非分区表分区表: 3.按...
  • 临时表、分区表、拉链表

    千次阅读 2019-08-15 16:12:08
    文章目录一、临时表二、分区表三、拉链表 一、临时表 二、分区表 三、拉链表
  • 摘要: 本文我们将通过对有同样数据量、表结构除分区列其他都一模一样的表,从查询计算、写入、删除数据几个简单操作进行对比,了解MaxCompute分区表和非分区表在使用上有什么差异。 在介绍之前,需要大家先了解...
  • 在 实战 PostgreSQL 分区表 中并没有涉及到如何修改分区表的问题。这篇内容将聚焦如何进行分区表的修改。 我们使用上一篇 实战 PostgreSQL 分区表 中的 Order 数据的场景,关于如何初始化这部分数据,请参考 实战 ...
  • Mysql分区表

    千次阅读 2019-06-21 19:45:11
    Mysql分区表1 分区概念2 分区的优点3 分区类型4 子分区5 分区的查看和修改6 分区的影响7 各种存储引擎的分区 1 分区概念 分区针对不同的数据库,具有不同的特性。在这里专门针对MySQL数据库而言。在MySQL数据库里,...
  • 分区表与分桶表

    千次阅读 2019-11-22 10:40:43
    分区表: 在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,...
  • mysql与oracle查询、删除分区表 删除分区表 <update id="deletePartition" parameterType="java.lang.String"> alter table bs_fsn drop partition ${partitionName} </update> 使用该语句...
  • 分区表:MBR和GPT分区

    千次阅读 2019-04-28 15:04:16
    MBR(主引导记录),由引导代码和分区表组成,引导代码位于磁盘开头,分区表中记录了每个磁盘分区的起始地址,一共可以保存四个分区的信息,因此MBR分区表只能划分最多四个主分区。为了解决多分区问题出现了EBR分区...
  • ORACLE 分区表分区拆分

    千次阅读 2018-05-10 14:59:16
    ORACLE创建分区表,分区规则为按照日期进行分区,由于投产日期未知,因此建议使用按照当前日期自动创建分区。仅需创建一个max分区,然后通过split进行分区拆分,创建一年前的全部分区。示例代码如下:CREATE TABLE ...
  • 在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表。那么,这两种方式创建的表有什么区别呢?现在,我又最新地创建了两个表:  第一个表名为Sale,这个表使用的是《SQL ...
  • 在做小程序的时候,经理让创建基于时间的分区表,由于以前没弄过,所以做起来做的磕磕碰碰的。现在总结下: 首先需要知道的 是: Oracle分区表分为四类:范围分区表;列表分区表;哈希分区表;组合分区表 ...
  • 在oracle中,普通表转分区表通常有4种方法: expor/import迁移数据 直接从原本重建分区表(插入数据) 交换分区 在线重定义 同样,在pg中也支持将普通表改造成分区表。 1、原表重建 这种方法比较简单,直接从原表...
  • 用WinHex解析分区表

    万次阅读 2016-11-03 00:02:21
    1.利用Winhex软件,打开磁盘主引导扇区,查看磁盘主分区表,计算各分区的大小和起始位置 主引导扇区介绍: 主引导记录(446字节)(0000 – 01BD) 分区表项1(16字节) (01BE – 01CD) 分区表项2(16字节) ...
  • 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. 表空间及分区表的概念 表空间:是一个或...
  • Greenplum 分区表介绍

    千次阅读 2017-10-16 15:02:07
    Greenplum 分区表 Greenplum分区表的原理和postgresql的原理相同,都是把一张大表进行按照适合的维度进行分割,通过表的继承,规则,约束实现的。 在Greenplum中,一个表是否分区表保存在pg_partition中. GP在建表...
  • Hive建表(分区表、非分区表)实例

    千次阅读 2018-01-10 10:12:56
    --非分区表 USE ODS; DROP TABLE IF EXISTS s01_t_sys_file; CREATE TABLE s01_t_sys_file ( id STRING COMMENT '自增长列id', biz_name STRING COMMENT '业务名称', biz_id ...
  • Hive 分区表和二级分区表的基本操作

    千次阅读 2018-09-12 23:27:29
    Hive分区就是在HDFS上创建独立的文件夹,该文件夹下是该分区的所有的数据文件。...1、引入分区表 最终呈现的效果就是在HDFS上按照分区的目录存储文件: /user/hive/warehose/log/201801/01/dep...
  • hive-静态分区表与动态分区表

    千次阅读 2016-09-14 15:59:01
    1.概念静态分区:注意,因为分区列的值要转化为文件夹的存储路径,所以如果分区列的值中包含特殊值,如 ...0.6之前的版本官方文档上说必须要预先创建好分区:分区表不能直接inserthive> insert into ptest values(3,u

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,254
精华内容 16,101
关键字:

分区表