2016-08-30 15:49:02 wuzhaodong 阅读数 152
  • 《C语言/C++学习指南》Qt界面开发篇视频精讲

    本篇讲解如何使用Qt库进行界面开发,是一个从入门到精通的教程。主要的演示平台为VS2008 + Qt4.7.3,从简单的例子入手,覆盖Qt界面开发的近乎全部技术点。(自定义Widget、对话框、事件处理Singal & Slot、界面线程与工作线程、数据视图ItemView、拖放操作Drag & Drop、界面美化Qt Style等等) 提供全部示例代码的下载。 (前四章免费)

    69519 人正在学习 去看看 邵发
Id  ItemId  Price   PriceRating
1   100 34.5    EXPENSIVE
2   145 2.3 CHEAP
3   100 34.5    EXPENSIVE
4   100 34.5    EXPENSIVE
5   145 10  AFFORDABLE
Query

SELECT 
    COUNT(Id) AS ItemsCount,
    SUM ( CASE WHEN PriceRating = 'Expensive' 
          THEN 1
          ELSE 0
          END
        ) AS ExpensiveItemsCount
FROM ItemSales 
Results:

ItemsCount  ExpensiveItemsCount
5   3
2018-06-21 21:55:47 cafebar123 阅读数 1111
  • 《C语言/C++学习指南》Qt界面开发篇视频精讲

    本篇讲解如何使用Qt库进行界面开发,是一个从入门到精通的教程。主要的演示平台为VS2008 + Qt4.7.3,从简单的例子入手,覆盖Qt界面开发的近乎全部技术点。(自定义Widget、对话框、事件处理Singal & Slot、界面线程与工作线程、数据视图ItemView、拖放操作Drag & Drop、界面美化Qt Style等等) 提供全部示例代码的下载。 (前四章免费)

    69519 人正在学习 去看看 邵发

大数据技术对处理大批量数据和在分布式计算上,较传统技术优势明显。那么,借大数据技术在处理航空数据上是否有用武之地?本文接下来讨论使用大数据组件来处理航空数据。

航空数据有的数据以csv文件格式存储,统计分析航空数据有很多潜在价值,尽管有可观的分析价值,但这里仍跟大数据技术扯不上关系。所以,笔者准备从案例的角度,来尝试讨论下自己的观点。

案例一


假设一个航空公司的某业务一天生成100个csv,一个月生成3000个csv,在使用csv文件数据时,遇到一个问题:

这些csv怎么存?怎么用?

(1)问题分析


这个问题比较宽泛,我们可以拆解为,怎么存,可以解析为怎么存?和好不好存?怎么用,可以解析为能不能用?和好不好用。其实还可以继续拆解:

这里写图片描述

从图中看,如果“一般文件系统”不能胜任,可以使用hadoop hdfs文件系统,或者其它分布式文件系统,这类分布式文件系统首先能解决容量的问题。既是文件系统,文件系统该有的功能也都具备,所以使用hadoop hdfs是个不错的选择。

如果不使用文件系统存储,数据库,no sql数据库也是一个选择。mysql,oracle存csv并不常见,no sql 存csv也不常见,不确定后果,不是一个好的选择。如此一来,可能也会排除hive,hbase等no sql数据库。但另一方面,不常见的原因是,数据库存储的数据单元更小而已,如能把csv拆分,也能存csv。那么,这里的问题是,如此一来,处理csv的方式出现了分水岭:

这里写图片描述

选择哪一边,是很困难的。基于改动越小越好的原则,选择“文件系统”更好。基于拓展性越多越好的原则,第二种更好。

那么,在使用文件读取工具上,怎么选择大数据组件?如果“一般工具”能胜任,就使用一般工具好了。这里的“一般工具”可以是csv读写工具,也可以是csv计算工具。实际上,不光读写功能,这里显然是做了过度简化。据笔者个人的了解,目前市面上这一类工具很多,也很优秀。如果我们强制区分“一般性工具”和“大数据组件”,大数据组件可选的有:

