当前位置:首页 » 编程语言 » sql迭代运算
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql迭代运算

发布时间: 2022-11-05 06:04:25

⑴ 大数据是什么,是怎么带动经济发展的

大数据的概念

概念:难以用常规的数据库工具获取、存储、管理、分析的数据集合。

特征:

1、数据量大:起始单位是PB级的。

1KB=1024B

1MB=1024KB

1GB=1024MB

1TB=1024GB

1PB=1024TB

1EB=1024PB

1ZB=1024EB

2、类型多:

结构化、板结构化、非结构化:网诺日志、音频、视频、图片、地理位置等信息混杂。

3、价值密度低:

获取数据的价值就像是淘金一般。

4、速度快时效高:

数据呈指数倍增长,时效性要求高,比如搜索引擎要求几分钟前的新闻能够被用户查询到,个性化推荐算法尽可能的完成实时推荐。

5、永远在线:

大数据时代的数据是永远在线的,随时应用计算,这也是区别于传统的数据的最大特征。

大数据从哪来

1、搜索引擎服务

网络数据量1000PB,每天响应138个国家数十亿次请求,每日新增10TB

2、电子商务

3、社交网络

QQ:8.5亿用户,用4400台服务器存储用户产生的信息,压缩后的数据100PB,每天新增200~300TB

4、音视频在线服务

5、个人数据业务

6、地理信息数据

7、传统企业

8、公共机构

智慧城市:摄像头拍摄的图片,1080P高清网络摄像机一月产生1.8TB数据,大点的城市50万个摄像头,一个月3PB的数据量。

医疗、中国的气象系统。

大数据的存储与计算模式

存储:

面临的问题:数据量大、类型复杂(结构化、非结构化、半结构化)

关键技术:

1、分布式文件系统(高效元数据管理技术、系统弹性扩展技术、存储层级内的优化、针对应用和负载的存储优化技术、针对存储器件的优化技术)

2、分布式数据库

事务性数据库技术:Nosql:(支持非关系数据库、具有多个节点分割和复制数据的能力、用最终一致性机制解决并发读操作与控制问题、充分利用分布式索引及内存提高性能)代表有:BigTable、HBase、MongoDB、Dynamo。

分析型的数据库技术:Hive 、Impala

3、大数据索引和查询技术

4、实时流式大数据存储与处理技术

计算:

面临的问题:数据结构特征、并行计算(以分布式文件为基础的Hadoop以分布式内存缓存为基础的Spark)、数据获取(批处理流处理)、数据处理类型(传统查询数据挖掘分析计算)、实时响应性能、迭代计算、数据关联性(先map一下再rece一下)。

关键技术:

1、大数据查询分析计算模式与技术:HBase、Hive、Cassandra、Impala

2、批处理计算:Hadoop MapRece、Spark

3、流式计算:Storm、Spark Steaming

4、图计算:Giraph、GraphX

5、内存计算:Spark、Hana(SAP公司全内存式分布式数据库系统)、Dremel

应用领域

1、智慧医疗(临床数据、公共卫生数据、移动医疗健康数据)(共享疾病案例,基因分类参考)

2、智慧农业(主要指依据商业需求进行农产品生产,降低菜残伤农概率)

3、金融行业:

精准的营销:根据可与习惯进行推销

风险管控:根据用户的交易流水实施反欺诈

决策支持:抵押贷款这一块,实施产业信贷的风险控制。

效率提升:加快内部数据处理。

产品设计:根据客户的投资行为设计满足客户需求的金融产品。

4、零售行业(对零售商来说:精准营销(降低营销成本,扩大营销额);对厂商:降低产品过剩)

5、电子商务行业

6、电子政务


希望对您有所帮助!~

⑵ 如何学习Spark大数据

