向ClickHouse表插入复杂数据

本文介绍了如何使用ClickHouse创建分布式与复制表,并展示了模拟数据及导入CSV格式数据的过程。还演示了如何插入数据以及删除特定日期的数据。此外,提供了相关技术博客链接供读者深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建表

CREATE TABLE test_db.aa_local on cluster cluster_name (
    fdate Int64,  
    time_slot Int64,  
    placement_id String,  
    city_id String,  
    city_name String,  
    user_id String,  
    request_id String,  
    request_time_ms Int64,  
    ad_id Nullable(String),  
    singerid_arr Array(String),  
    album_id String,  
    device_software_os String
  ) ENGINE = ReplicatedMergeTree(\'/clickhouse/tables/{shard}/test_db_aa_local\', \'{replica}\')
  PARTITION BY fdate ORDER BY (fdate, placement_id, time_slot, city_id, city_name) SETTINGS index_granularity = 8192
CREATE TABLE test_db.aa_all on cluster cluster_name (
   fdate Int64,  
   time_slot Int64,  
   placement_id String,  
   city_id String,  
   city_name String,  
   user_id String,  
   request_id String,  
   request_time_ms Int64,  
   ad_id Nullable(String),  
   singerid_arr Array(String),  
   album_id String,  
   device_software_os String
) ENGINE = Distributed(cluster_name, test_db, aa_all, time_slot)

2、模拟数据

aa_all_data.csv 数据

20210325,202103050700,102100000,1200,tianjin,1439127799,1452906114702139,145,1504,['1'],1,android
20210325,202103050700,102100000,1200,tianjin,1421962733,1485462913297402,144,1504,['1'],1,android
20210325,202103050700,102100000,1200,tianjin,1421962733,1485462913297402,144,1504,[‘1’,’2'],1,android

20210325,202103050700,102100000,1200,tianjin,1439127799,1452906114702139,145,1504,['1'],1,android
20210325,202103050700,102100000,1200,tianjin,1421962733,1485462913297402,144,1504,['1'],1,android
20210325,202103050700,102100000,1200,tianjin,1421962733,1485462913297402,144,1504,"['1','2']",1,android
20210325,202103050700,102100000,1200,tianjin,1421962733,1485462913297402,144,1504,"['1','2','3']",1,android

3、导入CSV格式数据

clickhouse-client -h 1.1.1.12 -format_csv_delimiter=',' -q 'insert into test_db.aa_all FORMAT CSV ' < /root/aa_all_data.csv

4、插入的方式导入数据

insert into aa_all values
    (20210312, 202103080802, '102100000', '1202', '深圳市',
    '001', '1111111111zzz', 1504, 2021, ['林俊杰11','宋祖英22'], '12347', 'linux');

5、删除数据

ALTER TABLE aa_local ON CLUSTER cluster_name DELETE WHERE fdate = 20210325;

文章最后,给大家推荐一些受欢迎的技术博客链接

  1. JAVA相关的深度技术博客链接
  2. Flink 相关技术博客链接
  3. Spark 核心技术链接
  4. 设计模式 —— 深度技术博客链接
  5. 机器学习 —— 深度技术博客链接
  6. Hadoop相关技术博客链接
  7. 超全干货--Flink思维导图,花了3周左右编写、校对
  8. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  9. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  10. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
  11. 深入聊聊Java 垃圾回收机制【附原理图及调优方法】

欢迎扫描下方的二维码或 搜索 公众号“大数据高级架构师”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

                                           

       

### 如何在ClickHouse数据库中更新数据 由于ClickHouse设计上偏向于列式存储和高性能查询,直接修改单条记录并不是其强项。然而,在某些情况下仍然可以实现类似的功能。 对于需要频繁更新的数据场景,建议采用以下几种方法之一: #### 方法一:使用`ALTER TABLE ... UPDATE` ClickHouse支持通过`ALTER TABLE`语来执行有限制条件下的批量更新操作。需要注意的是,这种更新实际上是创建了一个新的分区或副本,并不是原地更改旧数据[^2]。 ```sql ALTER TABLE my_table UPDATE column_name = new_value WHERE condition; ``` 此命令会触发后台重建符合条件的部分数据,因此适用于相对较小规模的变更需求。 #### 方法二:删除并重新插入 另一种常见的做法是先逻辑删除原有不符合要求的数据行(通常是在另一个标记字段设置删除标志),再将最新版本的数据作为新纪录插入中。这种方式特别适合处理历史数据保留的需求。 ```sql -- 假设有一个is_deleted布尔型字段用于软删除机制 INSERT INTO my_table (id, name, value, is_deleted) VALUES (... , false); -- 更新时先标记为已删 ALTER TABLE my_table DELETE WHERE id = 'specific_id'; -- 接着插入最新的数据行 INSERT INTO my_table SELECT * FROM temp_updated_data WHERE id = 'specific_id'; ``` 这种方法虽然绕过了传统意义上的`UPDATE`语法,但在实际应用中往往能更好地满足业务连续性和性能优化的要求。 #### 方法三:利用物化视图(Materialized View) 当面对复杂多变的数据维护任务时,还可以考虑构建基于原始事实之上的物化视图来进行间接性的“更新”。这允许开发者定义更灵活的数据转换逻辑而不必担心破坏底层物理结构的一致性。 ```sql CREATE MATERIALIZED VIEW mv_my_view TO target_table AS SELECT * FROM source_table GROUP BY key_columns; -- 当source_table发生变化时,mv_my_view也会自动同步调整 ``` 以上三种方式各有优劣,具体选择取决于应用场景的具体特点以及对实时性、资源消耗等因素的不同考量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不埋雷的探长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值