首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Hadoop MapReduce概念学习系列之mr程序组件全貌(二十)

其实啊,spilt是,控制Apache Hadoop Mapreduce的map并发任务数,详细见http://www.cnblogs.com/zlslch/p/5713652.html map,是mapper代码 reduce,是reducer代码 缓存,分组,排序,转发, 最重要的是,mr程序的组件InputFormat和OutputFormat啊!(重要的话,说三遍) 最重要的是,mr程序的组件InputFormat和OutputFormat啊! 最重要的是,mr程序的组件InputFormat和OutputFormat啊! 我们知道,在大数据里,数据源是非常之广,比如,hdfs(默认,而且还是TextInputFormat),数据库,文件,ftp,网页,网络端口..... 那么,对于用户来说,不需要具体去管,特推出mr程序的组件-------InputFormat 往数据库、HBase、ftp、hdfs(默认是往hdfs写,而且还是TextOutputFormat),文件,,,用户不用管,特推出mr程序的组件------OutputFormat But,在生产环境,可是最重要的是具体业务... 注意: 比如,对于图片,视频,,,这些,InputFormat,就不能了。 可以看到,DBInputFormat是去数据库里读, 可以看到,DBOutputFormat是往数据库里写。 其它更深以后会补上。。。。。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5713872.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 51)——扩展构造函数

扩展类型的时候,也可以添加新的构造函数。值类型与引用类型扩展有所区别。值类型包括了除类以外的其他类型,主要是枚举类型和结构体类型。 值类型扩展构造函数 扩展结构体类型中定义构造函数的示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 structRectangle{ varwidth:Double varheight:Double init(width:Double,height:Double){ self.width=width self.height=height } } extensionRectangle{ //定义了Rectangle的扩展类型 init(length:Double){ self.init(width:length,height:length) } } varrect=Rectangle(width: 320.0 ,height: 480.0 ) //调用两个参数的构造函数,这个构造函数是原始类型提供,Rectangle类型已经是扩展类型 print( "长方形:\(rect.width)x\(rect.height)" ) varsquare=Rectangle(length: 500.0 ) //调用一个参数的构造函数,这个构造函数是扩展类型提供的 print( "正方形:\(square.width)x\(square.height)" ) self.init是调用了原始类型的两个参数的构造函数。 引用类型扩展构造函数 扩展类中定义构造函数的示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Person{ varname:String varage:Int funcdescription()->String{ return "\(name)年龄是:\(age)" } init(name:String,age:Int){ self.name=name self.age=age } } extensionPerson{ //定义Person类的扩展类型 convenienceinit(name:String){ //便利构造函数 self.init(name:name,age: 8 ) } } letp1=Person(name: "Mary" ) //调用两个参数的构造函数,这个构造函数是原始类型提供,这时候的Person类型已经是扩展类型。 print( "Person1:\(p1.description())" ) letp2=Person(name: "Tony" ,age: 28 ) //调用一个参数的构造函数创建Person实例,这个构造函数是扩展类型提供的。 print( "Person2:\(p2.description())" ) 代码self.init(name :name, age : 8)调用指定构造函数代理部分构造任务。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1748298,如需转载请自行联系原作者

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 23)——尾随闭包