大数据技术,只有相互分享才能彼此共同进步,为什么我们的程序员经常活跃在各大博客和技术论坛?其主要原因是:程序员们并不拒绝分享,甚至是乐于去贡献代码。身为一个程序员,特别值得他们骄傲的事情就是自己写的代码被别人用到而带来的成就感。
今天,为我们分享了当今火爆的大数据技术,讲解了spark技术的核心,我们可以不从事数据分析行业,但国家的一些技术还是要了解的。
Spark核心概念Resilient Distributed Dataset (RDD)弹性分布数据集
RDD是Spark的基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现。RDD是Spark特别核心的东西,它表示已被分区,不可变的并能够被并行操作的数据集合,不同的数据集格式对应不同的RDD实现。RDD必须是可序列化的。RDD可以cache到内存中,每次对RDD数据集的操作之后的结果,都可以存放到内存中,下一个操作可以直接从内存中输入,省去了MapRece大量的磁盘IO操作。这对于迭代运算比较常见的机器学习算法, 交互式数据挖掘来说,效率提升比较大。
RDD的特点:
1、它是在集群节点上的不可变的、已分区的集合对象。
2、用并行转换的方式来创建如(map, filter, join, etc)。
3、失败自动重建。
4、可以控制存储级别(内存、磁盘等)来进行重用。
5、必须是可序列化的。
5、是静态类型的。
RDD的好处:
1、RDD只能从持久存储或经过Transformations操作产生,相比于分布式共享内存(DSM)可以更高效实现容错,对于丢失部分数据分区只需根据它的lineage就可重新计算出来,而不需要做特定的Checkpoint。
2、RDD的不变性,可以实现类Hadoop MapRece的推测式执行。
3、RDD的数据分区特性,可以用数据的本地性来提高性能,这与Hadoop MapRece是一样的。
4、RDD都是可序列化的,在内存不足时可自动降级为磁盘存储,把RDD存储于磁盘上,这时性能会有大的下降但不会差于现在的MapRece。
RDD的存储与分区
1、用户可以选择不同的存储级别存储RDD以便重用。
2、当前RDD默认是存储于内存,但当内存不足时,RDD会spill到disk。
3、RDD在需要进行分区把数据分布于集群中时会根据每条记录Key进行分区(如Hash 分区),以此保证两个数据集在Join时能高效。
RDD的内部表示
在RDD的内部实现中每个RDD都可以使用5个方面的特性来表示:
1、分区列表(数据块列表)
2、计算每个分片的函数(根据父RDD计算出此RDD)
3、对父RDD的依赖列表
4、对key-value RDD的Partitioner【可选】
5、每个数据分片的预定义地址列表(如HDFS上的数据块的地址)【可选】
大数据是互联网发展的方向,大数据人才是未来的高薪贵族。随着大数据人才的供不应求,大数据人才的薪资待遇也在不断提升。

⑶ 数据库的表如果没有主键查询速度会慢吗

我们搭建一个 MySQL 5.7 的环境,此处省略搭建步骤。

写个简单的脚本,制造一批带主键和不带主键的表:

可以看到执行时间变成了 0.67s。

整理

我们诊断的关键点如下:

1. 对于 information_schema 中的元数据表,执行计划不能提供有效信息。

2. 通过查看 MySQL 改写后的 SQL,我们猜测了优化器发生了误判。

3. 我们增加了 hint,指导 MySQL 正确进行优化判断。

但目前我们的实验仅限于猜测,猜中了万事大吉,猜不中就无法做出好的诊断。

⑷ java用sql语句动态的往表里面添加字段,之后怎么能动态的读写新字段的数据

用SQL语句添加表字段:alter table 表名add 字段名 字段类型;
用select name from syscolumns where id=object_id(表名)查找出所有的表字段。然后再使用SELECT 查找到的字段 from 表名。
使用ResultSet动态读取数据库数据。ResultSet 是一个迭代模式的动态连接容器。迭代模式的容器遍历方式:

while(rs.next()){
//循环内容
}
rs.next()返回值是一个布尔值,表示迭代容器中是否还有下一条数据,即在迭代过程中是否已经到结尾。直到迭代集合中再无数据rs.next()返回false;

⑸ sql可以实现迭代吗

在 SQL Server Analysis Services 中,Microsoft 神经网络算法组合输入属性的每个可能状态和可预测属性的每个可能状态,并使用定型数据计算概率。之后,可以根据输入属性,将这些概率用于分类或回归,并预测被预测属性的结果。

