.Net轻松处理亿级数据--ClickHouse数据操作
该篇内容由个人博客点击跳转同步更新!转载请注明出处!
我不喜欢拿一堆数据的运行耗时来对比各个解决方案的性能等,有时候看一些测评长篇大论写耗时的一些对比,有时就差个 几百毫秒 我觉得也没啥必要,关键是好用就行,一切从简,我写博客也喜欢一切从简。
.Net操作Clickhouse的库比较少,大多数都是基于ClickHouse.ADO的一个封装,下面也主要介绍一下ClickHouse.ADO的使用,以及自己封装的一个库的使用。
前言
Clickhouse适用于大数据量分析,我的应用场景是每十秒从公交轨迹中取固定时间段数据分析一些情况,电脑配置就是普通的开发配置,总体数据轨迹量在3亿左右,处理的数据时间段在一天以内,取出的数据量在2.3万条左右。大家可以当个借鉴!

具体操作
一、简单的查询和新增以及批量新增(Clickhouse不推荐数据的编辑和删除此处就不再举例)
public class Demo
{
private ClickHouseConnection GetConnection(string cstr= "Compress=True;CheckCompressedHash=False;Compressor=lz4;Host=ch-test.flippingbook.com;Port=9000;Database=default;User=andreya;Password=123")
{
var settings = new ClickHouseConnectionSettings(cstr);
var cnn = new ClickHouseConnection(settings);
cnn.Open();
return cnn;
}
/*查询*/
public void Select()
{
using (var cnn = GetConnection())
{
var reader = cnn.CreateCommand("SELECT * FROM test").ExecuteReader()
......省略
}
}
/*增加*/
public void Insert()
{
using (var cnn = GetConnection())
{
var cmd = cnn.CreateCommand("INSERT INTO test (date,x, arr)values ('2017-01-01',1,['a','b','c'])");
cmd.ExecuteNonQuery();
}
}
/*批量新增*/
public void InsertBulk()
{
using (var cnn = GetConnection())
{
var cmd = cnn.CreateCommand("INSERT INTO test (date,x, values.name,values.value)values @bulk;");
cmd.Parameters.Add(new ClickHouseParameter
{
DbType = DbType.Object,
ParameterName = "bulk",
Value = new[]
{
new object[] {DateTime.Now, 1, new[] {"aaaa@bbb.com", "awdasdas"}, new[] {"dsdsds", "dsfdsds"}},
new object[] {DateTime.Now.AddHours(-1), 2, new string[0], new string[0]},
}
});
cmd.ExecuteNonQuery();
}
}
}
二、鉴于使用原始方法读取数据后转换的方式太麻烦,分页等也需要自己实现,所以写了一个帮助类,方便操作Clickhouse,点击跳转