闭包表达式可以作为函数的参数传递,如果闭包表达式很长,就会影响程序的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。 下面我们来看一个示例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 funccalculate(opr:String,funN:(Int,Int)->Int){ //最后一个参数funN是(Int,Int)->Int函数类型,funN可以接收闭包表达式 switch (opr){ case "+" : print( "10+5=\(funN(10,5))" ) default : print( "10-5=\(funN(10,5))" ) } } calculate( "+" ,funN:{(a:Int,b:Int)->Intin return a+b}) //调用 calculate( "+" ){(a:Int,b:Int)->Intin return a+b} //调用,这种形式就是尾随闭包 calculate( "+" ){$ 0 +$ 1 } //调用,这种形式就是尾随闭包 需要注意的是,闭包必须是参数列表的最后一个参数,如果calculate函数采用如下形式定义: func calculate(funN:(Int,Int)->Int,opr:String) { ... } 由于闭包表达式不是最后一个参数,那么调用calculate函数就不能使用尾随闭包写法的。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1746417,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发学习:向模拟器的sdcard中添加文件

向模拟器的sdcard中添加文件有两种方法: 1.在eclipse的DDMS视图中操作 启动eclipse---打开DDMS视图---选择File Explorer,出现下面的窗口 选中sdcard文件夹---点击,选择你需要添加的文件就可以了 2.运用adb命令操作 先将要添加的文件放到platform-tools(我的platform-tools路径 D:\Android\android-sdk-windows\platform-tools)文件夹下,之后在命令行窗口进入 D:\Android\android-sdk-windows\platform-tools,输入adb命令添加文件,如下图所示: 这时,文件music.mp3就被添加到sdcard/Android目录下面 之后可以在模拟器中打开dev tools,运行Media Scanner,在音乐中播放添加的音乐 还可以在命令行运行adb shell来查看sdcard中的文件,如下图所示: 向模拟器的sdcard中添加文件常见的错误: 1.Failed to push items null 解决的方法:首先重启eclipse,如果重启之后再出现这个问题,那就要修改超时数,依次展开eclipse---windwos---Preferences---Android---DDMS---ADB connection time out (ms),将参数改得大一些,如下图所示: 2.Failed to push selection: Invalid argument 原因:android不支持中文名称的文件 3.Failed to push XXXXX.txt(添加的文件) on emulator- : Read-only file system 解决的方法:在启动模拟器的时候带着的参数中,模拟器镜像路径需是绝对路径:-sdcard E:\android\android-sdk-windows\tools\sdcard.img注意这个绝对路径里面不能带空格(如Program Files)注意:(卷标、标签)必须是sdcard。如mksdcard -l sdcard128Me:\haogood.image(而不能是mksdcard -l haogood128Me:\haogood.image) 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/673776

优秀的个人博客,低调大师

Hadoop MapReduce概念学习系列之新旧 MapReduce API 比较(四)

从 0.20.0 版本开始,Hadoop 同时提供了新旧两套 MapReduce API。新 API 在旧 API 基础上进行了封装,使得其在扩展性和易用性方面更好。新旧版 MapReduce API 的主要区 别如下。 (1)存放位置 旧版 API 放在 org.apache.hadoop.mapred 包中,而新版 API 则放在 org.apache.hadoop. mapreduce 包及其子包中。 (2)接口变为抽象类 接口通常作为一种严格的“协议约束”。它只有方法声明而没有方法实现,且要求所有实 现类(不包括抽象类)必须实现接口中的每一个方法。接口的最大优点是允许一个类实现多 个接口,进而实现类似 C++ 中的“多重继承”。抽象类则是一种较宽松的“约束协议”,它可 为某些方法提供默认实现。而继承类则可选择是否重新实现这些方法。正是因为这一点,抽 象类在类衍化方面更有优势,也就是说,抽象类具有良好的向后兼容性,当需要为抽象类添 加新的方法时,只要新添加的方法提供了默认实现,用户之前的代码就不必修改了。 考虑到抽象类在API衍化方面的优势,新API在InputFormat、OutputFormat、Mapper、Reducer和Partitioner由接口变成抽象类。 (3)上下文封装 新版 API 将变量和函数封装成各种上下文(Context)类,使得 API 具有更好的易用性 和扩展性。首先,函数参数列表经封装后变短,使得函数更容易使用 ;其次,当需要修改 或添加某些变量或函数时,只需修改封装后的上下文类即可,用户代码无须修改,这样保 证了向后兼容性,具有良好的扩展性。 上图展示了新版API中树形的Context 类继承关系。这些Context 各自封装了一种实体的基本信息及对应的操作(setter和getter 函数),如JobContext、TaskAttemptContext 分 别封装了Job和Task的基本信息,TaskInputOutputContext 封装了Task的各种输入输出操作,MapContext 和ReduceContext分别封装了Mapper和Reducer对外的公共接口。 除了以上三点不同之外,新旧API 在很多其他细节方面也存在小的差别。由于新版和旧版API 在类层次结构、编程接口名称及对应的参数列表等方面存在较大差别,所以两种 API 不能兼容。但考虑到应用程序的向后兼容性,短时间内不会将旧API从MapReduce 中去掉。即使在完全采用新 API 的0.21.0/0.22.X 版本系列中,也仅仅将旧 API 标注为过期(deprecated),用户仍然可以使用。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5058689.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop概念学习系列之Hadoop的文件系统(十六)

Hadoop整合了众多文件系统,它首先提供了一个高层的文件系统抽象类org.apache.hadoop.fs.FileSystem,这个抽象类展示了一个分布式文件系统,并有几个具体实现。 如下表所示。 Hadovp提供了许多文件系统的接口,用户可使用URI方案选取合适的文件系统来实现交互。比如,可以使用文件系统命令行接口来进行Hadoop文件系统的操作。如果想列出本地文件系统的目录,那么执行以下shell命令即可: hadoop fs -lsfile:/// (1)接口 Hadoop是使用Java编写的,而Hadoop中不同文件系统之间的交互是由Java API进行调解的。事实上,前面使用的文件系统的shell就是一个Java应用,它使用Java文件系统类来提供文件系统操作。即使其他文件系统比如FTP, S3都有自己的访问工具,这些接口在HDFS中还是被广泛使用,主要用来进行Hadoop文件系统之间的协作。 (2)Thrift 上面提到可以通过Java API与Hadoop的文件系统进行交互,而对于其他非Java应用访问Hadaop文件系统则比较麻烦。Thriftfs分类单元中的Thrift API可通过将Hadaop文件系统展示为一个Apache Thrift服务来填补这个不足,让任何有Thrift绑定的语言都能轻松地与Hadoop文件系统进行交互。Thrift是由Facebook公司开发的一种可伸缩的跨语言服务的发展软件框架。Thrift解决了各系统间大数据量的传输通信,以及系统之间因语言环境不同而需要跨平台的问题。在多种不同的语言之间通信时,Thrift可以作为二进制的高性能的通信中间件,它支持数据(对象)序列化和多种类型 的RPC服务。 下面来看如何使用Thrift API。要使用Thrift API,首先要运行提供Thrill服务的Java服务器,并以代理的方式访问Hadoop文件系统。Thrill API包含很多其他语言生成的stub,包括C++、Perl、PHP、 Python等。Thrift支持不同的版本,因此可以从同一个客户代码中访问不同版本的Hadoop文件系统,但要运行针对不同版本的代理。 (3)C语言库 Hadoop提供了映射Java文件系统接口的C语言库—libhdfs。libhdfs可以编写为一个访问HDFS的C语言库,实际上,它可以访问任意的Haduap文件系统,它也可以使用JNI(Java Native Interface)来调用Java文件系统的客户端。 这里的C语言的接口和Java的使用非常相似,只是稍滞后于Java,目前还不支持一些新特性。相关资料可参见libhdfs/docs/api目录中关丁Hadoop分布的C API文档。 (4) FUSE FUSE(Filesystem in Userspace)允许将文件系统整合为一个Unix文件系统并在用户空间中执行。通过使用Hadoop Fuse-DFS的contirb模块来支持任意的Hadoop文件系统作为一个标准的文件系统挂载,便可以使用Unix的工具(像1s, cat)和文件系统进行交互,还可以通过任意一种编程语言使用POSIX库来访问文件系统。 Fuse-DFS是用C语言实现的,可使用libhdfs作为与HDFS的接口,关于如何编译和运行Fuse-DFS,可以参见src/contrib../fuse-dfs中的相关文档。 (5) WebDAV WebDAV是一系列支持编辑和更新文件的HTTP的扩展,在大部分操作系统中,WeDAV共享都可以作为文件系统进行挂载,因此,可通过WebDAV来对外提供HDFS或其他Nadoop文件系统,可以将HDFS作为一个标淮的文件系统进行访问。 (6)其他HDFS接口 HDFS接口还提供了以下其他两种特定的接口。 HTTP。 HDFS定义了一个只读接口,用来在HTTP上检索目录列表和数据。NameNode的嵌入式Web服务器运行在50070端口上,以XML格式提供服务,文件数据由DataNode通过它们的Web服务器50075端日向NameNode提供。这个协议并不拘泥于某个HDFS版本,所以用户可以自己编写使用HTTP从运行不同版本的Hadoop的NDFS中读取数据。HftpFileSystem就是其中的一种实现,它是一个通过HTTP和HDFS交流的Hadoop文件系统,是HTTPS的变体。 FTP。Hadoop接口中还有一个HDFS的FTP接口,它允许使用FTP协议和HDFS交互,即使用FTP客户端和HDFS进行交互。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5089369.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop HDFS概念学习系列之HDFS源代码结构(十四)

了解了HDFS体系结构中的名字节点、数据节点和客户端以后,我们来分析HDFS实现的源代码结构。HDFS源代码都在org.apache.hadoop.hdfs包下,其结构如图6-3所示。 HDFS的源代码分布在I6个目录下,它们可以分为如下四类1.基础包 包括工具和安全包。其中,hdfs.util包含了一些HDFS实现需要的辅助数据结构:hdfs.security.token.hlock和hdfs.security.token.delegation结合Hadaop的安全框架,提供了安全访问HDFS的机制。该安全特性最先是由Yahoo开发的,集成了企业广泛应用的Kerberos标准,使得用户可以在一个集群管理各类商业敏感数据。 2.HDFS实体实现包 这是代码分析的重点,包含7个包: hdfs.server.common包含了一些名字节点和数据节点共享的功能,如系统升级、存储空间信息等。hdfs.protocol包提供了HDFS各个实体间通过IPC交互的接口。hdfs.server.datanode和hdfs分别包含了名字节点、数据节点和客户端的实现。上述代码是HDFS代码分析的重点。hdfs.server.namennde.metrics包和hdfs.server.datanode.metrics包实现了名字节点和数据节点上度量数据的收集功能。度量数据包括名字节点进程和数据节点进程上事件的计数,例如数据节点上就可以收集到写入字节数、被复制的块的数量等信息。 3.应用包 包括hdfs.tools包和hdfs.server.balancer包,这两个包提供查询HDFS状态信息工具dfsadmin、文件系统检查工具fsck和HDFS均衡器balancer(通过start-balancer. sh启动)的实现。 4. WebHDFS相关包 包括hdfs.web.resources包,hdfs.server.namenode.web.resourees包,hdfs.server.datanode.web.resources包和hdfs.web包共4个包。 WebHDFS是HDFS 1.0中引入的新功能,它提供了一个完整的、通过HTTP访问HDFS的机制。对比只读的hftp文件系统,WebHDFS提供了HTTP上读写HDFS的能力,并在此基础上实现了访问 HDFS的C客户端和用户空间文件系统〔FUSE)。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5089745.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop概念学习系列之重温Hadoop基本知识(十一)