⑹ 在VBA中如何将SQL得到的数据直接赋值到数组

EXCEL表的单元格区域是一个二维数组
dim arr
arr=Sheet3.Range("D7:D9")
'这时的arr得到的是二维数组
'你要转换成1维数组,先声明一个动态数组再重定义为1维数组
dim brr()
redim brr(1 to ubound(arr))
'再重新将二维转一维
for i = 1 to ubound(arr)
brr(i)=arr(i,1)
next
'如果你是要间隔写进去
for i = 1 to ubound(arr) step 2
brr(i)=arr(i,1)
next

⑺ 求大数据分析技术

目前,大数据领域每年都会涌现出大量新的技术,成为大数据获取、存储、处理分析或可视化的有效手段。大数据技术能够将大规模数据中隐藏的信息和知识挖掘出来,为人类社会经济活动提供依据,提高各个领域的运行效率,甚至整个社会经济的集约化程度。

01 大数据生命周期

⑻ 大数据都是需要什么技术的

大数据技术庞大复杂,基础的技术包含数据的采集、数据预处理、分布式存储、NoSQL数据库、数据仓库、机器学习、并行计算、可视化等范畴

查询引擎:Phoenix、Shark、Pig、Hive等

流式计算:storm、Twitter Rainbird等

迭代计算:Apache Hama、Apache Giraph、HaLoop等

离线计算:Hadoop MapRece、Berkeley Spark等

键值存储:LevelDB、RocksDB、HyperDex、Voldemort等

表格存储:OceanBase、Amazon SimpleDB、Cassandra、HBase等

文件存储:CouchDB、MongoDB、HDFS等

资源管理:Twitter Mesos、Hadoop Yarn

⑼ 大数据核心技术有哪些

大数据技术的体系庞大且复杂,基础的技术包含数据的采集、数据预处理、分布式存储、NoSQL数据库、数据仓库、机器学习、并行计算、可视化等各种技术范畴和不同的技术层面。首先给出一个通用化的大数据处理框架,主要分为下面几个方面:数据采集与预处理、数据存储、数据清洗、数据查询分析和数据可视化。

一、数据采集与预处理

对于各种来源的数据,包括移动互联网数据、社交网络的数据等,这些结构化和非结构化的海量数据是零散的,也就是所谓的数据孤岛,此时的这些数据并没有什么意义,数据采集就是将这些数据写入数据仓库中,把零散的数据整合在一起,对这些数据综合起来进行分析。数据采集包括文件日志的采集、数据库日志的采集、关系型数据库的接入和应用程序的接入等。在数据量比较小的时候,可以写个定时的脚本将日志写入存储系统,但随着数据量的增长,这些方法无法提供数据安全保障,并且运维困难,需要更强壮的解决方案。

Flume NG作为实时日志收集系统,支持在日志系统中定制各类数据发送方,用于收集数据,同时,对数据进行简单处理,并写到各种数据接收方(比如文本,HDFS,Hbase等)。Flume NG采用的是三层架构:Agent层,Collector层和Store层,每一层均可水平拓展。其中Agent包含Source,Channel和 Sink,source用来消费(收集)数据源到channel组件中,channel作为中间临时存储,保存所有source的组件信息,sink从channel中读取数据,读取成功之后会删除channel中的信息。

NDC,Netease Data Canal,直译为网易数据运河系统,是网易针对结构化数据库的数据实时迁移、同步和订阅的平台化解决方案。它整合了网易过去在数据传输领域的各种工具和经验,将单机数据库、分布式数据库、OLAP系统以及下游应用通过数据链路串在一起。除了保障高效的数据传输外,NDC的设计遵循了单元化和平台化的设计哲学。

Logstash是开源的服务器端数据处理管道,能够同时从多个来源采集数据、转换数据,然后将数据发送到您最喜欢的 “存储库” 中。一般常用的存储库是Elasticsearch。Logstash 支持各种输入选择,可以在同一时间从众多常用的数据来源捕捉事件,能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