这里写图片描述

相比较,大数据组件在处理csv上,也不是很差,优点也很多,只是用起来,需要环境等前提。

那么,性能,效率怎么样?它们都是开源产品,在不断完善,在往好的方向上。那么选哪一种大数据组件呢?

首先是比较了。市面上也有比较分析结果。总之,比较结果的共识是:

这里写图片描述

这里谈点个人理解。需要注意的是,“需求点”的成本和收益。比如“百度搜索”,它其实是查询功能,这个需求点,是查询。这个点价值巨大,所以值得整个公司为它投入巨大,各种高科技都往上堆。

既然前面说到使用“大数据组件”有前提,这就牵扯到好不好用上面了。实际上,这个问题是这样的:

这里写图片描述

问题这么多,这并不好决定。

(2)大数据组件优缺点分析

这里写图片描述
在一个数据处理流程中,本来做技术的很难掌控全局,更何况做小弟的。在组件选型上,首先,是推荐spark平台。原因是,spark是后来着,后来者会吃掉前者。这是玩笑话,但实际上,确实如此,spark的特点:

这里写图片描述

技术也并不是越先进越好,况且笔者也没有掌握全这么多技术。那么,支持spark平台的组件如何选型?首先看下常用的大数据组件的优缺点:

spark Core:

这里写图片描述

hive优缺点:

这里写图片描述

hbase优缺点:

这里写图片描述

apache atlas(元数据管理)优缺点:

这里写图片描述

详见文章:https://blog.csdn.net/cafebar123/article/details/79944247

实际上,以上列出的只是其中几个常用的组件,其实,笔者还漏掉了一些组件。而这些,根本不是需要犹豫的,而是必须选择的。比如:

这里写图片描述

上面列举了一些大数据的组件,它们各有优缺点。事实上,随着技术迭代(比如hbase已经迭代到V1.2了),它们的缺点越来越少。

(3)试着去搭配组件

如果是离线处理csv文件,那么以下搭配都是可行的:

搭配(1):

分布式文件系统+”一般工具”+关系数据库

搭配(2):

分布式文件系统+spark core+”一般工具”+关系数据库

搭配(3)

hbase+关系数据库+no sql数据库

搭配(4)

hbase+spark core+关系数据库+no sql数据库

说到这里,可能有人觉得,这样看来,组件选型也不是很困难。

其实,前面讲了存取,读写,计算工具,还有一样没有讲到,就是:数据分析工具。对于“数据分析”而言,大数据组件也很多,比如

(1)Apache spark SQL:

spark的类SQL的查询系统。

(2) Apache hive SQL:

hadoop的类SQL数据仓库系统。

(3)Apache Pig

hadoop中,用于处理数据分析程序的高级查询语言。

(4)Apache Optiq:

一种框架,可允许高效的查询翻译,其中包括异构性及联合性数据的查询。

(5)Actian SQL for Hadoop:

高性能交互式的SQL,可访问所有的Hadoop数据。

(6)Cloudera Impala:

由Dremel授意的交互式分析框架。

这些名字都不知道怎么念的分析组件,其实可以发现一个特征,它们都在尽力模仿SQL的查询方式。另一方面,由于多数组件都是Apache基金下,因此接入它们也是可行的,至少java语言的版本是可行的。

至于选哪种组件,笔者比较推荐的有:

(1)Apache spark SQL

(6)Cloudera Impala

附Cloudera Impala 优缺点:

这里写图片描述

(4)”是否好用“的问题分析

那么,回过头来,再看看“是否好用”的问题:

这里写图片描述

比如说“结果准吗”这个问题,这里面其实还有很大部分是指在数据除噪上的工作好不好,这就涉及规则校验-数据质量评价。

单纯从技术角度看,笔者的理解,按照已知的规则进行,数据准确性是很高的。

