spark2.0系列《一》—— RDD VS. DataFrame VS. DataSet
虽说,spark我也不陌生,之前一直用python跑的spark,基本的core和SQL操作用的也是比较熟练。但是这一切的基础都是在RDD上进行操作,即使是进行SQL操作也是将利用SpaekContext类中的textFile方法读取txt文件返回RDD对象,然后使用SQLContext实例化载利用函数createDataFrame将格式化后的数据转化为dataFrame或者利用createDataset将数据转换为dataset。真不是一般的麻烦。。。话不多说,比如以下python代码示例:
# -*-coding:utf-8-*-
# Created by wuying on 2017/3/28 from pyspark.sql import Row
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.functions import * def create_df(sqlContext, raw_data):
"""
:param row_data: original data
:return: data frame
"""
lineLists = raw_data.map(lambda x: x.split(','))
//筛选部分有用的数据字段作为表头
row_data = lineLists.map(lambda x: Row(
recordCode = x[0],
logicCode = x[1],
deviceCode = x[2],
compId = x[2][:3],
siteId = x[2][:6],
transType = x[4],
cardTime = x[8],
compName = x[12],
siteName = x[13],
carCode = x[14]
)
)
SZT_df = sqlContext.createDataFrame(row_data)
SZT_df.registerTempTable("SZT_df") return SZT_df if __name__ == '__main__':
# Create DataFrame
# Load data from hdfs
inputFile = "P_GJGD_SZT_20170101" //数据来源于地铁打卡
sc = SparkContext(master="local[*]", appName="AppTest", pyFiles=["prepared.py"])
raw_data = sc.textFile(inputFile)
sqlContext = SQLContext(sc)
SZT_df = create_df(sqlContext, raw_data)
print SZT_df.dtypes
1、RDD,英文全称是“Resilient Distributed Dataset”,即弹性分布式数据集,听起来高大上的名字,简而言之就是大数据案例下的一种数据对象,RDD这个API在spark1.0中就已经存在,因此比较老的版本的tutorial中用的都是RDD作为原始数据处理对象,而在spark-shell中已经实例化好的sc对象一般通过加载数据产生的RDD这个对象的基础上进行数据分析。当然,打草稿情况(未接触企业级系统)下RDD API还是足够我们对一般的数据进行转换,清洗以及计数,里面有较为丰富的函数可以调用,比如常用的map, filter, groupBy等等,具体实现见pyspark。所以,这个RDD的简单安全且易于理解使得很多人都是用RDD打开spark这个高大上之神器的大门(包括我~~)。
首先,它不好操作,以我目前的知识水平而言,我宁愿选dataFrame。因为dataFrame方便且高速,比如SQL语句,自从用了SQL,再也不想一步步map,一步步filter了。其次,据说,RDD无论是在集群上执行任务还是存储到硬盘上。它都会默认使用java对象序列化(提高数据操作的性能),而序列化单个java和scala对象的开销过大,并且需要将数据及其结构在各节点之间传输,而生成和销毁个别对象需要进行垃圾收集这期间的开销也非常大。
2、DataFrame。说到dataFrame,我就想到R和pandas(python)中常用的数据框架就是dataFrame,估计后来spark的设计者从R和pandas这个两个数据科学语言中的数据dataFrame中吸取灵感,不同的是dataFrame是从底层出发为大数据应用设计出的RDD的拓展,因此它具有RDD所不具有的几个特性(Spark 1.3以后):
- 处理数据能力从千字节到PB量级不等
- 支持各种数据格式和存储系统
- 通过SPARK SQL Catalyst优化器进行高效率优化和代码生成
- 通过SPARK对所有大数据工具基础架构进行无缝集成
- 提供Python,Scala,Java 和R的api
简而言之,我们可以将dataFrame当作是关系数据库中表或者是R或者Python中的dataFrame数据结构。实际上,有了dataFrame我们相当于spark可以管理数据视图,以后传输数据只要在各个节点穿数据数据而不需要传数据结构,这种方式比java序列化有效的多。
直接上个scala代码瞅瞅:
package cn.sibat.metro
import org.apache.spark.sql.SparkSession /**
* Created by wing1995 on 2017/4/20
*/ object Test {
def main(args: Array[String]) = {
val spark = SparkSession
.builder()
.config("spark.sql.warehouse.dir", "file:/file:E:/bus")
.appName("Spark SQL Test")
.master("local[*]")
.getOrCreate() import spark.implicits._ val df = spark.sparkContext
.textFile("E:\\trafficDataAnalysis\\SZTDataCheck\\testData.txt")
.map(_.split(","))
.map(line => SZT(line(0), line(1), line(2), line(2).substring(0, 3), line(2).substring(0, 6), line(4), line(8), line(12), line(13), line(14)))
.toDF()
df.show()
df.printSchema()
}
} case class SZT(recordCode: String, logicCode: String, terminalCode: String, compId: String, siteId: String,
transType: String, cardTime: String, compName: String, siteName: String, vehicleCode: String
)
代码真是清新可人啊,直接SparkSession实例化然后再怎么转其他格式,怎么读其他数据都可以。。。
3、Dataset(Spark 1.6)
跟DataFrame很像,不是很熟悉,貌似是为了兼容SCALA中的RDD和JAVA的面向对象而设计,事实证明Scala在Spark中的优势是java取代不了的,即使java8已经做出不少改进。然而,Scala作为原生态语言,仍然是Spark使用者的主流。所以,接下来的博客陆续以Scala为主。
个人是比较喜欢简洁而有趣的Scala,为数据科学而设计!
spark2.0系列《一》—— RDD VS. DataFrame VS. DataSet的更多相关文章
- Apache Spark 2.0三种API的传说:RDD、DataFrame和Dataset
Apache Spark吸引广大社区开发者的一个重要原因是:Apache Spark提供极其简单.易用的APIs,支持跨多种语言(比如:Scala.Java.Python和R)来操作大数据. 本文主要 ...
- RDD、DataFrame、Dataset
RDD是Spark建立之初的核心API.RDD是不可变分布式弹性数据集,在Spark集群中可跨节点分区,并提供分布式low-level API来操作RDD,包括transformation和actio ...
- SparkSQL 中 RDD 、DataFrame 、DataSet 三者的区别与联系
一.SparkSQL发展: Shark是一个为spark设计的大规模数据仓库系统,它与Hive兼容 Shark建立在Hive的代码基础上,并通过将Hive的部分物理执行计划交换出来(by s ...
- 谈谈RDD、DataFrame、Dataset的区别和各自的优势
在spark中,RDD.DataFrame.Dataset是最常用的数据类型,本博文给出笔者在使用的过程中体会到的区别和各自的优势 共性: 1.RDD.DataFrame.Dataset全都是spar ...
- RDD、DataFrame、Dataset三者三者之间转换
转化: RDD.DataFrame.Dataset三者有许多共性,有各自适用的场景常常需要在三者之间转换 DataFrame/Dataset转RDD: 这个转换很简单 val rdd1=testDF. ...
- Spark RDD、DataFrame和DataSet的区别
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 转载请标明出处:小帆的帆的专栏 RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类 ...
- 且谈 Apache Spark 的 API 三剑客:RDD、DataFrame 和 Dataset
作者:Jules S. Damji 译者:足下 本文翻译自 A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets ,翻译已 ...
- Spark SQL 之 RDD、DataFrame 和 Dataset 如何选择
引言 Apache Spark 2.2 以及以上版本提供的三种 API - RDD.DataFrame 和 Dataset,它们都可以实现很多相同的数据处理,它们之间的性能差异如何,在什么情况下该选用 ...
- RDD、DataFrame和DataSet的区别
原文链接:http://www.jianshu.com/p/c0181667daa0 RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同. RDD ...
- RDD、DataFrame和DataSet
简述 RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同:DataFrame多了数据的结构信息,即schema.RDD是分布式的 Java对象的集 ...
随机推荐
- 【转】对Django框架架构和Request/Response处理流程的分析
本文转载于疯狂的蚂蚁. 一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组成: 核心在于中间件middleware,django所有的请求.返回都由中间件来完成. ...
- 谈谈Backbone.js中的el
小编最近开始接触backbone.js,这个曾经非常优秀的一款MVC前端框架,在学习的过程中,遇到下图的这样一个问题 下面上代码 小编的想法很简单,只是view了一个实例,然后在initalize中调 ...
- Win10上编译CoreCLR的Windows和Linux版本
一.编译环境 首先,不管是Windows还是Linux版本CoreCLR的编译,都是在Windows10上进行的. 二.CoreCLR for Windows 在Windows上做编译怎么能少得了Vi ...
- Storm(2015.08.12笔记)
2015.08.12Storm 一.Storm简介 Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架. Storm能实现高频数据和大规模数据的实时处理. 官网资料显示s ...
- java学习笔记 --- 条件,循环语句
一.三元运算符 A:格式 比较表达式?表达式1:表达式2; B:执行流程: 首先计算比较表达式的值,看是true还是false. 如果是true,表达式1就是结果. 如果是 ...
- MyBatis 源码分析——映射结果
MyBatis最后一步一定是处理相关的结果——把数据映射成对应的模型对象.事实上在笔者看来如果读者们了解了mybatis如何去执行数据库,又是如何处理数据结果.那么就了解了mybatis的主要路线.因 ...
- Jmeter-线程组
1.Sampler 取样器(Sampler)是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler , 如 HTTP Request Sam ...
- 第一章:shiro简介
1.1 简介 Apache Shiro是java的一个安全框架,相当简单,没有Spring Security功能强大,但是实际工作中大多使用shiro就够了.可以帮助我们完成:认证,授权,加密,会话管 ...
- Linux 和 Windows 下实现多进程的方式以及管道操作
一.多进程 1.windows 多进程 使用 #include<windows.h> 下面的 BOOL CreateProcess( LPCWSTR pszImageName, LPCWS ...
- 【转】如何实现Flex页面跳转
其实对于这个题目是不恰当的,因为flex中是没有页面这个概念的,页面在flex里面其实就是一个个的Canvas,vbox,hbox等等之类的东西,看到的不同页面的切换,就是这些元素一层层的堆积,或者替 ...