Sqoop,用来将关系型数据库和Hadoop中的数据进行相互转移的工具,可以将一个关系型数据库(例如Mysql、Oracle)中的数据导入到Hadoop(例如HDFS、Hive、Hbase)中,也可以将Hadoop(例如HDFS、Hive、Hbase)中的数据导入到关系型数据库(例如Mysql、Oracle)中。Sqoop 启用了一个 MapRece 作业(极其容错的分布式并行计算)来执行任务。Sqoop 的另一大优势是其传输大量结构化或半结构化数据的过程是完全自动化的。

流式计算是行业研究的一个热点,流式计算对多个高吞吐量的数据源进行实时的清洗、聚合和分析,可以对存在于社交网站、新闻等的数据信息流进行快速的处理并反馈,目前大数据流分析工具有很多,比如开源的strom,spark streaming等。

Strom集群结构是有一个主节点(nimbus)和多个工作节点(supervisor)组成的主从结构,主节点通过配置静态指定或者在运行时动态选举,nimbus与supervisor都是Storm提供的后台守护进程,之间的通信是结合Zookeeper的状态变更通知和监控通知来处理。nimbus进程的主要职责是管理、协调和监控集群上运行的topology(包括topology的发布、任务指派、事件处理时重新指派任务等)。supervisor进程等待nimbus分配任务后生成并监控worker(jvm进程)执行任务。supervisor与worker运行在不同的jvm上,如果由supervisor启动的某个worker因为错误异常退出(或被kill掉),supervisor会尝试重新生成新的worker进程。

当使用上游模块的数据进行计算、统计、分析时,就可以使用消息系统,尤其是分布式消息系统。Kafka使用Scala进行编写,是一种分布式的、基于发布/订阅的消息系统。Kafka的设计理念之一就是同时提供离线处理和实时处理,以及将数据实时备份到另一个数据中心,Kafka可以有许多的生产者和消费者分享多个主题,将消息以topic为单位进行归纳;Kafka发布消息的程序称为procer,也叫生产者,预订topics并消费消息的程序称为consumer,也叫消费者;当Kafka以集群的方式运行时,可以由一个服务或者多个服务组成,每个服务叫做一个broker,运行过程中procer通过网络将消息发送到Kafka集群,集群向消费者提供消息。Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Procer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。Kafka可以和Flume一起工作,如果需要将流式数据从Kafka转移到hadoop,可以使用Flume代理agent,将Kafka当做一个来源source,这样可以从Kafka读取数据到Hadoop。

Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,提供数据同步服务。它的作用主要有配置管理、名字服务、分布式锁和集群管理。配置管理指的是在一个地方修改了配置,那么对这个地方的配置感兴趣的所有的都可以获得变更,省去了手动拷贝配置的繁琐,还很好的保证了数据的可靠和一致性,同时它可以通过名字来获取资源或者服务的地址等信息,可以监控集群中机器的变化,实现了类似于心跳机制的功能。

二、数据存储

Hadoop作为一个开源的框架,专为离线和大规模数据分析而设计,HDFS作为其核心的存储引擎,已被广泛用于数据存储。

HBase,是一个分布式的、面向列的开源数据库,可以认为是hdfs的封装,本质是数据存储、NoSQL数据库。HBase是一种Key/Value系统,部署在hdfs上,克服了hdfs在随机读写这个方面的缺点,与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

Phoenix,相当于一个Java中间件,帮助开发工程师能够像使用JDBC访问关系型数据库一样访问NoSQL数据库HBase。

Yarn是一种Hadoop资源管理器,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。Yarn由下面的几大组件构成:一个全局的资源管理器ResourceManager、ResourceManager的每个节点代理NodeManager、表示每个应用的Application以及每一个ApplicationMaster拥有多个Container在NodeManager上运行。

Mesos是一款开源的集群管理软件,支持Hadoop、ElasticSearch、Spark、Storm 和Kafka等应用架构。

Redis是一种速度非常快的非关系数据库,可以存储键与5种不同类型的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘中,使用复制特性来扩展性能,还可以使用客户端分片来扩展写性能。

