几年前的工作了,放在草稿箱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_key | tbl_id | p_type | integer_idx |
p_key | tbl_id | p_type | integer_idx |
分享到:
相关推荐
- **添加分区**:只能在同一级分区字段下进行,且分区字段数量必须一致,例如`ALTER TABLE my_partitioner4 ADD PARTITION (sex='woman', country='china');`。 - **删除分区**:通过`ALTER TABLE my_partitioner4 ...
二级分区是在一级分区的基础上再进行分区,这提供了更细粒度的数据组织。假设我们有如下需求,将员工数据按照部门和入职日期进行分区: ```sql CREATE TABLE employee_department ( id int, name string, join_...
二、Hive查询优化 1. **避免全表扫描**:利用分区、索引、WHERE子句来限制查询的数据范围,减少不必要的数据读取。 2. **Join操作优化**:尽量使用MapJOIN代替ReduceJOIN,小表可以被缓存,减少数据传输和处理时间...
1. **Apache Hive**: Apache Hive是由Facebook开源的一个数据仓库工具,可将大规模数据集(如PB级)组织成数据库表的形式,然后使用SQL进行查询和分析。Hive设计为对批处理的离线分析友好,而非实时查询。 2. **...
### 企业级Hive实战课程知识点详述 #### 一、Hive市场定位与课程背景 随着大数据技术的发展,Hive作为Hadoop生态系统中的一个重要组成部分,对于企业的数据分析和处理起着核心作用。Facebook、淘宝等大型互联网...
### 第二部分:对数据库和数据表的操作 1. **数据库操作**:包括CREATE DATABASE创建数据库,USE切换当前工作数据库,DROP DATABASE删除数据库等。 2. **数据表操作**:CREATE TABLE用于创建新表,ALTER TABLE用于...
#### 二、Hive基本操作 **2.1 创建表** - **总述**:创建表是使用Hive进行数据分析的第一步。 - **语法**: ```sql CREATE TABLE table_name (col1 data_type [COMMENT col_comment], ... ) [COMMENT table_...
1. **超大数据集的计算与扩展能力**:Hive基于Hadoop的MapReduce框架运行,这意味着它具备处理PB级数据的能力,并且可以水平扩展到数千个节点。 2. **SQL-like查询语言**:HiveQL提供了一种接近于标准SQL的语法,使...
二、Hive安装与配置 在Java环境下,首先需要安装Hadoop环境,然后配置Hive的相关环境变量,如HIVE_HOME、HADOOP_HOME等,并设置相应的classpath。接着创建Hive的元数据库,可以选择MySQL或其他支持JDBC的数据库系统...
这是Google开发的一种数据序列化协议,用于结构化数据的序列化,可以看作是XML、JSON的轻量级替代品。Protobuf通过定义数据结构(.proto文件),生成对应语言的代码,使得数据能够高效地在网络间传输和存储。在...
二、Hive架构 Hive的架构包括客户端、元数据存储、驱动器和执行器四个主要部分。客户端用于提交查询,元数据存储包含了表和分区的定义、字段类型等信息;驱动器负责解析和优化查询;执行器则将优化后的查询转换为...
- **分区功能**:Hive支持分区功能,能够将数据按照一定的规则(如日期、地区等)划分为不同的部分,并将这些部分存储在不同的文件夹下,以提高查询效率。 - **执行机制**:当执行HQL语句时,Hive会将其转化为...
- 下载Hive二进制包。 - 解压包到指定目录。 - **配置Hive**: - 设置环境变量。 - 配置Hive配置文件。 - **安装MySQL数据库**: - 下载并安装MySQL Server。 - 创建Hive元数据数据库。 - **在远程MySQL存储模式...
"apache-hive-1.2.1-bin.tar.gz.zip" 是 Apache Hive 1.2.1 版本的二进制分发包,通常包含了运行 Hive 所需的所有组件和库文件。 Hive 的核心组成部分包括: 1. **元数据存储**:Hive 使用 MySQL 或 PostgreSQL ...
这些内容通常涉及Hive的分区策略、Tez或Spark执行引擎的配置,以及Hive与Hadoop的性能调优。 **10. 性能优化** 为了提高Hive的性能,你可以考虑使用ORCFile或Parquet格式存储数据,这两个格式都支持列式存储,可以...
#### 二、Hive的优势 - **高性能处理**: Hive通过MapReduce框架实现数据处理,能够高效处理大规模数据集。 - **类SQL的查询语言**: - **相似性**: HiveQL与MySQL提供的SQL方言最为接近,降低了学习成本。 - **灵活...
#### 二、Hadoop Hive 安装配置 ##### 2.1 环境准备 为了正确安装和配置 Hive,我们需要以下环境: 1. **JDK**: 需要 JDK 1.6 或更高版本。 2. **Hadoop**: 至少需要 Hadoop 0.20.X 版本。 3. **Hive**: 本例中...