Hadoop是一个由Apache基金会开发的分布式编程框架,允许在集群服务器上使用简单的编程模型(MapReduce)对大数据集进行分布式处理。 Hadoop框架的核心的是HDFS、MapReduce和Yarn。 其中HDFS提供海量数据的存储, MapReduce提供数据计算, Yarn是集群资源管理和调度平台。 掌握了这三部分,也就掌握了Hadoop最核心的东西。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5080008.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark SQL概念学习系列之如何使用 Spark SQL(六)

al sqlContext = new org.apache.spark.sql.SQLContext(sc) // 在这里引入 sqlContext 下所有的方法就可以直接用 sql 方法进行查询 import sqlContext._ case class Person(name: String, age: Int) // 下面的 people 是含有 case 类型数据的 RDD,会默认由 Scala 的 implicit 机制将 RDD 转换为 SchemaRDD, SchemaRDD 是 SparkSQL 中的核心 RDD val people = sc.textFile("examples/src/main/resources/people.txt").map(_. split(",")).map(p => Person(p(0), p(1).trim.toInt)) // 在内存的元数据中注册表信息,这样一个 Spark SQL 表就创建完成了 people.registerAsTable("people") // sql 语句就会触发上面分析的 Spark SQL 的执行过程,读者可以参考上面的图示 val teenagers = sql("SELECT name FROM people WHERE age >= 13 AND age <= 19") // 最后生成 teenagers 也是一个 RDD teenagers.map(t =>"Name: " + t(0)).collect().foreach(println) 通过之前的介绍,读者对支撑结构化数据分析任务的 Spark SQL 的原理与使用有了一定的了解。在生产环境中,有一类数据分析任务对响应延迟要求高,需要实时处理流数据,在 BDAS 中, Spark Streaming 用于支撑大规模流式处理分析任务。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5725106.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop HDFS概念学习系列之HDFS Master/Slave架构(十)