再比如“执行结果稳定吗”这个问题,这也是一个复杂的问题,如果过度简化的话,就是指这个大数据组件搭配起来的处理系统是否稳定,乐观的是,基于分布式和高可用的特性,它当然基本是稳定的。

还有其它的问题,都是复杂的问题。笔者的理解,这些不会是能够完全解决的问题。通常的做法是,先穷尽可能的问题,然后解决主要的问题,其它的,笔者也说不清楚。

(5)可能的搭配和总结

至此,笔者分析了在数据存取+读写+计算+分析上,常见的大数据组件的应用的可能,我们可以总结出一个可行的组件搭配

搭配(1):

分布式文件系统+”一般工具”+关系数据库+SQL分析

搭配(2):

分布式文件系统+spark core+”一般工具”+关系数据库+SQL分析+spark SQL分析(Cloudera Impala 分析)

搭配(3)

hbase+关系数据库+no sql数据库+SQL分析

搭配(4)

hbase+spark core+关系数据库+no sql数据库+SQL分析+spark SQL分析(Cloudera Impala 分析)

搭配(5)

分布式文件系统+hbase+spark core+”一般工具”+关系数据库+no sql数据库+SQL分析+spark SQL分析(Cloudera Impala 分析)

从以上的几个搭配来看,有几点似乎比较明显:

(1)似乎关系数据库是一个存在感很强的部分。是的,关系数据库本身很优秀。

(2)在没有用到分布式文件系统的时候,no sql数据库存在感也比较强。笔者觉得,在这种情况下,redis,ehcache,slor,elastic search 将有很强的作用。

(3)似乎把它们全部加起来也是一个很好的搭配。是的,但是有多好呢?这个笔者反而不清楚。

那么,这样的组件搭配,效果怎么样呢?从笔者的实际应用经验看

(1)能很大提高数据处理能力,至少以前是不可能的,低效的

(2)按目前的应用经验来看,组件之间能互相衔接,流程能走通

(3)复杂度比较高,调优空间还有很大

最后,尽管上面分析了一些组件的优缺点,但仍停留在比较浅的层面,仍然不能在“是否值得使用”的问题上有所解答。笔者也试着分析了几个问题的本质,不过看起来,真正的情况是,还得实践,然后才有更多的体会。


案例二


对一些飞行培训学校或航空公司,有关飞机飞行的过程,会构建一些模型来做分析,这个在教学和研究中有时会遇到,其复杂度会比类SQL查询要高。

从谷歌学术中一些公开的论文或学术资料中,可以找到比如:

(1)《飞机排班数学规划模型》

(2)《基于航空公司成本最小化的飞机排班问题模型与算法》

(3)《飞机的航迹模拟仿真算法》

(4)《民用飞机航迹预测关键技研究》

(5)《基于遗传算法的下降阶段飞机油耗分析与研究》

(6)《基于深度学习的航空发动机故障融合诊断》

(7)《航空发动机温度过热故障挖掘模型仿真》

从上面的模型也好,算法也好,看起来,模型千差万别。

(1)需要面对的问题

大概分析下案例二的问题:

这里写图片描述

面对千差万别的模型,如果有这样的问题:
即同样的数据源能否在不同模型下都能使用?
SO,我们需要:

提供通用的,噪点小的数据源

那么,面对这种需求,大数据组件应该怎样选型呢?看上去,该问题像是无解的,但仍可以做一些定性分析。

来看下大数据组件需要面对的问题:

这里写图片描述

(2)需要重点解决的问题

从上面来看,我们可以重点关注这几点

(1)数据格式统一?

(2)临时存储空间大?

(3)是否提供管理工具?

目前,原始数据源是csv文件。csv格式,这种类型也不差,格式简洁,容易解析。直接使用,最省事的。但存在问题:

1.颗粒度比较的,意味着无效数据较多,增加性能消耗。

2.此外,数据不够集中,无效的数据导致分析异常,且难排查。

那么,转成:mysql表结构或hbase结构?

因为这2中结构是关系表结构和K-V结构的代表。同类产品还有:

