blob: 06256e75193f31b5d928dfb1923437b84b4d97b6 [file] [log] [blame]
#!/bin/env python
# -*- coding: utf-8 -*-
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
############################################################################
#
# @file test_create_dynamic_partition_parameter.py
# @date 2021/06/02 10:28:20
# @brief This file is a test file for doris dynamic partition parameters.
#
#############################################################################
"""
测试动态分区功能参数
"""
import time
import datetime
import sys
from dateutil.relativedelta import relativedelta
sys.path.append("../")
from lib import palo_config
from lib import palo_client
from lib import palo_job
from lib import util
client = None
config = palo_config.config
LOG = palo_client.LOG
L = palo_client.L
def setup_module():
"""
setUp
"""
global client
client = palo_client.get_client(config.fe_host, config.fe_query_port, user=config.fe_user,
password=config.fe_password, http_port=config.fe_http_port)
def create(table_name, datetype, info, column=None, keys_desc=None, partition_info=None):
"""
建表
info:动态分区建表参数
"""
if partition_info is None:
partition_info = palo_client.PartitionInfo('k1', [], [])
distribution_info = palo_client.DistributionInfo('HASH(k1)', 3)
dynamic_info = palo_client.DynamicPartitionInfo(info)
dynamic = dynamic_info.to_string()
if column is None:
column = [('k1', datetype), ('k2', 'varchar(20)'), ('k3', 'int', 'sum')]
client.create_table(table_name, column, partition_info, distribution_info, keys_desc=keys_desc,
dynamic_partition_info=dynamic)
assert client.show_tables(table_name), 'fail to create table'
def get_partition_name_list(start, end, prefix):
"""
分区名
"""
partition_name_list = []
for i in range(-start, -end - 1, -1):
p_name = (datetime.datetime.now() - datetime.timedelta(days=i))
partition_name_list.append(str(prefix + p_name.strftime("%Y%m%d")))
return partition_name_list
def get_partition_value_list(start, end):
"""
分区范围
"""
partition_value_list = []
for i in range(-start, -end - 1, -1):
p_value = (datetime.datetime.now() - datetime.timedelta(days=i))
p_value2 = (datetime.datetime.now() - datetime.timedelta(days=(i - 1)))
p_value = p_value.strftime("%Y-%m-%d")
p_value2 = p_value2.strftime("%Y-%m-%d")
tmp = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(tmp)
return partition_value_list
def check_partition_list(table_name, partition_name_list):
"""
验证分区是否创建成功
"""
ret = client.get_partition_list(table_name)
partitions_list = util.get_attr(ret, palo_job.PartitionInfo.PartitionName)
expect_plist_sorted = sorted(partition_name_list)
actural_plist_sorted = sorted(partitions_list)
assert expect_plist_sorted == actural_plist_sorted, \
'expect: %s, actural: %s' % (expect_plist_sorted, actural_plist_sorted)
def check_partition_range(table_name, partition_value_list):
"""
验证分区范围是否正确
"""
ret = client.get_partition_list(table_name)
LOG.info(L('', PARTITION_RANGE=util.get_attr(ret, palo_job.PartitionInfo.Range), EXPECT=partition_value_list))
assert util.get_attr(ret, palo_job.PartitionInfo.Range) == partition_value_list
def test_dynamic_partition_enable():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_enable",
"describe": "验证dynamic_partition.enable参数功能enable=true开启动态分区功能",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
partition_name_list = get_partition_name_list(-3, 3, 'p')
partition_value_list = get_partition_value_list(-3, 3)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'false', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
check_partition_list(table_name, [])
client.clean(database_name)
def test_dynamic_partition_hour():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_hour",
"describe": "time_unit=HOUR建表,仅支持datetime格式",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
now_time = datetime.datetime.now()
partition_name_list = []
for i in range(30, -31, -1):
p_name = (now_time - datetime.timedelta(hours=i))
partition_name_list.append(str("p" + p_name.strftime("%Y%m%d%H")))
partition_value_list = []
for i in range(30, -31, -1):
p_value = (now_time - datetime.timedelta(hours=i))
p_value2 = (now_time - datetime.timedelta(hours=(i - 1)))
p_value = p_value.strftime("%Y-%m-%d %H:00:00")
p_value2 = p_value2.strftime("%Y-%m-%d %H:00:00")
partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'HOUR', 'start': -30, 'end': 30, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'datetime', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_day_date():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_day_date",
"describe": "time_unit=DAY建表,datetype=date",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = get_partition_name_list(-3, 3, 'p')
partition_value_list = get_partition_value_list(-3, 3)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_day_int():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_day_int",
"describe": "time_unit=DAY建表,datetype=int",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = get_partition_name_list(-3, 3, 'p')
partition_value_list = []
for i in range(3, -4, -1):
p_value = (datetime.datetime.now() - datetime.timedelta(days=i))
p_value2 = (datetime.datetime.now() - datetime.timedelta(days=(i - 1)))
p_value = p_value.strftime("%Y%m%d")
p_value2 = p_value2.strftime("%Y%m%d")
partition = '[types: [INT]; keys: [%s]; ..types: [INT]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'int', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_day_datetime():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_day_datetime",
"describe": "time_unit=DAY建表,datetype=datetime",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = get_partition_name_list(-3, 3, 'p')
partition_value_list = []
for i in range(3, -4, -1):
p_value = (datetime.datetime.now() - datetime.timedelta(days=i))
p_value2 = (datetime.datetime.now() - datetime.timedelta(days=(i - 1)))
p_value = p_value.strftime("%Y-%m-%d 00:00:00")
p_value2 = p_value2.strftime("%Y-%m-%d 00:00:00")
partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'datetime', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_week_date():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_week_date",
"describe": "time_unit=WEEK建表,datetype=date"
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = []
today = datetime.datetime.now().weekday()
start_day = datetime.datetime.now() - datetime.timedelta(days=today)
# todo: 2022-2023 week name not same
for i in range(30, -31, -1):
p_name = start_day - datetime.timedelta(days=7 * i)
week = str("0" + str(int(p_name.strftime("%U")) + 1))
partition_name_list.append(str("p" + p_name.strftime("%Y_") + week[-2:]))
partition_value_list = []
for i in range(30, -31, -1):
p_value = start_day - datetime.timedelta(days=7 * i)
p_value2 = start_day - datetime.timedelta(days=(7 * (i - 1)))
p_value = p_value.strftime("%Y-%m-%d")
p_value2 = p_value2.strftime("%Y-%m-%d")
partition = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -30, 'end': 30, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
# check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_week_datetime():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_week_datetime",
"describe": "time_unit=WEEK建表, datetype=datetime"
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = []
today = datetime.datetime.now().weekday()
start_day = datetime.datetime.now() - datetime.timedelta(days=today)
for i in range(30, -31, -1):
p_name = start_day - datetime.timedelta(days=7 * i)
week = str("0" + str(int(p_name.strftime("%U")) + 1))
partition_name_list.append(str("p" + p_name.strftime("%Y_") + week[-2:]))
partition_value_list = []
for i in range(30, -31, -1):
p_value = start_day - datetime.timedelta(days=7 * i)
p_value2 = start_day - datetime.timedelta(days=(7 * (i - 1)))
p_value = p_value.strftime("%Y-%m-%d 00:00:00")
p_value2 = p_value2.strftime("%Y-%m-%d 00:00:00")
partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -30, 'end': 30, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'datetime', dynamic_partition_info)
# check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.drop_table(table_name, database_name)
client.clean(database_name)
def test_dynamic_partition_week_int():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_week_int",
"describe": "time_unit=WEEK建表, datetype=int"
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = []
today = datetime.datetime.now().weekday()
start_day = datetime.datetime.now() - datetime.timedelta(days=today)
for i in range(30, -31, -1):
p_name = start_day - datetime.timedelta(days=7 * i)
week = str("0" + str(int(p_name.strftime("%U")) + 1))
partition_name_list.append(str("p" + p_name.strftime("%Y_") + week[-2:]))
partition_value_list = []
for i in range(30, -31, -1):
p_value = start_day - datetime.timedelta(days=7 * i)
p_value2 = start_day - datetime.timedelta(days=(7 * (i - 1)))
p_value = p_value.strftime("%Y%m%d")
p_value2 = p_value2.strftime("%Y%m%d")
partition = '[types: [INT]; keys: [%s]; ..types: [INT]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -30, 'end': 30, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'int', dynamic_partition_info)
# check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_month_date():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_month_date",
"describe": "time_unit=MONTH建表,datetype=date",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = []
for i in range(10, -11, -1):
p_name = datetime.datetime.now() - relativedelta(months=i)
partition_name_list.append(str("p" + p_name.strftime("%Y%m")))
partition_value_list = []
start_day = datetime.datetime.now()
for i in range(10, -11, -1):
p_value = start_day - relativedelta(months=i)
p_value2 = start_day - relativedelta(months=(i - 1))
p_value = p_value.strftime("%Y-%m") + "-01"
p_value2 = p_value2.strftime("%Y-%m") + "-01"
partition = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -10, 'end': 10, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_month_datetime():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_month_datetime",
"describe": "time_unit=MONTH建表,datetype=datetime",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = []
for i in range(10, -11, -1):
p_name = datetime.datetime.now() - relativedelta(months=i)
partition_name_list.append(str("p" + p_name.strftime("%Y%m")))
partition_value_list = []
start_day = datetime.datetime.now()
for i in range(10, -11, -1):
p_value = start_day - relativedelta(months=i)
p_value2 = start_day - relativedelta(months=(i - 1))
p_value = p_value.strftime("%Y-%m") + "-01 00:00:00"
p_value2 = p_value2.strftime("%Y-%m") + "-01 00:00:00"
partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -10, 'end': 10, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'datetime', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_month_int():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_month_int",
"describe": "time_unit=MONTH建表,datetype=int",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = []
for i in range(10, -11, -1):
p_name = datetime.datetime.now() - relativedelta(months=i)
partition_name_list.append(str("p" + p_name.strftime("%Y%m")))
partition_value_list = []
start_day = datetime.datetime.now()
for i in range(10, -11, -1):
p_value = start_day - relativedelta(months=i)
p_value2 = start_day - relativedelta(months=(i - 1))
p_value = p_value.strftime("%Y%m") + "01"
p_value2 = p_value2.strftime("%Y%m") + "01"
partition = '[types: [INT]; keys: [%s]; ..types: [INT]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -10, 'end': 10, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'int', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_time_zone():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_time_zone",
"describe": "验证dynamic_partition.time_zone参数功能",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = []
for i in range(11, 4, -1):
p_name = (datetime.datetime.now() - datetime.timedelta(hours=i))
partition_name_list.append(str("p" + p_name.strftime("%Y%m%d%H")))
partition_value_list = []
for i in range(11, 4, -1):
p_value = (datetime.datetime.now() - datetime.timedelta(hours=i))
p_value2 = (datetime.datetime.now() - datetime.timedelta(hours=(i - 1)))
p_value = p_value.strftime("%Y-%m-%d %H:00:00")
p_value2 = p_value2.strftime("%Y-%m-%d %H:00:00")
partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'HOUR', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'time_zone': 'Etc/GMT'}
create(table_name, 'datetime', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_start():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_start",
"describe": "验证dynamic_partition.start参数功能",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
start_list = [-5, -3, -10, -1, -100]
for start in start_list:
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': start, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
partition_name_list = get_partition_name_list(start, 3, 'p')
partition_value_list = get_partition_value_list(start, 3)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': 0, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(False, 'Dynamic partition start must less than 0', create, table_name, 'date', \
dynamic_partition_info)
client.clean(database_name)
def test_dynamic_partition_end():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_end",
"describe": "验证dynamic_partition.end参数功能",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
end_list = [3, 5, 10, 100, 1]
for end in end_list:
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': end, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
partition_name_list = get_partition_name_list(-3, end, 'p')
partition_value_list = get_partition_value_list(-3, end)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 0, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(False, 'Dynamic partition end must greater than 0', create, table_name, 'date', \
dynamic_partition_info)
client.clean(database_name)
def test_dynamic_partition_prefix():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_prefix",
"describe": "验证dynamic_partition.prefix参数功能",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
prefix_list = ['snfkjds', 'a', 'vhklskhsfdkksdv', 'fds', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa']
for prefix in prefix_list:
partition_name_list = get_partition_name_list(-3, 3, prefix)
partition_value_list = get_partition_value_list(-3, 3)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': prefix,
'buckets': 10, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.drop_table(table_name, database_name)
client.clean(database_name)
def test_dynamic_partition_buckets():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_buckets",
"describe": "验证dynamic_partition.buckets参数功能",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
buckets_list = [1, 2, 5, 10, 100]
for buckets in buckets_list:
partition_name_list = get_partition_name_list(-3, 3, 'p')
partition_value_list = get_partition_value_list(-3, 3)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': buckets, 'create_history_partition': 'true'}
create(table_name, 'date', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
ret = client.get_partition_list(table_name)
assert util.get_attr(ret, palo_job.PartitionInfo.Buckets) == [str(buckets) for i in range(7)]
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': -10, 'create_history_partition': 'true'}
util.assert_return(False, 'Dynamic partition buckets must greater than 0', create, table_name, 'date', \
dynamic_partition_info)
client.clean(database_name)
def test_dynamic_partition_replication_num():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_replication_num",
"describe": "验证dynamic_partition.replication_num参数功能",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
replication_num_list = [1, 2, 3]
for replication_num in replication_num_list:
partition_name_list = get_partition_name_list(-3, 3, 'p')
partition_value_list = get_partition_value_list(-3, 3)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'replication_num': replication_num}
create(table_name, 'date', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
ret = client.get_partition_list(table_name)
assert util.get_attr(ret, palo_job.PartitionInfo.ReplicationNum) == [str(replication_num) for i in range(7)]
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'replication_num': -3}
util.assert_return(False, 'Dynamic partition replication num must greater than 0', create, table_name, 'date', \
dynamic_partition_info)
client.clean(database_name)
def test_dynamic_partition_start_day_of_week():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_start_day_of_week",
"describe": "验证dynamic_partition.start_day_of_week参数功能",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
start_day_of_week_list = [1, 2, 3, 4, 5, 6, 7]
for start_day_of_week in start_day_of_week_list:
today = datetime.datetime.now().weekday()
start_day = datetime.datetime.now() - datetime.timedelta(days=(today - start_day_of_week + 1))
partition_name_list = []
for i in range(3, -4, -1):
p_name = start_day - datetime.timedelta(days=7 * i)
week = str("0" + str(p_name.strftime("%U")))
partition_name_list.append(str("p" + p_name.strftime("%Y_") + week[-2:]))
partition_value_list = []
for i in range(3, -4, -1):
p_value = start_day - datetime.timedelta(days=7 * i)
p_value2 = start_day - datetime.timedelta(days=(7 * (i - 1)))
p_value = p_value.strftime("%Y-%m-%d")
p_value2 = p_value2.strftime("%Y-%m-%d")
partition = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'start_day_of_week': start_day_of_week}
create(table_name, 'date', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'start_day_of_week': 8}
util.assert_return(False, 'between 1 and 7', create, table_name, 'date', dynamic_partition_info)
client.clean(database_name)
def test_dynamic_partition_start_day_of_month():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_start_day_of_month",
"describe": "验证dynamic_partition.start_day_of_month参数功能",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
start_day_of_month_list = [1, 2, 5, 10, 28]
for start_day_of_month in start_day_of_month_list:
partition_name_list = []
today = datetime.datetime.now().strftime("%d")
if int(today) - start_day_of_month >= 0:
month_count = 0
else:
month_count = 1
for i in range(3 + month_count, -4 + month_count, -1):
p_name = datetime.datetime.now() - relativedelta(months=i)
partition_name_list.append(str("p" + p_name.strftime("%Y%m")))
partition_value_list = []
start_day = datetime.datetime.now()
for i in range(3 + month_count, -4 + month_count, -1):
p_value = start_day - relativedelta(months=i)
p_value2 = start_day - relativedelta(months=(i - 1))
if start_day_of_month >= 10:
p_value = p_value.strftime("%Y-%m") + "-" + str(start_day_of_month)
p_value2 = p_value2.strftime("%Y-%m") + "-" + str(start_day_of_month)
else:
p_value = p_value.strftime("%Y-%m") + "-0" + str(start_day_of_month)
p_value2 = p_value2.strftime("%Y-%m") + "-0" + str(start_day_of_month)
partition = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2)
partition_value_list.append(partition)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'start_day_of_month': start_day_of_month}
create(table_name, 'date', dynamic_partition_info)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'start_day_of_month': 29}
util.assert_return(False, 'between 1 and 28', create, table_name, 'date', dynamic_partition_info)
client.clean(database_name)
def test_dynamic_partition_create_history_partition():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_create_history_partition",
"describe": "验证dynamic_partition.create_history_partition参数功能",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'false'}
create(table_name, 'date', dynamic_partition_info)
partition_name_list = get_partition_name_list(0, 3, 'p')
partition_value_list = get_partition_value_list(0, 3)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.clean(database_name)
def test_dynamic_partition_hot_partition_num():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_hot_partition_num",
"describe": "验证dynamic_partition.hot_partition_num参数功能",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_name_list = get_partition_name_list(-3, 3, 'p')
partition_value_list = get_partition_value_list(-3, 3)
hot_partition_num_list = [None, 0, 1, 2, 3, 4]
for hot_partition_num in hot_partition_num_list:
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'hot_partition_num': hot_partition_num}
create(table_name, 'date', dynamic_partition_info)
if hot_partition_num is None or hot_partition_num == 0:
storage_medium = ['HDD' for i in range(7)]
else:
storage_medium = ['HDD' for i in range(4 - hot_partition_num)] + \
['SSD' for i in range(hot_partition_num + 3)]
ret = client.get_partition_list(table_name)
assert util.get_attr(ret, palo_job.PartitionInfo.StorageMedium) == storage_medium
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'hot_partition_num': -1}
util.assert_return(False, 'larger than 0', create, table_name, 'date', dynamic_partition_info)
client.clean(database_name)
def test_dynamic_partition_history_partition_num():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_history_partition_num",
"describe": "验证dynamic_partition.history_partition_num参数功能",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
history_partition_num_list = [5, 3, -1, 1, 0, None]
for num in history_partition_num_list:
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'history_partition_num': num}
create(table_name, 'date', dynamic_partition_info)
if num is None or num == -1:
start = -3
else:
start = -min(3, num)
partition_name_list = get_partition_name_list(start, 3, 'p')
partition_value_list = get_partition_value_list(start, 3)
check_partition_list(table_name, partition_name_list)
check_partition_range(table_name, partition_value_list)
client.drop_table(table_name, database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true', 'history_partition_num': -2}
util.assert_return(False, 'Dynamic history partition num must greater than 0', create, table_name, 'date', \
dynamic_partition_info)
client.clean(database_name)
def test_composite_partition():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_composite_partition",
"describe": "验证复合分区创建动态分区表,建表失败",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
column = [('k1', 'date'), ('k2', 'date'), ('k3', 'int')]
partition_info = palo_client.PartitionInfo(['k1', 'k2'], [], [])
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(False, 'only support single-column range partition', create, table_name, 'date',
dynamic_partition_info, column, partition_info=partition_info)
client.clean(database_name)
def test_list_partition():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_list_partition",
"describe": "验证list分区创建动态分区表,建表失败",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_info = palo_client.PartitionInfo(['k1'], [], [], partition_type='LIST')
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(False, 'Only support dynamic partition properties on range partition table',
create, table_name, 'date', dynamic_partition_info, partition_info=partition_info)
client.clean(database_name)
def test_range_partition():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_range_partition",
"describe": "验证range分区创建动态分区表,建表成功",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
partition_info = palo_client.PartitionInfo(['k1'], [], [], partition_type='RANGE')
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(True, None, create, table_name, 'date', dynamic_partition_info, partition_info=partition_info)
client.clean(database_name)
def test_type():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_type",
"describe": "分区数据格式不为date/datetime/int时创建动态分区表失败",
"tag": "p1,function,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
typelist = ['float', 'double', 'char', 'varchar', 'hll', 'bitmap']
for type in typelist:
column = [('k1', type), ('k2', 'date'), ('k3', 'int')]
util.assert_return(False, 'errCode', create, table_name, 'date', dynamic_partition_info, column=column)
client.clean(database_name)
def test_aggregation_aggregate():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_aggregation_aggregate",
"describe": "AGGREGATE聚合方式创建动态分区表",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
column = [('k1', 'date'), ('k2', 'int', 'sum'), ('k3', 'int', 'max')]
keys_desc = 'AGGREGATE KEY(k1)'
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(True, None, create, table_name, 'date', dynamic_partition_info, column, keys_desc=keys_desc)
client.clean(database_name)
def test_aggregation_unique():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_aggregation_unique",
"describe": "UNIQUE聚合方式创建动态分区表",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
column = [('k1', 'date'), ('k2', 'int'), ('k3', 'int')]
keys_desc = 'UNIQUE KEY(k1)'
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(True, None, create, table_name, 'date', dynamic_partition_info, column, keys_desc=keys_desc)
client.clean(database_name)
def test_aggregation_duplicate():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_aggregation_duplicate",
"describe": "DUPLICATE聚合方式创建动态分区表",
"tag": "p1,function"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
column = [('k1', 'date'), ('k2', 'int'), ('k3', 'int')]
keys_desc = 'DUPLICATE KEY(k1)'
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(True, None, create, table_name, 'date', dynamic_partition_info, column, keys_desc=keys_desc)
client.clean(database_name)
def test_create_history_partition_with_no_start():
"""
{
"title": "test_sys_dynamic_partition_parameter.test_create_history_partition_with_no_start",
"describe": "不设置start创建历史分区,issues #5995",
"tag": "p1,fuzz"
}
"""
database_name, table_name, index_name = util.gen_num_format_name_list()
LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name))
client.clean(database_name)
client.create_database(database_name)
client.use(database_name)
dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'end': 3, 'prefix': 'p',
'buckets': 10, 'create_history_partition': 'true'}
util.assert_return(False, 'Provide start or history_partition_num property when creating history partition', \
create, table_name, 'date', dynamic_partition_info)
client.clean(database_name)
if __name__ == '__main__':
setup_module()
test_dynamic_partition_enable()