相比于基于P2P模型的分布式文件系统架构,HDFS采用的是基于Master/Slave主从架构的分布式文件系统,一个HDFS集群包含一个单独的Master节点和多个Slave节点服务器,这里的一个单独的Master节点的含义是HDFS系统中只存在一个逻辑上的Master组件。一个逻辑的Master节点可以包括两台物理主机,即两台Master服务器、多台Slave服务器。一台Master服务器组成单NameNode集群,两台Master服务器组成双NameNode集群,并且同时被多个客户端访问.所有的这此机器通常都是普通的Linux机器,运行着用户级别(user-level)的服务进程。HDFS架构设计图如下: 上图展示了HDFS的NameNode、 DataNode以及客户端之间的存取访问关系,单一节点的NameNode大大简化了系统架构。NameNode负责保存和管理所有的HDFS元数据,因而用户数据就不需要通过NameNode,也就是说文件数据的读写是直接在DataNode上进行的。HDFS存储的文件都被分割成固定大小的Block,在创建Block的时候,NameNode服务器会给每个Block分配一个唯一不变的Block标识。DataNode服务器把Block以Linux文件的形式保存在本地硬盘上,并且根据指定的Block标识和字节范围来读写块数据。出于可靠性的考虑,每个块都会复制到多个DataNode服务器上。在默认情况下,HDFS使用三个冗余备份,当然用户可以为不同的文件命名空间设定不同的复制因子数。NameNode管理所有的文件系统元数据。这些元数据包括名称空间、访问控制信息、文件和Block的映射信息,以及当前Block的位置信息。NameNode还管理着系统范围内的活动,比如,Block租用管理、孤立Block的I回收,以及Block 在 DataNode服务器之间的迁移。NameNode使信息周期性地和每个DataNode服务器通信,发送指令到各个DataNode服务器并接收DataNode中Block的状态信息。 HDFS客户端代码以库的形式被链接到客户程序中。在客户端代码中需要实现HDFS文件系统的API 接口函数,应用程序与NameNode和DataNode服务器通信,以及对数据进行读写操作。客户端和NameNode的通信只获取元数据,所有的数据操作都是由客户端直接和DataNode服务器进行交互的。HDFS不提供POSIX标准的API功能,因此,HDFS API调用不需要深入到Linux vnode级别。无论是客户端还是DataNode服务器都不需要缓存文件数据。客户端缓存数据几乎没有什么用处,因为大部分程序要么以流的方式读取一个巨大的文件,要么工作集太大根本无法被缓存。因此,无须考虑与缓存相关的问题,同时也简化了客户端及整个系统的设计和实现。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5081550.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 41)——类的继承

