Pyspark 我可以在删除旧分区后立即导入更新的分区吗?

Pyspark 我可以在删除旧分区后立即导入更新的分区吗?,pyspark,parquet,clickhouse,Pyspark,Parquet,Clickhouse,我有一个名为transactions alias txs(简称transactions alias txs)的表,其中包含1500万行,由txs进行分区。对于过去10年积累的数据,每年大约有100万到150万行。这些数据的来源是一个MySQL数据库,唯一改变的数据是当年的数据。我的策略是设置一个每日CRON作业,以压缩的CSV格式(即20XX-txs.CSV.gz)导出当前年份的所有记录,然后使用AWS Glue/PySpark将其转换为由txs.year分区的snappy.parquet格式

我有一个名为transactions alias txs(简称transactions alias txs)的表,其中包含1500万行,由txs进行分区。对于过去10年积累的数据,每年大约有100万到150万行。这些数据的来源是一个MySQL数据库,唯一改变的数据是当年的数据。我的策略是设置一个每日CRON作业,以压缩的CSV格式(即20XX-txs.CSV.gz)导出当前年份的所有记录,然后使用AWS Glue/PySpark将其转换为由txs.year分区的snappy.parquet格式

我读过,你可以轻松地用ClickHouse删除分区。有一件事没有进一步解释就把我甩了。其文件规定:

从表中删除指定的分区。此查询标记 分区为非活动并完全删除数据,大约在 10分钟

我想知道的是:

10分钟的部分从哪里来?从我的测试中,我看到分区立即消失了。 我是否可以在删除当前年份的旧分区后立即插入新创建的snappy.parquet分区中的更新数据,或者在执行此操作之前,我是否必须等待整整10分钟? 示例用例:

步骤1:获取当前年度的更新数据 --------------------- $wgethttps://s3.amazonaws.com/xxx.xxx/2021-txs.snappy.parquet 步骤2:删除当前年度的现有分区 --------------------- $clickhouse client-query=ALTER TABLE txs DROP PARTITION“2021” 步骤3:将本年度的更新数据插入表中 --------------------- $cat 2021-txs.snappy.parquet | clickhouse客户端-查询=插入txs格式的拼花
它与您的用例无关

它是关于从磁盘中删除数据,而不是关于表。用户有时担心磁盘释放

此查询将分区标记为非活动 并在大约10分钟内完全删除数据

这是合并的有趣副作用

使用放置分区立即移除活动部件,但不移除非活动部件

create table t(a Int64) Engine=MergeTree order by a; insert into t values (1); select name, active from system.parts where table = 't'; ┌─name──────┬─active─┐ │ all_1_1_0 │ 1 │ └───────────┴────────┘ optimize table t final; -- forced merge produced the new part all_1_1_1 (active) and left the old -- part all_1_1_0 (inactive). select name, active from system.parts where table = 't'; ┌─name──────┬─active─┐ │ all_1_1_0 │ 0 │ │ all_1_1_1 │ 1 │ └───────────┴────────┘ alter table t drop partition tuple(); -- DATA IS DROPPED -- but only active parts select count() from t; ┌─count()─┐ │ 0 │ └─────────┘ -- but inactive parts are still in waiting for -- background process to drop them after 8 minutes inactivity select name, active from system.parts where table = 't'; ┌─name──────┬─active─┐ │ all_1_1_0 │ 0 │ └───────────┴────────┘ ls -1 /var/lib/clickhouse/data/default/t/ all_1_1_0 detached format_version.txt 10分钟,实际上8480秒是由合并树设置旧零件寿命控制的


google translate:非活动部分不会立即删除,因为在编写新块时,不会调用fsync,即在一段时间内,新块仅位于服务器的RAM OS缓存中。因此,如果服务器自动重新启动,新的刚刚合并的部分可能会丢失或损坏。然后,ClickHouse在启动过程中检查零件的完整性,可以检测到问题,将非活动零件返回到活动列表,然后再次合并它们。然后将断开的零件重命名,并添加前缀“断开”,并将其移动到分离的文件夹中。如果完整性检查未检测到合并块中存在任何问题,则会重命名原始非活动块,并将其添加到分离的文件夹中。

谢谢Denny。这对理解内部工作原理有很大帮助。