【问题标题】:Clickhouse: is there any way to drop multi-partition in one `alter table drop partition ****` query?Clickhouse:有没有办法在一个“alter table drop partition ****”查询中删除多个分区?
【发布时间】:2019-08-15 06:28:39
【问题描述】:

在 clickhouse 中,表按天分区。现在,为了方便起见,我想在一个 alter 查询中删除多分区。

我已经通过 shell 使用 while 循环完成了这项工作:

while [[ $startDate < $endDate ]]
do
    clickhouse-client --query="alter table db.table drop partition toYYYYMMDD(toDate($startDate))"
    startDate=`date -d "+1 day $startDate" +%Y-%m-%d`
done

我只是想找到一些可以轻松做到这一点的方法。有什么办法吗?谢谢~

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    您可以改为使用ALTER TABLE &lt;table&gt; DELETE WHERE &lt;partition-filters&gt; 一次性删除多个分区。

    【讨论】:

    • &lt;partition-filters&gt; 长什么样子?我尝试了ALTER TABLE &lt;table&gt; DELETE WHERE partition='20181001'ALTER TABLE &lt;table&gt; DELETE WHERE partition like '%201810%',但收到来自clickhouse 的异常:未知标识符。
    • 假设您的分区列的名称为parcol。你可以这样写alter table db.table delete where parcol between toYYYYMMDD(toDate($startDate)) and toYYYYMMDD(toDate($endDate))
    • 谢谢~。假设我有一个表列date,其类型为Date,并且该表由toYYYYMMDD(date) 分区。你真正的意思是我可以像这样使用deletealter table db.table delete where date between '2018-10-01' and '2018-11-01'。但是按月分区怎么样,这种方式对drop是否有效。
    • toYYYYMMDD 是单调的,所以 clickhouse 会巧妙地选择正确的分区修剪计划,同样适用于按月分区的表。您可以编写类似于分区方案的where toYYYYMMDD(date) between ... and ...。我没有对这个主题进行彻底的测试,所以请尝试一下,看看它是否确实有效。
    • 您提出的方法是基于假设该表有一个列parcol。但是对于我们所有的表都没有此列。无论如何,更高版本的 ck 使用delete 是个好主意。谢谢~
    【解决方案2】:

    你可以用这个

    ALTER TABLE my_table ON CLUSTER 'my-cluster'
        DROP PARTITION '2020-01-01',
        DROP PARTITION '2020-01-02',
        DROP PARTITION '2020-01-03'
    

    不幸的是,似乎没有什么更方便的了。

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2021-06-26
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      相关资源
      最近更新 更多