Swift中的继承只能发生在类上,不能发生在枚举和结构体上。一个类可以继承另一个类的方法、属性、下标等特征,当一个类继承其他类时,继承类叫子类,被继承类叫父类(或超类)。子类继承父类后,可以重写父类的方法、属性、下标等特征。 为了了解继承性,看这样一个场景:一位面向对象的程序员小赵,在编程过程中需要描述和处理个人信息,于是他定义了类Person,如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 class Person{ varname:String varage:Int funcdescription()->String{ return "\(name)年龄是:\(age)" } init(){ name= "" age= 1 } } 一周以后,小赵又遇到了新的需求,需要描述和处理学生信息,于是他又定义了一个新的类Student,如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Student{ varname:String varage:Int varschool:String funcdescription()->String{ return "\(name)年龄是:\(age)" } init(){ school= "" name= "" age= 8 } } 很多人会认为小赵的做法能够理解并相信这是可行的,但是问题在于Student和Person两个类的结构太接近了,后者只比前者多了一个属性school,却要重复定义其他所有的内容,实在让人“不甘心”。Swift提供了解决类似问题的机制,那就是类的继承,代码如下所示: 1 2 3 4 5 6 7 8 class Student:Person{ varschool:String overrideinit(){ school= "" super .init() age= 8 } } Student类继承了Person类中的所有特征,“:”之后的Person类是父类。Swift中的类可以没有父类,例如Person类,定义的时候后面没有“:”,这种没有父类的就是基类。 此外override init()是子类重写父类构造函数。 一般情况下,一个子类只能继承一个父类,这称为单继承,但有的情况下一个子类可以有多个不同的父类,这称为多重继承。在Swift中,类的继承只能是单继承。多重继承可以通过遵从多个协议实现。也就是说,在Swift中,一个类只能继承一个父类,但是可以遵循多个协议。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1747494,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop Hive概念学习系列之hive里的视图(十二)