这里写图片描述

将csv转成另一种结构的数据,这样,新数据就不是原始数据了。自然对分析结果有影响。这会带来很大的问题:分析后的结果数据面临信任危机!

那么,只有减小这种影响,方式比如有:

(1)转换过程中只简单处理或不处理。

(2)把csv格式转成csv近亲格式。比如csv是逗号分隔,转成分号分隔。

当然,这样的方式也会遇到困难,比如,数据本身的类型,int,float,string,double等。

在java 中,类似“泛型”的方式,可以处理不确定数据类型的数据。借助于泛型,可是生成包容不同数据类型的List数据,这是一个中间数据格式。

或是json数据格式,它近年被大量采用于各个领域,互联网也好,大数据也好,关系型数据库oracle和mysql也都支持这种数据格式。足以说明它的优势。

回到上面的问题:数据格式统一?

这个问题本身意味着格式转换不可避免,笔者的见解是:

(1)就千差万别的模型而言,没有通用的数据格式

(2)要转,就转成一个能很方便转成其它格式的数据格式

再来看第二个问题:临时存储空间大?

这又为什么呢?据笔者了解,模型训练也好,分析也好,通常是基于大样本。这意味着数据源很大,中间计算产物也大。

比如说,有这样的计算需求:

查询一年中某几个参数的所有数据。

那么有以下可能:

(1)模型每次要完整执行一次,才会出结果

(2)模型执行一次,下次可以只执行一部分就可出结果

这第二种可能,显然是重复利用了中间计算产物。第二种可能看起来,耗时更小,可复用性也比第一种要高,那么是不是更优秀呢?

笔者觉得,不知道。但笔者更倾向于第一种。因为中间计算产物的可复用性到底高不高?一个模型可以调节的参数通常很多,中间计算产物也很多,如果能重复利用越多越好,但一来,需要甑别的环节;而来,可复用的次数高不高,很难做评估。

实际上,依笔者的看法,这个实际上是一个计算能力的问题。

原因就是,如果计算够快,并不期望能节省多少资源。

目前spark计算能力足够强,除了本身的计算能力,spark应用的思想之一是:如果一个计算过程有5种中间计算产物,那么每个计算步骤后,都只会有一种中间计算产物,原来的中间计算产物被覆盖,而且分布式保存在各节点上。直到最后一步,才真正计算,并把结果数据汇集到主节点。

这种 思想,使得计算很高效,但同样占用内存。

对此,笔者觉得,如果想不出更好的点子,就往目前的点子上面靠。所以,针对“临时存储空间大”的需求,使用spark core组件,并使用效果较好的调优手段,是比较好的选择。

第三,(3)是否提供管理工具?

模型分析需要的样本很大,一个好的管理工具能大大方便大批量数据的管理。据笔者了解,apache 基金下有一些好的组件提供管理工具,比如:

(1)Apache Atlas

提供较好的元数据管理和数据安全管理。

(2)Apache hbase

提供很好的列式存储,提供数据压缩,同步等特性。

(3)其它,待研究。

(3)组件选型和总结

综上,为了解决需求:提供通用的,噪点小的数据源。

笔者分析了一些数据处理方式,以笔者的见解,推荐的大数据组件搭配有:

(1)关系数据库+hbase+solr/elastic search+spark core

(2)关系数据库+hadoop hdfs+apache atlas+hbase+solr/elastic search+spark core

总之,第一,关系数据库是必要的,一些元数据还是要放在关系数据库;第二,hbase这里的作用,除了本身作为列式数据库,其实,笔者觉得还有需要研究的地方,但仍是一个推荐的组件。

