翼度科技»论坛 编程开发 .net 查看内容

.NET与大数据

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
前言

当别人做大数据用Java、Python的时候,我使用.NET做大数据、数据挖掘,这确实是值得一说的事。
写的并不全面,但都是实际工作中的内容。
.NET在大数据项目中,可以做什么?


  • 写脚本(使用控制台程序+顶级语句)
  • 写工具(使用Winform)
  • 写接口、写服务
使用C#写代码的优点是什么?


  • 静态类型+匿名类型,一次性使用的实体类就用匿名类型,多次或多个地方使用的实体类就用静态类型,静态类型优于Python,匿名类型优于Java。你是不是想说Python也有静态类型?你倒是写啊?!
  • 代码的可维护性好,这是相对于Python说的,不一定是语言的锅,还有固有的代码组织习惯,静态类型本身就是很好的注释
  • 性能好,异步并发的代码易编写。
    想起来一个事,就是前同事用Python2做数据挖掘,先用的es,性能差,改用的clickhouse,我就纳闷,es性能差?现在我想我明白了,我看了其中一个挖掘算法,它需要在双层循环遍历中去请求es进行查询,它没有使用异步,也没有使用多线程,那不就是一个线程在查询吗?我们现网es服务器配置这么强这么多,它居然用一个线程去同步请求,能快才怪!实际上一个请求耗时极短,因为es有各种缓存,而查询条件精确可以命中缓存,所以可以并发请求多个es节点。
    那前同事为什么没有使用异步并发或多线程呢?Python2不支持吗?或者Python2支持,但写起来不方便?或者前同事不会写?(原因:写起来不方便,C#一样也不太方便,而且会使整个程序的并发请求量变得难以控制,可以针对某个接口单独优化,但所有接口都这样写,也挺麻烦的)
使用.NET开发的优点是什么?

其中一个优点是应用程序类型丰富,目前我用到的应用程序类型有:

  • 控制台
  • Winform
  • Web API
  • Blazor
    你是不是想说Java和Python也可以写控制台、窗体程序、Web API?一个熟悉Ptyhon的程序员,可不一定会写窗体程序,需要一点时间学习,一个做了几年.NET的程序员天然会写Winform,就是拖控件啊。当然,也可能他们不用Windows。
    每一种应用程序类型,都意味着学习成本,而这些我已经会了,时间就省下了(Blazor一开始不会,学习花了一两天)。
.NET与ClickHouse

我写了一个大杂烩脚本项目,里面有很多工程是查询ClickHouse统计分析,代码流程就是读取Excel数据作为查询输入条件,查询ClickHouse统计分析,统计结果导出到Excel。一个统计分析工作任务小半天就完成了。
用的ORM是我自己写的Dapper.LiteSql。没什么人用,可能是功能不强吧。不过很适合我自己的需求,我自己经常用。
比如:
  1. int count = session.CreateSql<XXX>(@"
  2.     select count(distinct t.xxx, t.xxx, t.xxx) as cnt
  3.     from xxx t
  4. ")
  5. .Where(t => t.PassTime >= startTime && t.PassTime <= endTime)
  6. .Where("t.Name in (" + kkNames + ")")
  7. .QuerySingle<int>();
复制代码
对于统计查询,我经常SQL和Lambda表达式混写,感觉这样非常灵活。
某些情况下,混写比纯Lambda写法,是要清晰的:
[code]List list = session.CreateSql(@"    select xxx, xxx as xxx, max(xxx) as xxx    from (    select xxx, toDate(xxx) as xxx, xxx, count(*) as xxx    from (    select distinct t.xxx, t.xxx, t.xxx    from xxx t").Where(t => t.Xxx != "xxx").Where(t => t.XxxTime >= startTime && t.XxxTime  xxxList.Contains(t.Xxx)).Where(@"(    (formatDateTime(t.xxx_time ,'%H:%M:%S') >= '07:00:00' and formatDateTime(t.xxx_time ,'%H:%M:%S') = '14:00:00' and formatDateTime(t.xxx_time ,'%H:%M:%S')

举报 回复 使用道具