用户洋仔 2023-03-27 14:27 采纳率: 0%
浏览 22

Doris 建表 partition key分区设置

官网文档说如果Partition列有多个。分区列值会按照顺序依次比较,最终得到对应的分区。
partition列:date(DATE 类型) 和 id(INT 类型)

p201701_1000:    [(MIN_VALUE,  MIN_VALUE), ("2017-02-01", "1000")   )
p201702_2000:    [("2017-02-01", "1000"),  ("2017-03-01", "2000")   )
p201703_all:     [("2017-03-01", "2000"),  ("2017-04-01", MIN_VALUE)) 
2017-01-01, 200     --> p201701_1000
2017-01-01, 2000    --> p201701_1000   
2017-02-01, 100     --> p201701_1000
2017-02-01, 2000    --> p201702_2000
2017-02-15, 5000    --> p201702_2000
2017-03-01, 2000    --> p201703_all
2017-03-10, 1       --> p201703_all
2017-04-01, 1000    --> 无法导入
2017-05-01, 1000    --> 无法导入

上面说(2017-01-01, 2000)是在p201701_1000分区上。
那按照语句p201701_1000不是应该是date<=2017-0-01 and id<=1000吗?
2000比1000大,那这个分区列加上id(INT 类型) 就没意义啊,只用到date(DATE 类型)。加上id列,对数据的划分更迷惑了。
如果两个条件不是and,那(2017-05-01, 1000)无法导入说明也不是 or 。
搞不懂。


2023-03-28更新
我的问题是为什么不干脆只按照date列分区?上面例子我想到唯一实际有用就是过滤了id为空的数据。
(官网有说NULL 值放在最小值的分区中,是不是只看首列?)
例子中的多列分区的目的是什么?有实际场景应用吗?

  • 写回答

1条回答 默认 最新

  • xia0xin 2023-03-28 00:05
    关注

    根据您提供的信息,可以理解为分区列的作用是对数据进行划分和排序。对于多个分区列的情况,按照分区列的顺序依次比较,最终得到对应的分区。

    在您提供的例子中,如果一个数据行的date列小于或等于"2017-02-01",而且id列小于或等于"1000",那么该数据行将被划分到p201701_1000分区中。如果date列小于或等于"2017-03-01",而且id列小于或等于"2000",那么该数据行将被划分到p201702_2000分区中。如果一个数据行的date列小于或等于"2017-04-01",但是id列大于"2000",那么该数据行将被划分到p201703_all分区中。

    因此,您提供的例子中,对于(2017-01-01, 2000),确实是被划分到了p201701_1000分区中。而对于(2017-05-01, 1000),由于无法满足任何一个分区的条件,因此无法导入。

    总之,分区列的作用是对数据进行划分和排序,多个分区列的情况下,按照分区列的顺序依次比较,最终得到对应的分区。

    评论

报告相同问题?

问题事件

  • 修改了问题 3月28日
  • 修改了问题 3月27日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?