Atlas是一个位于应用程序与MySQL之间的中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池。Atlas启动后会创建多个线程,其中一个为主线程,其余为工作线程。主线程负责监听所有的客户端连接请求,工作线程只监听主线程的命令请求。

Ku是围绕Hadoop生态圈建立的存储引擎,Ku拥有和Hadoop生态圈共同的设计理念,它运行在普通的服务器上、可分布式规模化部署、并且满足工业界的高可用要求。其设计理念为fast analytics on fast data。作为一个开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力。Ku不但提供了行级的插入、更新、删除API,同时也提供了接近Parquet性能的批量扫描操作。使用同一份存储,既可以进行随机读写,也可以满足数据分析的要求。Ku的应用场景很广泛,比如可以进行实时的数据分析,用于数据可能会存在变化的时序数据应用等。

在数据存储过程中,涉及到的数据表都是成千上百列,包含各种复杂的Query,推荐使用列式存储方法,比如parquent,ORC等对数据进行压缩。Parquet 可以支持灵活的压缩选项,显着减少磁盘上的存储。

三、数据清洗

MapRece作为Hadoop的查询引擎,用于大规模数据集的并行计算,”Map(映射)”和”Rece(归约)”,是它的主要思想。它极大的方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统中。

随着业务数据量的增多,需要进行训练和清洗的数据会变得越来越复杂,这个时候就需要任务调度系统,比如oozie或者azkaban,对关键任务进行调度和监控。

Oozie是用于Hadoop平台的一种工作流调度引擎,提供了RESTful API接口来接受用户的提交请求(提交工作流作业),当提交了workflow后,由工作流引擎负责workflow的执行以及状态的转换。用户在HDFS上部署好作业(MR作业),然后向Oozie提交Workflow,Oozie以异步方式将作业(MR作业)提交给Hadoop。这也是为什么当调用Oozie 的RESTful接口提交作业之后能立即返回一个JobId的原因,用户程序不必等待作业执行完成(因为有些大作业可能会执行很久(几个小时甚至几天))。Oozie在后台以异步方式,再将workflow对应的Action提交给hadoop执行。

Azkaban也是一种工作流的控制引擎,可以用来解决有多个hadoop或者spark等离线计算任务之间的依赖关系问题。azkaban主要是由三部分构成:Relational Database,Azkaban Web Server和Azkaban Executor Server。azkaban将大多数的状态信息都保存在MySQL中,Azkaban Web Server提供了Web UI,是azkaban主要的管理者,包括project的管理、认证、调度以及对工作流执行过程中的监控等;Azkaban Executor Server用来调度工作流和任务,记录工作流或者任务的日志。

流计算任务的处理平台Sloth,是网易首个自研流计算平台,旨在解决公司内各产品日益增长的流计算需求。作为一个计算服务平台,其特点是易用、实时、可靠,为用户节省技术方面(开发、运维)的投入,帮助用户专注于解决产品本身的流计算需求。

四、数据查询分析

Hive的核心工作就是把SQL语句翻译成MR程序,可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive SQL)查询功能。Hive本身不存储和计算数据,它完全依赖于HDFS和MapRece。可以将Hive理解为一个客户端工具,将SQL操作转换为相应的MapRece jobs,然后在hadoop上面运行。Hive支持标准的SQL语法,免去了用户编写MapRece程序的过程,它的出现可以让那些精通SQL技能、但是不熟悉MapRece 、编程能力较弱与不擅长Java语言的用户能够在HDFS大规模数据集上很方便地利用SQL 语言查询、汇总、分析数据。

Hive是为大数据批量处理而生的,Hive的出现解决了传统的关系型数据库(MySql、Oracle)在大数据处理上的瓶颈 。Hive 将执行计划分成map->shuffle->rece->map->shuffle->rece…的模型。如果一个Query会被编译成多轮MapRece,则会有更多的写中间结果。由于MapRece执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。在Hive的运行过程中,用户只需要创建表,导入数据,编写SQL分析语句即可。剩下的过程由Hive框架自动的完成。