2016-04-04 18:45:44 wangyanming123 阅读数 748
  • 《C语言/C++学习指南》Qt界面开发篇视频精讲

    本篇讲解如何使用Qt库进行界面开发,是一个从入门到精通的教程。主要的演示平台为VS2008 + Qt4.7.3,从简单的例子入手,覆盖Qt界面开发的近乎全部技术点。(自定义Widget、对话框、事件处理Singal & Slot、界面线程与工作线程、数据视图ItemView、拖放操作Drag & Drop、界面美化Qt Style等等) 提供全部示例代码的下载。 (前四章免费)

    69519 人正在学习 去看看 邵发
/*
需求:某公司采用公共电话传递数据信息,数据是小于8为的整数,为了确保安全,在传递过程中需要加密,加密规则如下:
首先把数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字。
最后将第一位和最后一位数字交换。清任意给定一个小于8位的整数,
然后,把加密的结果在控制台打印出来
题目要求:
A:数据是小于8位的整数
定义一个int类型的数据
int number = 123456;
B: 加密规则
a:首先将数据倒序
结果 654321
b:然后每位数字都加上5,再用和除以10的余数代替该数字
结果 109876
C:最后将每一位和最后一位数字交换
结果 609871
C:把加密的结果输出到控制台。

通过简单的分析,我们如果有办法把这个数据变成数组就好了。
不是直接写成这个样子的:
int[] arr = {1,2,3,4,5,6};
如何把数据转成数据呢?
A:定义一个数据
int number = 123456;
B:定义一个数组,这个时候问题就来了,数据的长度是多少呢?
int[] arr = new int[8];
在赋值的时候,我用一个变量记录索引的变换。
定义一个索引值为0
int index = 0;
C:获取每一个数据
int ge = number%10;
int shi = number/10%10
int bai = number/10/10%10

arr[index] = ge;
index++;
arr{index} = shi;
index++;
arr[index] = bai;
...
*/
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args){


//定义一个数据
int number = 123456;

//定义一个数组
int[] arr = new int[8]; 

//把数据中每一位上的数据获取到后存储到数组中
/*
int index =0;
arr[index] = number%10;  //arr[0]=6;
index++;
arr[index] = number/10%10;  //arr[1]=5;
index++;
arr[index] = number/10/10%10;  //arr[2]=4;
*/
//通过观察这个代码,我们发现应该可以通过循环改进的
int index = 0;
while(number>0){  //number=123456,number=12345,number=1234,number=123,...number=0
arr[index] = number%10;  //arr[0]=6,arr[1]=5,arr[2]=4,,arr[3]=3,...,arr[5]=1
index++;  //index=1,index=2,,index=3,...,index=6
number/=10;  //number=12345,number=1234,,number=123,...number=0
}

//然后将每位数字都加上5,再用和除以10的余数代替该数字
for(int x=0; x<index; x++){
arr[x] += 5;
arr[x] %= 10;
}

//最后将第一位和最后一位数字交换
int temp = arr[0];
arr[0] = arr[index-1];
arr[index-1] = temp;

//输出数据
for(int x=0; x<index; x++){
System.out.print(arr[x]);
}
System.out.println();
}
}
运行结果:
609871


改进之后的代码:
/*
需求:
把刚才的代码改进一下:
A:把数据改进为键盘录入
B:把代码改进为方法实现
*/
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args){


//创建键盘录入对象
Scanner sc = new Scanner(System.in);

//请输入一个数据
System.out.println("请输入一个数据(小于8位):");
int number = sc.nextInt();

//写功能实现把number进行加密
//调用
String result = jiaMi(number);
System.out.println("加密后的结果是:"+result);
}