可以先,从MySQL里的视图概念理解入手 视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,与基本表不同,它是一个虚表。在数据库中,存放的只是视图的定义,而不存放视图包含的数据项,这些项目仍然存放在原来的基本表结构中。 视图可以被定义为多个表的连接,也可以被定义为只有部分列可见,也可为部分行可见。 视图的作用有: 首先,可以简化数据查询语句 其次,可以使用用户能从多角度看待同一数据 然后,通过引入视图可以提高数据的安全性 最后,视图提提供了一定程度的逻辑独立性等。 引入视图机制带来的好处: 通过引入视图机制,用户可以将注意力集中在其关心的数据上(而非全部数据),这样就大大提高了用户效率与用户满意度,而且如果这些数据来源于多个基本表结构,或者数据不仅来自于基本表结构,还有一部分数据来源于其他视图,并且搜索条件又比较复杂时,需要编写的查询语句就会比较烦琐,此时定义视图就可以使数据的查询语句变得简单可行。 定义视图可以将表与表之间的复杂的操作连接和搜索条件对用户不可见,用户只需要简单地对一个视图进行查询即可,故增加了数据的安全性,但不能提高查询效率。 Hive视图是一种无关底层存储的逻辑对象。视图中的数据是SELECT查询返回的结果。在视图选定后才会开始执行SELECT查询。 需要注意的是,视图是只读的,不能向视图中插入或是加载数据。 下面是一个创建并使用视图的例子: create viewgroup_by_year_vw as select year,count(*) as video_ct from videos group by year; select * from group_by_year_vw; 视图通常被用作将数据发布给外部客户端的抽象层。视图可以使用稳定的公开的列名和数据类型来创建。 视图可以允许在不影响下游数据消费者的情况下修改内部的表结构。 一定要理解,创建视图,是基于表来创建得到视图的。 步骤一:创建一个测试表 create table test(id int,name string); desc test; 结果是 id int name string 步骤二:基于表 test 创建一个 test_view 视图 CREATEVIEWtest_view( id, name_length )ASSELECTid,length(name)FROMtest; 步骤三:查看 test_view 视图属性 DESC test_view; 步骤四:查看视图结果 SELECT * FROM test_view; 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6105243.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark SQL概念学习系列之Spark SQL 优化策略(五)

查询优化是传统数据库中最为重要的一环,这项技术在传统数据库中已经很成熟。除了查询优化,Spark SQL 在存储上也进行了优化,从以下几点查看 Spark SQL 的一些优化策略。(1)内存列式存储与内存缓存表 Spark SQL 可以通过 cacheTable 将数据存储转换为列式存储,同时将数据加载到内存进行缓存。 cacheTable 相当于在分布式集群的内存物化视图,将数据进行缓存,这样迭代的或者交互式的查询不用再从 HDFS 读数据,直接从内存读取数据大大减少了 I/O 开销。列式存储的优势在于 Spark SQL 只需要读出用户需要的列,而不需要像行存储那样需要每次将所有列读出,从而大大减少内存缓存数据 量,更高效地利用内存数据缓存,同时减少网络传输和 I/O 开销。数据按照列式存储,由于是数据类型相同的数据连续存储,能够利用序列化和压缩减少内存空间的占用。 (2)列存储压缩 为了减少内存和硬盘空间占用, Spark SQL 采用了一些压缩策略对内存列存储数据 进 行 压 缩。 Spark SQL 的 压 缩 方 式 要 比 Shark 丰 富 很 多, 例 如 它 支 持 PassThrough,RunLengthEncoding, DictionaryEncoding, BooleanBitSet, IntDelta, LongDelta 等多种压缩方式。这样能够大幅度减少内存空间占用和网络传输开销和 I/O 开销。(3)逻辑查询优化 Spark SQL 在逻辑查询优化(如图 1 所示)上支持列剪枝、谓词下压、属性合并等逻辑查询优化方法。列剪枝为了减少读取不必要的属性列,减少数据传输和计算开销,在查询优化器进行转换的过程中会进行列剪枝的优化。 图 1 逻辑查询优化 下面介绍一个逻辑优化例子: SELECT Class FROM (SELECT ID,Name,Class FROM STUDENT ) S WHERE S.ID=1 Catalyst 将原有查询通过谓词下压,将选择操作 ID=1 优先执行,这样过滤大部分数据,通过属性合并将最后的投影只做一次最终保留 Class 属性列。 (4) Join 优化 Spark SQL 深度借鉴传统数据库查询优化技术的精髓,同时也在分布式环境下进行特定的优化策略调整和创新。 Spark SQL 对 Join 进行了优化支持多种连接算法,现 在的连接算法已经比 Shark 丰富,而且很多原来 Shark 的元素也逐步迁移过来。例如:BroadcastHashJoin、 BroadcastNestedLoopJoin、 HashJoin、 LeftSemiJoin,等等。 下面介绍一个其中的 BroadcastHashJoin 算法思想。BroadcastHashJoin 将小表转化为广播变量进行广播,这样避免 Shuff le 开销,最后在分区内做 Hash 连接。这里用的就是 Hive 中 Map Side Join 的思想。同时用了 DBMS中的 Hash 连接算法做连接。 随着 Spark SQL 的发展,未来会有更多的查询优化策略加入进来。同时后续 SparkSQL 会 支 持 像 Shark Server 一 样 的 服 务 端、 JDBC 接 口, 兼 容 更 多 的 持 久 化 层 例 如NoSQL,传统的 DBMS 等。一个强有力的结构化大数据查询引擎正在崛起。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5725097.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark SQL概念学习系列之SQL on Spark的简介(三)

