创建分区表

转自sdhdy,原文链接http://topic.csdn.net/u/20090819/10/08dd4a38-8276-411e-9dbe-7aafe3256e3e.html?57302

 

-- 进行演示操作前, 先备份, 以便可以在演示完成后, 恢复到原始状态
USE master
-- 备份
BACKUP DATABASE AdventureWorks
   
TO DISK = 'AdventureWorks.bak'
   
WITH FORMAT

---- 恢复
--
RESTORE DATABASE AdventureWorks
--
    FROM DISK = 'AdventureWorks.bak'
--
    WITH REPLACE
GO

--=========================================
--
转换为分区表
--
=========================================
USE AdventureWorks
GO

-- 1. 创建分区函数
--
    a. 适用于存储历史存档记录的分区表的分区函数
DECLARE @dt datetime
SET @dt = '20020101'
CREATE PARTITION FUNCTION PF_HistoryArchive(datetime)
AS RANGE RIGHT
FOR VALUES(
   
@dt,
   
DATEADD(Year, 1, @dt))

--    b. 适用于存储历史记录的分区表的分区函数
--
DECLARE @dt datetime
SET @dt = '20030901'
CREATE PARTITION FUNCTION PF_History(datetime)
AS RANGE RIGHT
FOR VALUES(
   
@dt,
   
DATEADD(Month, 1, @dt), DATEADD(Month, 2, @dt), DATEADD(Month, 3, @dt),
   
DATEADD(Month, 4, @dt), DATEADD(Month, 5, @dt), DATEADD(Month, 6, @dt),
   
DATEADD(Month, 7, @dt), DATEADD(Month, 8, @dt), DATEADD(Month, 9, @dt),
   
DATEADD(Month, 10, @dt), DATEADD(Month, 11, @dt), DATEADD(Month, 12, @dt))
GO

-- 2. 创建分区架构
--
    a. 适用于存储历史存档记录的分区表的分区架构
CREATE PARTITION SCHEME PS_HistoryArchive
AS PARTITION PF_HistoryArchive
TO([PRIMARY], [PRIMARY], [PRIMARY])

--    b. 适用于存储历史记录的分区表的分区架构
CREATE PARTITION SCHEME PS_History
AS PARTITION PF_History
TO([PRIMARY], [PRIMARY],
   
[PRIMARY], [PRIMARY], [PRIMARY],
   
[PRIMARY], [PRIMARY], [PRIMARY],
   
[PRIMARY], [PRIMARY], [PRIMARY],
   
[PRIMARY], [PRIMARY], [PRIMARY])
GO

-- 3. 删除索引
--
    a. 删除存储历史存档记录的表中的索引
DROP INDEX Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ProductID
DROP INDEX Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID

--    b. 删除存储历史记录的表中的索引
DROP INDEX Production.TransactionHistory.IX_TransactionHistory_ProductID
DROP INDEX Production.TransactionHistory.IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineID
GO

-- 4. 转换为分区表
--
    a. 将存储历史存档记录的表转换为分区表
ALTER TABLE Production.TransactionHistoryArchive
   
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
   
WITH(
        MOVE
TO PS_HistoryArchive(TransactionDate))

--    b.将存储历史记录的表转换为分区表
ALTER TABLE Production.TransactionHistory
   
DROP CONSTRAINT PK_TransactionHistory_TransactionID
   
WITH(
        MOVE
TO PS_History(TransactionDate))
GO

-- 5. 恢复主键
--
    a. 恢复存储历史存档记录的分区表的主键
ALTER TABLE Production.TransactionHistoryArchive
   
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
       
PRIMARY KEY CLUSTERED(
            TransactionID,
            TransactionDate)

--    b. 恢复存储历史记录的分区表的主键
ALTER TABLE Production.TransactionHistory
   
ADD CONSTRAINT PK_TransactionHistory_TransactionID
       
PRIMARY KEY CLUSTERED(
            TransactionID,
            TransactionDate)
GO

-- 6. 恢复索引
--
    a. 恢复存储历史存档记录的分区表的索引
CREATE INDEX IX_TransactionHistoryArchive_ProductID
   
ON Production.TransactionHistoryArchive(
        ProductID)

CREATE INDEX IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID
   
ON Production.TransactionHistoryArchive(
        ReferenceOrderID,
        ReferenceOrderLineID)

--    b. 恢复存储历史记录的分区表的索引
CREATE INDEX IX_TransactionHistory_ProductID
   
ON Production.TransactionHistory(
        ProductID)

CREATE INDEX IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineID
   
ON Production.TransactionHistory(
        ReferenceOrderID,
        ReferenceOrderLineID)
GO

-- 7. 查看分区表的相关信息
SELECT
    SchemaName
= S.name,
    TableName
= TB.name,
    PartitionScheme
= PS.name,
    PartitionFunction
= PF.name,
    PartitionFunctionRangeType
= CASE
           
WHEN boundary_value_on_right = 0 THEN 'LEFT'
           
ELSE 'RIGHT' END,
    PartitionFunctionFanout
= PF.fanout,
    SchemaID
= S.schema_id,
    ObjectID