Impala是对Hive的一个补充,可以实现高效的SQL查询。使用Impala来实现SQL on Hadoop,用来进行大数据实时查询分析。通过熟悉的传统关系型数据库的SQL风格来操作大数据,同时数据也是可以存储到HDFS和HBase中的。Impala没有再使用缓慢的Hive+MapRece批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。Impala将整个查询分成一执行计划树,而不是一连串的MapRece任务,相比Hive没了MapRece启动时间。

Hive 适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询,Impala给数据人员提供了快速实验,验证想法的大数据分析工具,可以先使用Hive进行数据转换处理,之后使用Impala在Hive处理好后的数据集上进行快速的数据分析。总的来说:Impala把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的map->rece模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。但是Impala不支持UDF,能处理的问题有一定的限制。

Spark拥有Hadoop MapRece所具有的特点,它将Job中间输出结果保存在内存中,从而不需要读取HDFS。Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。

Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具,包括全文搜索和Web爬虫。

Solr用Java编写、运行在Servlet容器(如Apache Tomcat或Jetty)的一个独立的企业级搜索应用的全文搜索服务器。它对外提供类似于Web-service的API接口,用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Elasticsearch是一个开源的全文搜索引擎,基于Lucene的搜索服务器,可以快速的储存、搜索和分析海量的数据。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

还涉及到一些机器学习语言,比如,Mahout主要目标是创建一些可伸缩的机器学习算法,供开发人员在Apache的许可下免费使用;深度学习框架Caffe以及使用数据流图进行数值计算的开源软件库TensorFlow等,常用的机器学习算法比如,贝叶斯、逻辑回归、决策树、神经网络、协同过滤等。

五、数据可视化

对接一些BI平台,将分析得到的数据进行可视化,用于指导决策服务。主流的BI平台比如,国外的敏捷BI Tableau、Qlikview、PowrerBI等,国内的SmallBI和新兴的网易有数(可点击这里免费试用)等。

在上面的每一个阶段,保障数据的安全是不可忽视的问题。

基于网络身份认证的协议Kerberos,用来在非安全网络中,对个人通信以安全的手段进行身份认证,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。

控制权限的ranger是一个Hadoop集群权限框架,提供操作、监控、管理复杂的数据权限,它提供一个集中的管理机制,管理基于yarn的Hadoop生态圈的所有数据权限。可以对Hadoop生态的组件如Hive,Hbase进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问HDFS文件夹、HDFS文件、数据库、表、字段权限。这些策略可以为不同的用户和组来设置,同时权限可与hadoop无缝对接。

⑽ SqlDataReader怎么用来显示数据!!--asp.net

Lesson 04: Reading Data with the SqlDataReader

使用SqlDataReader读取数据

This lesson explains how to read data with a SqlDataReader object. Here are the objectives of this lesson:

本课解释了如何使用SqlDataReader对象读取数据。以下是本课的目标:

Learn what a SqlDataReader is used for.
Know how to read data using a SqlDataReader.
Understand the need to close a SqlDataReader.
学习SqlDataReader的用法
了解如何使用SqlDataReader读取数据
了解如何关闭SqlDataReader的必要性
Introction

介绍

A SqlDataReader is a type that is good for reading data in the most efficient manner possible. You can *not* use it for writing data. SqlDataReaders are often described as fast-forward firehose-like streams of data.

SqlDataReader是对于大多数有效的情况下读取数据的好的方式。你不能使用它来写入数据。SqlDataReaders通常作为快速的只向前读的数据流。

You can read from SqlDataReader objects in a forward-only sequential manner. Once you've read some data, you must save it because you will not be able to go back and read it again.

你能够以只向前的顺序方式从SqlDataReader对象中进行读取。只要你已经读取了某些数据,你必须保存它们,因为你将不能够返回并再一次读取它。

The forward only design of the SqlDataReader is what enables it to be fast. It doesn't have overhead associated with traversing the data or writing it back to the data source. Therefore, if your only requirement for a group of data is for reading one time and you want the fastest method possible, the SqlDataReader is the best choice. Also, if the amount of data you need to read is larger than what you would prefer to hold in memory beyond a single call, then the streaming behavior of the SqlDataReader would be a good choice.

