`
denniszjw
  • 浏览: 17628 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hive二级分区

阅读更多
几年前的工作了,放在草稿箱2,3年了,整理一下吧。

内容主要是扩展了hive的分区方式,原生的hive支持多字段等值分区,对于很有用的range、hash、list等数据库传统的分区方式不支持,因此这个做了二级的多类分区的扩展。

这里只是antlr的定义,显然你还需要在查询、存储层做更多的工作来支持这种分区工作,量还是不小的,我们的工作不具参考性,这里只列一下sql解析的修改,给大家做参考。


语法定义
tablePartition
@init { msgs.push("table partition specification"); }
@after { msgs.pop(); }
    : KW_PARTITIONED KW_BY partParamList=partitionParamList
    tableSubPartition?
    partitionTemplate?
    -> ^(TOK_PARTITIONED_BY $partParamList
    tableSubPartition?
    partitionTemplate?)
    ;
    
tableSubPartition
@init { msgs.push("table subPartition specification"); }
@after { msgs.pop(); }
    :KW_SUBPARTITIONED KW_BY partParamList=partitionParamList
   subPartitionTemplate?
    -> ^(TOK_SUBPARTITIONED_BY $partParamList
    subPartitionTemplate?)
    ;
    
partitionParamList
@init { msgs.push(" partitionParamList specification"); }
@after { msgs.pop(); }
    :(LPAREN (columnNameTypeList
    	|columnNameList
   	| functionList
    ) RPAREN)  
    | (columnNameTypeList
    	|columnNameList
   	| functionList)
    ;
    
partitionTemplate
@init { msgs.push("table PartitionTemplate specification"); }
@after { msgs.pop(); }
    :partitionExper (COMMA partitionExper)*
     -> ^(TOK_PARTITION_EXPER partitionExper+)
    ;
    
subPartitionTemplate
@init { msgs.push(" subPartitionTemplate specification"); }
@after { msgs.pop(); }
    : (subPartitionExper (COMMA subPartitionExper)*)
    -> ^(TOK_SUBPARTITION_EXPER subPartitionExper+)
    ;

partitionExper
@init { msgs.push("partitionExper specification"); }
@after { msgs.pop(); }
    :KW_PARTITION partition_name=partitionName  partitionValuesExper  tableSubPartition?
    -> ^(TOK_PARTITION $partition_name partitionValuesExper tableSubPartition?)
    ;
    
partitionValuesExper
@init { msgs.push(" partitionValuesExper specification"); }
@after { msgs.pop(); }
    :KW_VALUES  KW_LESS KW_THEN LPAREN value=stringOrNumOrFunc RPAREN 
    -> ^(TOK_VALUES_LESS  $value )
    |KW_VALUES  KW_GREATER KW_THEN LPAREN value=stringOrNumOrFunc RPAREN 
     -> ^(TOK_VALUES_GREATER  $value )
    | KW_VALUES LPAREN valueList=stringOrNumOrFuncList RPAREN
     -> ^(TOK_VALUES   $valueList )
    ;
    
subPartitionExper
@init { msgs.push("subPartitionExper specification"); }
@after { msgs.pop(); }
/*
    :KW_SUBPARTITION partitionName (
     (KW_VALUES ((KW_LESS|KW_GREATER) KW_THEN) LPAREN (stringOrNumOrFunc) RPAREN)
     | KW_VALUES LPAREN (stringOrNumOrFuncList) RPAREN)
    ;
    */
      :KW_SUBPARTITION partition_name=partitionName  partitionValuesExper 
    -> ^(TOK_SUBPARTITION $partition_name partitionValuesExper)
    ;
    
stringOrNumOrFunc
 @init { msgs.push("table stringOrNumOrFunc specification"); }
@after { msgs.pop(); }
    :StringLiteral
    |Number
    |function
    ;
    
 stringOrNumOrFuncList  
@init { msgs.push("table stringOrNumOrFuncList specification"); }
@after { msgs.pop(); }
 :(stringOrNumOrFunc (COMMA stringOrNumOrFunc)*)
 -> ^(TOK_STR_OR_NUM_OR_FUNC stringOrNumOrFunc+)
    ;
      
partitionName
@init { msgs.push("table partitionName specification"); }
@after { msgs.pop(); }
    :
      Identifier
    ;
    
 datawarehouseStatement
@init { msgs.push("table datawarehouseStatement specification"); }
@after { msgs.pop(); }
    :
      KW_ALTER KW_DW  KW_DIRECT LPAREN dwNo=Number COMMA sql=StringLiteral RPAREN
       -> ^(TOK_ALTER_DW $dwNo $sql)
    ;

//added by zjw to customize table partition
functionList
@init { msgs.push("table partition function specification"); }
@after { msgs.pop(); }
    :
    function  (COMMA function)*  -> ^(TOK_TABLEPARTCOLS (function)+)
    ;	


JDO定义:
 <field name="partitionKeys" table="PARTITION_KEYS" >
        <collection element-type="MFieldSchema"/>
        <join>
          <primary-key name="PARTITION_KEY_PK">
            <column name="TBL_ID"/>
            <column name="PKEY_NAME"/>
          </primary-key>	
          <column name="TBL_ID"/>
        </join>
        <element>
          <embedded>
            <field name="name">
              <column name="PKEY_NAME" length="128" jdbc-type="VARCHAR"/>
              </field>
            <field name="type">
              <column name="PKEY_TYPE" length="767" jdbc-type="VARCHAR" allows-null="false"/>
            </field>
            <field name="comment" >
              <column name="PKEY_COMMENT" length="4000" jdbc-type="VARCHAR" allows-null="true"/>
            </field>
            <!-- added by zjw for subpartitions -->
            <field name="part_num">
              <column name="P_NUM" jdbc-type="integer"/>
            </field>
            <field name="part_level">
              <column name="P_LEVEL" jdbc-type="integer"/>
            </field>
            <field name="part_type">
              <column name="P_TYPE" length="256" jdbc-type="VARCHAR" allows-null="false"/>
            </field>
            <field name="part_type_param" >
              <column name="P_TYPE_PARAM" length="767" jdbc-type="VARCHAR" allows-null="true"/>
            </field>
            <!-- added by zjw for subpartitions -->
            <field name="subPartitionKeys" table="SUB_PARTITION_KEYS" >
		        <collection element-type="MFieldSchema"/>
		        <join>
		          <primary-key name="PARTITION_KEY_PK">
		            <column name="TBL_ID"/>
		            <column name="PKEY_NAME"/>
		          </primary-key>	
		          <column name="TBL_ID"/>
		        </join>
		        <element>
		          <embedded>
		            <field name="name">
		              <column name="PKEY_NAME" length="128" jdbc-type="VARCHAR"/>
		              </field>
		            <field name="type">
		              <column name="PKEY_TYPE" length="767" jdbc-type="VARCHAR" allows-null="false"/>
		            </field>
		            <field name="comment" >
		              <column name="PKEY_COMMENT" length="4000" jdbc-type="VARCHAR" allows-null="true"/>
		            </field>
		            <field name="part_num">
		              <column name="P_NUM" jdbc-type="integer"/>
		              </field>
		            <field name="part_type">
		              <column name="P_TYPE" length="256" jdbc-type="VARCHAR" allows-null="false"/>
		            </field>
		            <field name="part_type_param" >
		              <column name="P_TYPE_PARAM" length="767" jdbc-type="VARCHAR" allows-null="true"/>
		            </field>
		          </embedded>
		        </element>
		      </field>
          </embedded>
        </element>
      </field>


分区key定义用途有2个方面:

    1 加载需要确定如何划分加载的文件个数和数据路由
    2 查询如何按照分区方式,优化查询计划


p_keytbl_idp_typeinteger_idx


p_keytbl_idp_typeinteger_idx

分享到:
评论

相关推荐

    hive分区表分通表建表语句详解和例子

    - **添加分区**:只能在同一级分区字段下进行,且分区字段数量必须一致,例如`ALTER TABLE my_partitioner4 ADD PARTITION (sex='woman', country='china');`。 - **删除分区**:通过`ALTER TABLE my_partitioner4 ...

    Hive 基本命令操作1

    二级分区是在一级分区的基础上再进行分区,这提供了更细粒度的数据组织。假设我们有如下需求,将员工数据按照部门和入职日期进行分区: ```sql CREATE TABLE employee_department ( id int, name string, join_...

    尚硅谷Hive企业级调优的资料

    二、Hive查询优化 1. **避免全表扫描**:利用分区、索引、WHERE子句来限制查询的数据范围,减少不必要的数据读取。 2. **Join操作优化**:尽量使用MapJOIN代替ReduceJOIN,小表可以被缓存,减少数据传输和处理时间...

    windows hive cmd 下载

    1. **Apache Hive**: Apache Hive是由Facebook开源的一个数据仓库工具,可将大规模数据集(如PB级)组织成数据库表的形式,然后使用SQL进行查询和分析。Hive设计为对批处理的离线分析友好,而非实时查询。 2. **...

    《企业级Hive实战课程》大纲

    ### 企业级Hive实战课程知识点详述 #### 一、Hive市场定位与课程背景 随着大数据技术的发展,Hive作为Hadoop生态系统中的一个重要组成部分,对于企业的数据分析和处理起着核心作用。Facebook、淘宝等大型互联网...

    最强HiveSQL开发指南.pdf

    ### 第二部分:对数据库和数据表的操作 1. **数据库操作**:包括CREATE DATABASE创建数据库,USE切换当前工作数据库,DROP DATABASE删除数据库等。 2. **数据表操作**:CREATE TABLE用于创建新表,ALTER TABLE用于...

    Hive用户指南 Hive user guide 中文版

    #### 二、Hive基本操作 **2.1 创建表** - **总述**:创建表是使用Hive进行数据分析的第一步。 - **语法**: ```sql CREATE TABLE table_name (col1 data_type [COMMENT col_comment], ... ) [COMMENT table_...

    Hive用户指南.zip

    二、Hive安装与配置 在Java环境下,首先需要安装Hadoop环境,然后配置Hive的相关环境变量,如HIVE_HOME、HADOOP_HOME等,并设置相应的classpath。接着创建Hive的元数据库,可以选择MySQL或其他支持JDBC的数据库系统...

    Hive 对 Protobuf 序列化文件读取.zip

    这是Google开发的一种数据序列化协议,用于结构化数据的序列化,可以看作是XML、JSON的轻量级替代品。Protobuf通过定义数据结构(.proto文件),生成对应语言的代码,使得数据能够高效地在网络间传输和存储。在...

    Hive编程指南-2013.12.pdf

    二、Hive架构 Hive的架构包括客户端、元数据存储、驱动器和执行器四个主要部分。客户端用于提交查询,元数据存储包含了表和分区的定义、字段类型等信息;驱动器负责解析和优化查询;执行器则将优化后的查询转换为...

    hive入门.pdf

    - **分区功能**:Hive支持分区功能,能够将数据按照一定的规则(如日期、地区等)划分为不同的部分,并将这些部分存储在不同的文件夹下,以提高查询效率。 - **执行机制**:当执行HQL语句时,Hive会将其转化为...

    Hive教程.pdf

    - 下载Hive二进制包。 - 解压包到指定目录。 - **配置Hive**: - 设置环境变量。 - 配置Hive配置文件。 - **安装MySQL数据库**: - 下载并安装MySQL Server。 - 创建Hive元数据数据库。 - **在远程MySQL存储模式...

    HIVE 0.12安装配置(HADOOP2.2)

    这些内容通常涉及Hive的分区策略、Tez或Spark执行引擎的配置,以及Hive与Hadoop的性能调优。 **10. 性能优化** 为了提高Hive的性能,你可以考虑使用ORCFile或Parquet格式存储数据,这两个格式都支持列式存储,可以...

    Hive开发培训.pptx

    #### 二、Hive的优势 - **高性能处理**: Hive通过MapReduce框架实现数据处理,能够高效处理大规模数据集。 - **类SQL的查询语言**: - **相似性**: HiveQL与MySQL提供的SQL方言最为接近,降低了学习成本。 - **灵活...

    apache-hive-1.2.1-bin.tar.gz.zip

    "apache-hive-1.2.1-bin.tar.gz.zip" 是 Apache Hive 1.2.1 版本的二进制分发包,通常包含了运行 Hive 所需的所有组件和库文件。 Hive 的核心组成部分包括: 1. **元数据存储**:Hive 使用 MySQL 或 PostgreSQL ...

    Hadoop Hive入门学习笔记.pdf

    #### 二、Hadoop Hive 安装配置 ##### 2.1 环境准备 为了正确安装和配置 Hive,我们需要以下环境: 1. **JDK**: 需要 JDK 1.6 或更高版本。 2. **Hadoop**: 至少需要 Hadoop 0.20.X 版本。 3. **Hive**: 本例中...

Global site tag (gtag.js) - Google Analytics