使用方式也很简单,如下:
public HistoryModel GetHistories(string busid, string begindt, string enddt)
{
using (var helper = new ClickHouseHelper())
{
try
{
HistoryModel historyModel = new HistoryModel();
historyModel.Histories = helper .ExecuteList<HistoriesModel>($"select mile,speed,lon,lat,direct,termtime from its.gps_MergeTree where termtime >='{begindt}' and termtime<='{enddt}' and busid={busid} order by termtime");
historyModel.Inouts = helper .ExecuteList<InoutModel>($"SELECT * FROM its.inout_t WHERE Adtime>='{begindt}' and Adtime<='{enddt}' and Busid={busid} order by Recvtime");
//clickhouse中取出来的时间默认会有时区的问题,这里需要手动转下本地的时区
historyModel.Histories.ForEach(u => u.termtime = DateTime.Parse(u.termtime).ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
historyModel.Inouts.ForEach(u => u.Recvtime = u.Recvtime.ToLocalTime());
return historyModel;
}
catch (Exception e)
{
ckhelper.Dispose();
Console.WriteLine(e);
throw;
}
}
}
三、一些小问题记录
- 时区问题
Clickhosue中取出来的时候会多8个小时,之前一度怀疑安装时服务器时区不对,但实际上都是正确的,只能手动将时间通过ToLocalTime转成本地时区 - 批量插数据
批量插数据的时候如果传入一个List的话,对应的类需要增加GetEnumerator方法,就像这样
public class Demo
{
public string obu { get; set; }
public int busid { get; set; }
public string buscode { get; set; }
public IEnumerator GetEnumerator()
{
yield return obu;
yield return busid;
yield return buscode;
.....
}
}
- 类型统一问题
具体参考我的这篇文章 点击跳转
微信关注我哦!(转载注明出处)
.Net轻松处理亿级数据--ClickHouse数据操作的更多相关文章
- .Net轻松处理亿级数据--clickhouse及可视化界面安装介绍
该篇内容由个人博客点击跳转同步更新!转载请注明出处! 前言 我是在17年就听说过Clickhouse,那时还未接触过亿数据的运算,那时我在的小公司对于千万数据的解决方案还停留在分库分表,最好的也是使用 ...
- 超实用的mysql分库分表策略,轻松解决亿级数据问题
一.分库分表的背景 在数据爆炸的年代,单表数据达到千万级别,甚至过亿的量,都是很常见的情景.这时候再对数据库进行操作就是非常吃力的事情了,select个半天都出不来数据,这时候业务已经难以维系.不得已 ...
- NEO4J亿级数据导入导出以及数据更新
1.添加配置 apoc.export.file.enabled=true apoc.import.file.enabled=true dbms.directories.import=import db ...
- 基于Mysql数据库亿级数据下的分库分表方案
移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据的用户行为分析等这样的分析,都需要依靠数据都统计和分析,当数据量小时,问题没有暴露出来,数据库方面的优化显得不太重要,一旦数据量越来越大时, ...
- 基于腾讯云存储COS的ClickHouse数据冷热分层方案
一.ClickHouse简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),支持PB级数据量的交互式分析,ClickHouse最初是为YandexMetrica ...
- 挑战海量数据:基于Apache DolphinScheduler对千亿级数据应用实践
点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler 精彩回顾 近期,初灵科技的大数据开发工程师钟霈合在社区活动的线 ...
- MySQL使用pt-online-change-schema工具在线修改1.6亿级数据表结构
摘 要:本文阐述了MySQL DDL 的问题现状.pt-online-schema-change的工作原理,并实际利用pt-online-schema-change工具在线修改生产环境下1.6亿级数 ...
- 通用技术 mysql 亿级数据优化
通用技术 mysql 亿级数据优化 一定要正确设计索引 一定要避免SQL语句全表扫描,所以SQL一定要走索引(如:一切的 > < != 等等之类的写法都会导致全表扫描) 一定要避免 lim ...
- 不停机不停服务,MYSQL可以这样修改亿级数据表结构
摘 要:本文阐述了MySQL DDL 的问题现状.pt-online-schema-change的工作原理,并实际利用pt-online-schema-change工具在线修改生产环境下1.6亿级数 ...
随机推荐
- Android高可用移动网络连接---(转载自http://wingjay.com/2019/01/16/mobile-network-connection/)
读者好,前面我们在 <Android 架构之网络连接与加速> 和<Android 架构之长连接技术>两篇文章中,讲解了 Http 短连接.TCP 长连接.连接复用与速度优化.数 ...
- 自学_HTML<一>
HTML HTML(HyperText Markup Language):描述网页长什么样子.有什么内容的一个文本.查看网页的描述内容(HTML)的方式:使用IE浏览器的话,在网页上点击右键,选择&q ...
- 聚焦性能技术和实践, MTSC全面揭秘PerfDog演进之路
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 12月14日,2019年度中国移动互联网测试开发大会(Mobile Testing Summit China,简称 MTSC)深圳站于深 ...
- layui 集成第三方和自定义组件到模块规范
1.新建一个layui.extend.js文件,页面调用时这个文件放到layui.js后面. 2.基础的配置卸载config中,扩展的组件写入extend,组件的路径是相对于config下base的路 ...
- Java 方法引用_特性
JAVA8 方法引用:(四种方法引用的使用) 对象引用的特点:不同的对象可以操作同一块的内容:而方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字. 引用静态方法: 类名称 :: sta ...
- Android Monkey使用
Monkey 是什么? Android SDK自带的压力测试工具,也是一个命令行工具.它向系统发送伪随机的用户事件流(如按键输入,触摸屏输入,手势输入等),实现对正在开发的应用程序进行压力测试. (1 ...
- HTTP相关知识总结
HTTP协议特点 支持客户端/服务器模式 简单快速 灵活.允许传输任意类型的数据对象 限制每次连接只处理一个请求(http最初设计思想,现在为了提升传输效率,一次请求完成后不会立即断开连接) 无连接: ...
- tcp粘包、解决粘包问题
目录 subproess模块 TCP粘包问题 粘包两种情况 解决粘包问题 struct模块的使用 使用struct模块解决粘包 优化解决粘包问题 上传大文件 服务端 客户端 UDP协议 upd套接字 ...
- sleep() 和 wait() 有什么区别:
①原理不同. sleep()方法是Thread类的静态方法,是线程用来控制自身流程的,它会使此线程暂停执行一段时间,而把执行机会让给其他线程,等到计时时间一到,此线程会自动苏醒.而wait() ...
- layer重复弹出(layui弹层同时存在多个)的解决方法
layer.open() 同时存在多个;解决 layui 弹层 layer 同时存在多个页面层(iframe)的问题 这个问题其实是疏忽了一些 基础参数(仔细看文档,仔细看文档,仔细看文档) 一.ty ...