SqlDataReader的只向前读的设计使它很迅速。它并没有遍历数据或者将数据重新写回给数据源的负担。因此,如果你一次只需要读一组数据,并且希望最快速的方法,SqlDataReader则是最好的选择。同样,如果一个单独调用所需要读取的数据量大于内存的存放能力,SqlDataReader的数据流形式应该是一个好的选择。

Note: Observe that I used the term "one time" in the previous paragraph when discussing the reasons why you would use a SqlDataReader. As with anything, there are exceptions. In many cases, it is more efficient to use a cached DataSet. While caching is outside the scope of this tutorial, we will discuss using DataSet objects in the next lesson.

注意:当讨论为什么应该使用SalDataReader的时候,我在上一段中使用的术语“一次”。任何事情,都有异常发生。在一些情况下,更有效的是使用缓存DataSet。因为缓存超出了本指南的范畴,我们将在下一节课“使用DataSet对象”中讨论它。

Creating a SqlDataReader Object

创建SqlDataReader对象

Getting an instance of a SqlDataReader is a little different than the way you instantiate other ADO.NET objects. You must call ExecuteReader on a command object, like this:

得到SqlDataReader对象于实例化其它ADO.NET对象稍微有些不同。你必须对一个command对象调用ExecuteReaer方法,比如这样:

SqlDataReader rdr = cmd.ExecuteReader();

The ExecuteReader method of the SqlCommand object, cmd , returns a SqlDataReader instance. Creating a SqlDataReader with the new operator doesn't do anything for you. As you learned in previous lessons, the SqlCommand object references the connection and the SQL statement necessary for the SqlDataReader to obtain data.

SqlCommand对象cmd的ExecuteReader方法返回一个SqlDataReader实例。使用new关键字创建一个SqlDataReader并不做任何事情。前面的课程已经学到,SqlCommand对象引用connection和SQL语句对于SqlDataReader读取数据是必需的。

Reading Data

读取数据

Previous lessons contained code that used a SqlDataReader, but the discussion was delayed so we could focus on the specific subject of that particular lesson. This lesson builds from what you've seen and explains how to use the SqlDataReader.

前面的课程包含了使用SqlDataReader的代码,但是关于前面课程中的细节的讨论我们推迟了。这节课建立自你所见到的并解释如何使用SqlDataReader。

As explained earlier, the SqlDataReader returns data via a sequential stream. To read this data, you must pull data from a table row-by-row. Once a row has been read, the previous row is no longer available. To read that row again, you would have to create a new instance of the SqlDataReader and read through the data stream again.

前面已经解释了,SqlDataReader通过顺序数据流返回数据。为了读取这些数据,你必须从一个表中一行一行的取出数据。只要一行被读取,之前的数据就不再有效。为了再次读取那行,你应该创建一个新的SqlDataReader实例并且再次从数据流中读取它。

The typical method of reading from the data stream returned by the SqlDataReader is to iterate through each row with a while loop. The following code shows how to accomplish this:

从SqlDataReader中读取返回的数据流的典型方法是通过while循环迭代没一行。下面的代码显示了如何完成:

while (rdr.Read())

{

// get the results of each column

string contact = (string)rdr["ContactName"];

string company = (string)rdr["CompanyName"];

string city = (string)rdr["City"];

// print out the results

Console.Write("{0,-25}", contact);

Console.Write("{0,-20}", city);

Console.Write("{0,-25}", company);

Console.WriteLine();

}

Notice the call to Read on the SqlDataReader, rdr, in the while loop condition in the code above. The return value of Read is type bool and returns true as long as there are more records to read. After the last record in the data stream has been read, Read returns false.

注意在上面代码中的while循环对SqlDataReader对象rdr调用的Read方法。Read方法的返回值为bool,并且只要有记录读取就返回真。在数据流中所有的最后一条记录被读取了,Read方法就返回false。