= TB.object_id,
    PartitionSchemeID
= PS.data_space_id,
    PartitionFunctionID
= PS.function_id
FROM sys.schemas S
   
INNER JOIN sys.tables TB
       
ON S.schema_id = TB.schema_id
   
INNER JOIN sys.indexes IDX
       
on TB.object_id = IDX.object_id
           
AND IDX.index_id < 2
   
INNER JOIN sys.partition_schemes PS
       
ON PS.data_space_id = IDX.data_space_id
   
INNER JOIN sys.partition_functions PF
       
ON PS.function_id = PF.function_id
GO

--=========================================
--
移动分区表数据
--
=========================================
--
1. 为存储历史存档记录的分区表增加分区, 并接受从历史记录分区表移动过来的数据
--
    a. 修改分区架构, 增加用以接受新分区的文件组
ALTER PARTITION SCHEME PS_HistoryArchive
NEXT USED [PRIMARY]

--    b. 修改分区函数, 增加分区用以接受从历史记录分区表移动过来的数据
DECLARE @dt datetime
SET @dt = '20030901'
ALTER PARTITION FUNCTION PF_HistoryArchive()
SPLIT RANGE(
@dt)

--    c. 将历史记录表中的过期数据移动到历史存档记录表中
ALTER TABLE Production.TransactionHistory
    SWITCH PARTITION
2
       
TO Production.TransactionHistoryArchive PARTITION $PARTITION.PF_HistoryArchive(@dt)

--    d. 将接受到的数据与原来的分区合并
ALTER PARTITION FUNCTION PF_HistoryArchive()
MERGE RANGE(
@dt)
GO

-- 2. 将存储历史记录的分区表中不包含数据的分区删除, 并增加新的分区以接受新数据
--
    a. 合并不包含数据的分区
DECLARE @dt datetime
SET @dt = '20030901'
ALTER PARTITION FUNCTION PF_History()
MERGE RANGE(
@dt)

--    b.  修改分区架构, 增加用以接受新分区的文件组
ALTER PARTITION SCHEME PS_History
NEXT USED [PRIMARY]

--    c. 修改分区函数, 增加分区用以接受新数据
SET @dt = '20041001'
ALTER PARTITION FUNCTION PF_History()
SPLIT RANGE(
@dt)
GO


--=========================================
--
清除历史存档记录中的过期数据
--
=========================================
--
1. 创建用于保存过期的历史存档数据的表
CREATE TABLE Production.TransactionHistoryArchive_2001_temp(
    TransactionID
int NOT NULL,
    ProductID
int NOT NULL,
    ReferenceOrderID
int NOT NULL,
    ReferenceOrderLineID
int NOT NULL
       
DEFAULT ((0)),
    TransactionDate
datetime NOT NULL
       
DEFAULT (GETDATE()),
    TransactionType
nchar(1) NOT NULL,
    Quantity
int NOT NULL,
    ActualCost
money NOT NULL,
    ModifiedDate
datetime NOT NULL
       
DEFAULT (GETDATE()),
   
CONSTRAINT PK_TransactionHistoryArchive_2001_temp_TransactionID
       
PRIMARY KEY CLUSTERED(
            TransactionID,
            TransactionDate)
)

-- 2. 将数据从历史存档记录分区表移动到第1步创建的表中
ALTER TABLE Production.TransactionHistoryArchive
    SWITCH PARTITION
1
       
TO Production.TransactionHistoryArchive_2001_temp

-- 3. 删除不再包含数据的分区
DECLARE @dt datetime
SET @dt = '20020101'
ALTER PARTITION FUNCTION PF_HistoryArchive()
MERGE RANGE(
@dt)

-- 4. 修改分区架构, 增加用以接受新分区的文件组
ALTER PARTITION SCHEME PS_HistoryArchive
NEXT USED [PRIMARY]

-- 5. 修改分区函数, 增加分区用以接受新数据
SET @dt = '20040101'
ALTER PARTITION FUNCTION PF_HistoryArchive()
SPLIT RANGE(
@dt)