/*
  需求:写一个功能,把数据number实现加密
  两个明确:
  返回值类型:String 做一个字符串的拼接
  参数列表:int number
*/
public static String jiaMi(int number){
//定义数组
int[] arr = new int[8];

//定义索引
int index = 0;

//把number中的数据想办法放到数组中
while(number>0){
arr[index] = number%10;
index++;
number /=10;
}

//把每个数据加5,然后对10取余数
for(int x=0; x<index; x++){
arr[x] +=5;
arr[x] %=10;
}

//把第一位和最后一位交换
int temp = arr[0];
arr[0] = arr[index-1];
arr[index-1] = temp;

//把数组的元素拼接成一个字符串返回
String s = "";//定义一个空字符串
for(int x=0; x<index; x++){
s +=arr[x];
}
return s;
}
}
2017-07-10 10:11:14 ZJDWHD 阅读数 752
  • 《C语言/C++学习指南》Qt界面开发篇视频精讲

    本篇讲解如何使用Qt库进行界面开发,是一个从入门到精通的教程。主要的演示平台为VS2008 + Qt4.7.3,从简单的例子入手,覆盖Qt界面开发的近乎全部技术点。(自定义Widget、对话框、事件处理Singal & Slot、界面线程与工作线程、数据视图ItemView、拖放操作Drag & Drop、界面美化Qt Style等等) 提供全部示例代码的下载。 (前四章免费)

    69519 人正在学习 去看看 邵发
1.Oracle(用thin模式)数据库
    驱动:"oracle.jdbc.driver.OracleDriver";
    Url:jdbc:oracle:thin:@<host>:<port>:<SID>; 
    String UserName = "username";  //用户名
    String Password = "password";  //密码
    Class.forName(驱动).newInstance();
    connection con = DriverManager.getConnection(Url,Username,Password);

2.DB2
    驱动:"com.ibm.db2.jcc.DB2Driver";
    Url:"jdbc:db2://<host>:<port>/<database_name>";
    String UserName = "username";
    String Password = "password";
    Class.forName(驱动).newInstance();
    connection con = DriverManager.getConnection(Url,UserName,Password);

3.MySQL数据库
    驱动:"com.mysql.jdbc.Driver";
    Url:"jdbc:mysql://<host>:<port>/<database_name>";
    String UserName="username";
    String Password="password";
    Class.forName(驱动).newInstance();  //加载数据库驱动
    connection con = DriverManager.getConnection(Url,Username,Password);

4.Microsoft SQL server 数据库
    SQL Server 2000:
    驱动: "com.microsoft.jdbc.sqlserver.SQLServerDriver";
    Url:"jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sample";
    SQL Server 2005:
    驱动: "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    Url:"jdbc:sqlserver://<host>:<port>;databaseName=<database_name>"; 
    String UserName="username";
    String Password="password";
    Class.forName(驱动).newInstance();
    connection con=DriverManager.getConnection(Url,Username,Password);


参考文章:
  http://blog.csdn.net/ring0hx/article/details/6152528

2018-04-28 11:09:59 qq_35582511 阅读数 3310
  • 《C语言/C++学习指南》Qt界面开发篇视频精讲

    本篇讲解如何使用Qt库进行界面开发,是一个从入门到精通的教程。主要的演示平台为VS2008 + Qt4.7.3,从简单的例子入手,覆盖Qt界面开发的近乎全部技术点。(自定义Widget、对话框、事件处理Singal & Slot、界面线程与工作线程、数据视图ItemView、拖放操作Drag & Drop、界面美化Qt Style等等) 提供全部示例代码的下载。 (前四章免费)

    69519 人正在学习 去看看 邵发
举出适合文件系统而不是数据库系统的应用例子,以及适用数据库系统的应用例子。

(1)适用于文件系统而不是数据库系统的应用例子: 数据的备份、软件或应用程序使用过程中的临时数据存储一般使用文件比较合适。早期的功能比较简单,比较固定的应用系统也适用文件系统。
(2)适用于数据系统而非文件系统的应用例子:目前,几乎所有企业或部门的信息系统都以数据库系统为基础,都是用数据库。例如,一个工厂的管理系统(其中会包括许多子系统,如库存管理系统,物资采购系统,作业采购系统,作业调度系统,设备管理系统,人事管理系统等),学校的管理系统,人事管理系统,图书馆的图书管理系统,等等。都适合数据库系统。

数据库行转列简单例子

博文 来自: smpig

大数据开发例子

阅读数 196

没有更多推荐了,返回首页