程序语言根据其设计目的不同,其侧重的基本数据类型也不同。JAVA、C#等语言被设计用来进行通用的应用程序开发,其基本数据类型是字符串、数字、布尔等原子数据类型,以及数组和通用对象。SQL、PowerBuilder、R、集算器esProc等语言被设计用来进行数据处理,其基本数据类型是有结构的二维数据表对象。比如这句SQL:SELECT T1.id,T1.name,T1.value FROM T1 LEFT JOIN T2 ON T1.id=T2.id, 这里的T1,T2以及计算结果就是这种数据类型。用多个字段组成一条记录,由多条结构相同的记录组成二维数据,这样的数据及其字段名的组合就是有结构的二维数据表对象。
数据处理处理语言为什么不用原子类型和通用对象作为基本类型?尝试把上面那句SQL里的T1,T2用JAVA中的数组或者ArrayList对象来表示,你会发现:复杂度立刻增加数倍,代码的长度更会陡增几十倍!
数据处理语言中的基本数据类型都是有结构的二维数据表对象,这并非巧合,而是有着深刻的原因。
对应真实业务。现实世界中的业务数据大都是结构化数据,比如工资表,有员工编号、员工姓名、部门、日期、税前工资、税后工资等等;比如零售记录,有订单时间、门店编号、收银台编号、收银员编号、商品名称、单价等等;再比如网站日志,有浏览时间、URL、访问者IP、浏览器版本等属性。这些属性相当于字段,每条数据结构都一样,虽然其存储方式经常是文本而非数据库,但实质上仍然是结构化数据,用有结构的二维数据表对象来表示是再自然不过的事情了。有结构的二维数据表对象可以最直观地呈现业务数据,最真实的表达实际业务,不论是存储、计算、交换还是分享,这种形式的数据都是最方便最容易理解的。
易于实现批量处理。业务数据通常是结构相同的数据,比如之前提过的工资表、零售记录、网站日志。处理这类数据时,个别情况下会针对某条记录的某个字段,但绝大多数情况下都是以记录为单位对所有数据进行处理的,比如:根据税前工资计算出税后工资;根据单价和商品数量计算出金额;统计出每天每个IP的在线时长。上述处理方式就是批量处理。实现批处理,可以像JAVA那样按行号列号循环遍历数组的每个成员,也可以像SQL、集算器esProc那样直接按业务字段名操作数据,后者简单易用无需循环语句,更利于程序员从业务角度直观方便地操作数据,相应的代码也更加简短易读。
符合关系代数。关系代数是E.F. Codd专门为数据处理和数据查询而设计的底层理论,它用基本运算、连接运算、聚合运算、除法运算详尽地描述了业务数据之间的关联关系和运算规律,理论上可以完成数据处理和数据查询中任意难度的计算问题。由于关系代数简洁而完备,数据库因而大都是按照这一理论来设计的,E.F. Codd更被称为关系型数据库之父。有结构的二维数据表对象正是E.F. Codd推荐的数据类型,它可以比较完美地表达关系代数中的各类运算,从而轻松实现数据处理中的计算问题。事实上,数据库结果集就是最早的有结构的二维数据表对象。
可以看到,由于可以对应真实的业务数据,易于实现批处理计算,符合关系代数理论,因此各类数据处理程序语言不约而同地使用有结构的二维数据表对象作为基本数据类型。使用二维数据表对象,代码简洁易懂,开发效率更高,下面再举几个例子说明这一点:
SQL的结果集(resultSet):按图书类型分组,求平均价格大于15元的图书,它们的均价是多少?
select avg(price),type from books group by type having avg(price)>15
集算器esProc的序表(TSeq):按部门分组,求各部门销量前10的产品。
products.group(department).(~.top(quantity;10)
PowerBuilder的数据窗口(datawindow):将订单按照价格排序
Order.SetSort('value d') Order.Sort()
R语言的数据框(data.frame):将orders表和customer表按照customerID进行左关联。
merge(A1,B1,by.x="CustomerID",by.y="CustomerID",all.x=TRUE)
SQL、集算器esProc、R的代码对比:将订单数据按照部门分组,汇总各部门的订单数量和销售额。
SQL:
Select count(*),sum(sales) from orders group by Dept
集算器esProc:
orders.groups(Dept; count(~), sum(sales))
R语言:
result<-aggregate(orders$ sales,list(orders $ Dept),sum) result$count<-tapply(orders $ sales, orders $ Dept,length)
结果集、序表、数据窗口、数据框,它们虽然都是有结构的二维数据表对象,功能也基本相同,但它们之间还是有着细微的差别的。
SQL结果集资料丰富,使用范围广泛,通用性较好,简单易用,是数据处理语言中最主流的数据类型。但SQL没有完全实现关系代数,导致有些运算不够方便,比如集合除法。
数据窗口一般会从SQL取数,最终结果也会返回数据库,它的主要功能是打通了数据和UI控件之间的隔阂,让程序员可以快速设计出交互性优异的数据库应用程序。DataWindow的主要功能是数据呈现和编辑,只有针对单表的计算,数据处理能力比较弱。
数据框具有一定的结构化计算能力,但从上面的例子可以看出,它的语法较难理解,实现同样的功能相对复杂。这是因为R主要的功能是科学统计计算,重点的数据类型是数列和矩阵,数据框是后来为了实现结构化数据计算才新增的数据类型。从这一点来看,数据框的专业性不如其他三种。
序表在数据处理方面比较专业,它具有SQL结果集的一般优点,对关系代数实现得也比较彻底。序表还具有有序的特点,适合解决数据处理中和顺序有关的难题,比如:比上期、同期比,排名、相对区间计算等。序表还具有泛型的特点,建立数据之间的关联关系更加容易,可以用对象的形式来轻松访问多级关联的数据。与SQL相比,序表的缺点在于它是纯内存对象,无法直接处理大数据。
可以看到,有结构的二维数据表对象和数据处理程序语言的专业程度直接相关,前者的功能越强,后者的专业程度也越高。反之也一样,如果一门语言缺乏有结构的二维数据表对象,那这门语言的在数据处理方面就很难称得上专业。考察一门程序设计语言是否能够高效开发数据分析处理的程序,关键就是看其有没有专业的二维数据表对象以及相应的类库。
Perl常被用于字符串检索,具有一定的数据处理能力,但其代码冗长复杂,算不上是专业的数据处理语言。比如进行最简单的分组汇总时,Perl的代码如下:
%groups=(); foreach(@carts){ $name = $_->[1]; if($groups{$name} == null){ $groups{$name}=[$_]; } else{ push($groups{$name},$_); } } my @result=(); foreach( keys(%groups)){ $value=0; while($row=pop $groups{$_}){ $value += $row->[2]; } push @result,[$_,$value]; }
Python的写法稍简单些,但和SQL、集算器esProc、R来比,开发效率上仍有量级的差异。示例代码如下:
result=[] for key, items in groupby(data, itemgetter(0)): value1=0 value2=0 for subitem in items: value1+=subitem[1] value2+=subitem[2] result.append([key,value1,value2]) print(result)
Perl和Python在数据处理方面不够专业,最重要的原因就是缺乏有结构的二维表数据对象。
集算器esProc序表不仅是有结构的二维表数据对象,而且还具备有序、泛型、分步计算等特性,比同类语言的专业性更强。比如实现一个较复杂的计算目标:找出连续上涨超过5天的股票。集算器esProc的代码如下:
相关推荐
本资料主要聚焦于C语言中的基本数据类型,这是一门经典的编程语言,其数据类型的理解对于其他许多语言的学习都有启示作用。数据类型是程序设计的基础,它定义了程序中变量的种类和内存占用,以及如何进行计算和操作...
【C#编程语言基本语法介绍】 C#是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows桌面应用、Web应用以及游戏等。C#在.NET框架上运行,该框架提供了一个全面的开发环境,包括类库、运行时环境以及各种...
ST 语言中的变量可以存储不同的数据类型,包括基本数据类型和用户定义的数据类型。变量可以通过赋值语句来赋值,变量的数据类型可以通过类型声明来指定。 操作符 ST 语言提供了多种操作符,包括算术操作符、比较...
在易语言中,自定义数据类型是一种重要的编程概念,它允许程序员根据需求定义自己的数据结构,比如组合多种基本数据类型,形成复合型的数据结构。本文将深入探讨易语言中自定义数据类型的内存存储方式及其相关知识点...
下面我们将深入探讨几种常见的基本数据类型在不同编程语言中的存储格式。 1. 整型(Integer) - 在C/C++/Java等语言中,整型分为short、int、long、long long等,它们在不同的平台和编译器下有不同的字节数。通常...
这个实验旨在帮助学生深入理解Java编程语言中的基础元素,包括基本数据类型的使用以及数组的处理。以下是根据实验内容展开的知识点详解: 1. **基本数据类型**:Java中有八种基本数据类型,包括两种整型(byte, ...
组合数据类型是Python语言区别于其他高级编程语言的一大特色,通过组合数据类型,省去了其他语言各种复杂数据结构的设计,给编程人员带来了极大的方便,这也是Python流行于数据分析领域的原因之一。学习本章,要熟练...
本节我们将深入探讨“05 基本数据类型”这一主题,这包括在各种编程语言中常见的基本数据类型,以及它们的特性、用途和操作方式。 在大多数编程语言中,基本数据类型可以分为以下几类: 1. 整型(Integer Types)...
在本课程“S1-使用Java语言理解程序逻辑-第二章变量、数据类型和运算符”中,我们将深入探讨Java编程的基础,特别是关注变量、数据类型以及运算符的使用。这些概念构成了任何程序的核心,是编写有效代码的基础。通过...
易语言是一种基于中文编程的计算机程序设计语言,它旨在降低编程难度,使更多的人能够参与到编程活动中。在易语言中,自定义数据类型是实现复杂数据结构和逻辑的关键部分。自定义数据类型允许用户根据需求定义自己的...
- **基本数据类型**:包括整型、浮点型等,每个数据类型都有其特定的值域限制。 - **普通数据类型**:如无符号整型、有符号整型等。 - **基础系统数据类型**:由系统提供的基本数据类型集合。 - **用户定义的...
在Java编程语言中,基本数据类型是程序中最基础的元素,包括整型、浮点型、字符型和布尔型。本章将详细讲解Java中的基本数据类型转换,这对于理解和编写高效、准确的代码至关重要。 首先,Java有两类数据类型:基本...
在讲解Android应用编程基础时,了解Java语言的数据类型是至关重要的。Java是一种静态类型语言,这意味着在...因此,对于Android开发者来说,深入学习并掌握Java编程语言的数据类型是构建高效、稳定Android应用的基石。
SPL内置专业的数据处理函数,提供了大量时间复杂度更低的基本运算,通常不需要外部Java类库,特殊情况可在自定义函数中调用。 在IDE和调试方面,三者都有图形化IDE和完整的调试功能。SPL的IDE专为数据处理而设计,...
这份文档涵盖了RAPID编程语言中的指令、函数和数据类型,是进行ABB机器人编程的重要参考资料。 在RAPID编程中,函数和数据类型是编程的基础元素。函数是执行特定任务的预定义代码块,而数据类型定义了存储和处理...
Python是一种广泛应用于各种领域的高级编程语言,特别是在数据分析、科学计算、机器学习以及Web开发中有着极高的声誉。自1991年由Guido van Rossum创造以来,Python经历了二十多年的发展,逐渐成为全球最受欢迎的...
这些类型在不同的编程语言中可能有不同的表现形式和特性,但它们都代表了数据处理的基本单元。 1. **整型**:整型数据用来表示没有小数部分的数字,例如1、2或-3。在大多数语言中,整型分为不同大小,如8位的byte,...
在Java程序设计中,基本数据类型和基本操作是编程的基础。本篇将详细阐述这些关键概念。 2.1 引言 在Java中,程序是由数据和对数据进行操作的指令组成的。基本数据类型是构建程序的基础,它们包括数值、字符和布尔...
7. 编程实践:书中会包含使用Python、Java和Scala等编程语言进行大数据处理的示例代码,帮助读者提高编程技能,实现大数据解决方案。 通过阅读《深入理解大数据:大数据处理与编程实践》,读者不仅能掌握大数据的...
2. **数据类型**:RPGLE支持多种数据类型,如数值型(如Packed Decimal和Zoned Decimal)、字符型、日期时间型等,理解并熟练使用这些数据类型对于编写有效程序至关重要。 3. **运算符与控制流**:RPGLE提供了丰富...