AMPLab 将大数据分析负载分为三大类型:批量数据处理、交互式查询、实时流处理。而其中很重要的一环便是交互式查询。 大数据分析栈中需要满足用户 ad-hoc、reporting、 iterative 等类型的查询需求,也需要提供 SQL 接口来兼容原有数据库用户的使用习惯,同时也需要 SQL 能够进行关系模式的重组。完成这些重要的 SQL 任务的便是Spark SQL 和 Shark这两个开源分布式大数据查询引擎,它们可以理解为轻量级 HiveSQL 在 Spark 上的实现,业界将该类技术统称为 SQL on Hadoop。 在 Spark 峰 会 2014 上, Databricks 宣 布 不 再 支 持 Shark 的 开 发, 全 力 以 赴 开 发Shark 的下一代技术 Spark SQL,同时 Hive 社区也启动了 Hive on Spark 项目, 将 Spark作为 Hive(除 MapReduce 和 Tez 之外的)新执行引擎。根据伯克利的 Big Data Benchmark测试对比数据,Shark 的 In Memory 性能 可 以 达 到 Hive 的 100 倍, 即 使 是On Disk 也能达到 10 倍的性能提升,是 Hive 强有力的替代解决方案。而作为Shark 的进化版本的 Spark SQL,在 AMPLab 最新的测试中的性能已经超过 Shark。图 1 展示了 Spark SQL和 Hive on Spark 是新的发展方向。 图 1 Spark SQL 和 Hive on Spark 是新的发展方向 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5725020.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark 概念学习系列之Spark计算工作流(十二)

下图 中描述了 Spark 的输入、运行转换、输出。 在运行转换中通过算子对 RDD进行转换。 算子是 RDD 中定义的函数,可以对 RDD 中的数据进行转换和操作。 输入:在 Spark 程序运行中,数据从外部数据空间(例如, HDFS、 Scala 集合或数据)输入到 Spark,数据就进入了 Spark 运行时数据空间,会转化为 Spark 中的数据块,通过 BlockManager 进行管理。运行:在 Spark 数据输入形成 RDD 后,便可以通过变换算子 f liter 等,对数据操作并将 RDD 转化为新的 RDD,通过行动(Action)算子,触发 Spark 提交作业。如果数据需要复用,可以通过 Cache 算子,将数据缓存到内存。 输出:程序运行结束数据会输出 Spark 运行时空间,存储到分布式存储中(如saveAsTextFile 输出到 HDFS)或 Scala 数据或集合中( collect 输出到 Scala 集合,count 返回 Scala Int 型数据)。 图 1 Spark 算子和数据空间 Spark的核心数据模型是RDD,但RDD是个抽象类,具体由各子类实现,如MappedRDD、Shuff ledRDD等子类。Spark将常用的大数据操作都转化成为RDD 的子类。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5724027.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册