<think>首先,用户的问题是关于Presto的:"我想在Presto中创建分区表的方法 请问presto create partitioned table example"。用户询问在Presto中创建分区表的例子。 从系统级指令中,我需要: - 所有行内数学表达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如 [^1]。 在用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用有四个: - [^1]: 关于添加新Connector的步骤。 - [^2]: 关于字段名引用和时间函数。 - [^3]: 关于HDFS客户端配置。 - [^4]: 关于使用分区字段和WITH语句的建议。 用户的问题是关于创建分区表的,所以我需要聚焦在这个主题上。引用[^4]提到了分区表的使用,这很相关。引用[^1]是关于添加Connector的,可能间接相关,因为分区表可能依赖于数据源。但用户直接问的是创建分区表。 Presto本身不是一个存储系统;它是一个查询引擎。它不直接管理数据存储分区表通常是定义在底层存储系统如Hive或HDFS上的,然后Presto通过Connector访问它们。 所以,在Presto中"创建分区表"可能意味着通过Presto的Hive Connector或其他Connector来创建表,这些表在Hive Metastore中定义分区。 步骤: 1. 确保有一个Hive Metastore服务,并且Presto配置了Hive Connector。 2. 使用SQL语句在Hive Metastore中创建分区表。 3. 分区表的结构包括分区键。 在回答中,我需要提供示例。 结构化回答: - 先解释Presto的角色:Presto本身不存储数据,所以创建分区表是通过Connector如Hive Connector来完成的。 - 然后,给出创建分区表的SQL示例。 - 最后,生成相关问题。 使用中文回答。 生成相关问题:基于主题,如分区表的优势、最佳实践等。 引用相关部分:引用[^4]提到"如果数据被规当到HDFS中,并带有分区字段。在每次查询归档表的时候,要带上分区字段作为过滤条件",这强调了使用分区的好处。所以,在讨论分区表时,可以自然地引用这个。 引用[^1]是关于添加Connector的,可能不直接相关。 引用[^2]是关于字段引用和时间函数,不直接相关。 引用[^3]是关于HDFS配置,可能间接相关。 所以,主要参考引用[^4]。 回答结构: 1. 介绍:Presto如何创建分区表。 2. 步骤:配置Connector(如果需要),然后创建表。 3. 示例SQL。 4. 解释。 5. 生成相关问题。 确保LaTeX:用户的问题中没有数学表达式,但如果有,比如在解释中,使用$...$。例如,如果提到分区键的表达式,但可能不需要。 最后,生成相关问题。</think>### Presto中创建分区表的方法 在Presto中创建分区表时,需要注意:Presto本身是一个分布式SQL查询引擎,不直接管理数据存储。因此,创建分区表通常通过Presto的Connector(如Hive Connector)来实现,分区信息存储在底层存储系统(如HDFS)的元数据中(如Hive Metastore)。以下是详细的步骤和示例,帮助您逐步操作。 #### 1. **前提条件** - 确保Presto已配置并启用了Hive Connector(或其他支持分区的Connector)。引用[^1]提到,Presto通过Plugin方式添加数据源,您需要在Presto配置文件中注册Connector。例如,在`etc/catalog/hive.properties`中添加: ``` connector.name=hive hive.metastore.uri=thrift://localhost:9083 ``` 这指向Hive Metastore服务。 - 底层存储(如HDFS)已准备好,并确保Presto有访问权限。引用[^3]强调,HDFS客户端配置应最小化,以避免问题。 #### 2. **创建分区表的SQL语法** 使用标准的Hive SQL语法(通过Presto执行),分区表创建包括分区键(partition key)。基本语法为: ```sql CREATE TABLE schema_name.table_name ( column1 data_type, column2 data_type, ... ) WITH ( partitioned_by = ARRAY['partition_key'], format = 'ORC' -- 或 'PARQUET' 等格式 ); ``` - `partitioned_by`:指定分区列(必须是字符串或日期类型)。 - `WITH`子句:定义表属性,如文件格式(推荐ORC或Parquet以提高性能)。 - 注意:Presto中的字段名引用使用双引号,如`SELECT "fieldName"`,这与引用[^2]一致。 #### 3. **完整示例:创建分区表** 假设我们要创建一个销售数据表,按`year`和`month`分区。以下是SQL示例: ```sql -- 创建分区表 CREATE TABLE hive.default.sales ( order_id BIGINT, product_name VARCHAR, amount DOUBLE ) WITH ( partitioned_by = ARRAY['year', 'month'], -- 分区键列表 format = 'ORC' -- 使用ORC格式优化存储 ); ``` - **解释**: - 表名:`hive.default.sales`,其中`hive`是catalog名称(基于Hive Connector),`default`是数据库名。 - 分区键:`year`和`month`必须是表中的列(但未在列定义中显式列出,分区列会自动添加)。 - 文件格式:ORC格式支持高效压缩和查询。 - **添加分区数据**:创建后,使用`INSERT`语句或Hive工具加载数据到特定分区: ```sql INSERT INTO hive.default.sales SELECT order_id, product_name, amount, '2023' AS year, '10' AS month FROM source_table; ``` #### 4. **最佳实践和注意事项** - **查询优化**:引用[^4]强调,查询时应始终带上分区字段作为过滤条件,例如: ```sql SELECT * FROM sales WHERE year = '2023' AND month = '10'; ``` 这可以避免全表扫描,显著提升性能(减少Presto扫描的HDFS文件数)。 - **性能考虑**: - 分区不宜过多:避免"小文件问题",每个分区应有足够数据量。 - 使用`WITH`语句:引用[^4]建议,在复杂查询中使用`WITH`子句简化逻辑,提高可读性。 - **常见问题**: - 如果创建失败,检查Hive Metastore连接(引用[^1])。 - 确保分区列类型正确(如字符串或日期),否则Presto可能报错。 通过以上步骤,您可以在Presto中高效创建和管理分区表。实际应用中,分区表能大幅提升大数据查询速度,尤其在处理时间序列数据时[^4]。 ### 相关问题 1. Presto分区表如何优化查询性能? 2. 在Presto中,如何处理分区表的数据加载和维护? 3. Presto与其他系统(如Hive)在分区表支持上有何差异?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值