In previous lessons, we extracted the first column from the row by using the SqlDataReader indexer, i.e. rdr[0]. You can extract each column of the row with a numeric indexer like this, but it isn't very readable. The example above uses a string indexer, where the string is the column name from the SQL query (the table column name if you used an asterisk, *. String indexers are much more readable, making the code easier to maintain.

在前面的课程中,我们使用SqlDataReader的索引器,比如rdr[0],提取行中的第一列。你能够使用诸如这样的数值索引器提取行中的列,但是它并不具有很好的可读性。上面的例子使用了字符串索引器,这里的字符串是从SQL查询语句中得到的列名(表的列名如果你使用一个星号,*.字符串下标具有更好的可读性,使得代码能够更好的维护。

Regardless of the type of the indexer parameter, a SqlDataReader indexer will return type object. This is why the example above casts results to a string. Once the values are extracted, you can do whatever you want with them, such as printing them to output with Console type methods.

无论索引器参数是什么类型,一个SqlDataReader索引器将返回object类型。这就是为什么上面要将结果转换为string的原因。只要值被提取,你能够对它们为所欲为,比如使用Console类型的方法将它们打印到输出。

Finishing Up

完结

Always remember to close your SqlDataReader, just like you need to close the SqlConnection. Wrap the data access code in a try block and put the close operation in the finally block, like this:

一定要记住关闭SqlDataReader,就像关闭SqlConnection一样。将数据存取代码用try语句块包围起来,并把关闭操作放到finally语句块中,就像这样:

try

{

// data access code

}

finally

{

// 3. close the reader

if (rdr != null)

{

rdr.Close();

}

// close the connection too

}

The code above checks the SqlDataReader to make sure it isn't null. After the code knows that a good instance of the SqlDataReader exists, it can close it. Listing 1 shows the code for the previous sections in its entirety.

上面的代码检测SqlDataReader,确保它不为空。在代码知道SqlDataReader的一个完好的实例存在,它就能够关闭它。Listing1完整的显示了前面各节的代码。

Listing 1: Using the SqlDataReader

using System;

using System.Data;

using System.Data.SqlClient;

namespace Lesson04

{

class ReaderDemo

{

static void Main()

{

ReaderDemo rd = new ReaderDemo();

rd.SimpleRead();

}

public void SimpleRead()

{

// declare the SqlDataReader, which is used in

// both the try block and the finally block

SqlDataReader rdr = null;

// create a connection object

SqlConnection conn = new SqlConnection(

"Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");

// create a command object

SqlCommand cmd = new SqlCommand(

"select * from Customers", conn);

try

{

// open the connection

conn.Open();

// 1. get an instance of the SqlDataReader

rdr = cmd.ExecuteReader();

// print a set of column headers

Console.WriteLine(

"Contact Name City Company Name");

Console.WriteLine(

"------------ ------------ ------------");

// 2. print necessary columns of each record

while (rdr.Read())

{

// get the results of each column

string contact = (string)rdr["ContactName"];

string company = (string)rdr["CompanyName"];

string city = (string)rdr["City"];

// print out the results

Console.Write("{0,-25}", contact);

Console.Write("{0,-20}", city);

Console.Write("{0,-25}", company);

Console.WriteLine();

}

}

finally

{

// 3. close the reader

if (rdr != null)

{

rdr.Close();

}

// close the connection

if (conn != null)

{

conn.Close();

}

}

}

}

}

Summary

总结

SqlDataReader objects allow you to read data in a fast forward-only manner. You obtain data by reading each row from the data stream. Call the Close method of the SqlDataReader to ensure there are not any resource leaks.

SqlDataReader对象允许你以一种快速的只向前的方式读取数据。你从数据流中读取每一行来读取数据。调用SqlDataReader的Close方法保证资源泄漏不会发生。

I hope you enjoyed this lesson. The next one in this series is Lesson 05: Working with Disconnected Data - The DataSet and SqlDataAdapter.

For further questions, you are welcome to participate in the C# Station Discussion Forums.

Your feedback is very important and I appreciate any constructive contributions you have. Please feel free to contact me for feedback or comments you may have about this lesson.