将代码从 spark 1.x 移植到 spark 2.x
来源:互联网 发布:开淘宝店的计划书 编辑:程序博客网 时间:2024/05/16 12:46
1. SparkSession
sparkSession可以视为sqlContext
和hiveContext
以及StreamingContext
的结合体,这些Context的API都可以通过sparkSession使用。
创建SparkSession
val spark = SparkSession.builder .master("local[2]") .appName("spark session example") .getOrCreate()
使用enableHiveSupport
就能够支持hive,相当于hiveContext
val spark = SparkSession.builder .master("local[2]") .appName("spark session example") .enableHiveSupport() .getOrCreate()
API操作,与之前的Context基本一致
//读取csv数据val df0 = spark.read .option("header","true") .csv("src/main/resources/test.csv")//读取parquet数据val df1 = spark.read.parquet("...")//读取json数据val df2 = spark.read.json("...")//sql查询val df3 = spark.sql("xxx")
Spark 2.0向后兼容,所以hiveContext
以及sqlContext
依旧可用,不过官方建议开发者开始使用SparkSession
。
2. DataSet,RDD,DataFrame
RDD
类型安全,面向对象编程风格,序列化以及反序列化开销大。
DataFrame
提供了查询优化器,分区剪枝,自动判断是否使用
broadcast join
等功能,对rdd进行了大量的优化。对spark了解不深的编程/分析人员非常友好。可以视为Row类型的Dataset (Dataset[Row]),非类型安全,不是面向对象编程风格。
DataSet
继承了RDD和DataFrame的优点。数据以编码的二进制形式存储,将对象的schema映射为SparkSQL类型,不需要反序列化就可以进行shuffle等操作,每条记录存储的则是强类型值,类型安全,面向对象编程风格。
Dataset的创建
dataset可以从rdd,dataFrame转化,也可以从原始数据直接生成。
通过toDS
方法创建
val ds1 = Seq("a","b").toDS()ds1.show//+-----+//|value|//+-----+//| a|//| b|//+-----+
通过createDataSet
创建
case class Person(name: String, age: Int)val data = Seq(Person("lsw", 23), Person("yyy", 22))val ds2 = spark.createDataset(data)ds2.show//+----+---+//|name|age|//+----+---+//| lsw| 23|//| yyy| 22|//+----+---+
DataSet与RDD使用上的区别
Dataset 结合了 rdd 和 DataFrame 上大多数的API,所以spark 1.x
基于 rdd 或 DataFrame 的代码可以很容易的改写成spark 2.x
版本
数据读取
RDDs
sparkContext.textFile("/path/to/data.txt")
Datasets
//返回 DataFrameval df = spark.read.text("/path/to/data.txt")//返回 DataSet[String]val ds1 = spark.read.textFile("/path/to/data.txt")//或者读取成DataFram再转化成Datasetval ds2 = spark.read.text("/path/to/data.txt").as[String]
常用API
RDDs
//flatMap,filterval lines = sc.textFile("/path/to/data.txt")val res = lines .flatMap(_.split(" ")) .filter(_ != "")//reduceval rdd = sc.makeRDD(Seq(1, 2, 3, 4))rdd.reduce((a, b) => a + b)
Datasets
//flatMap,filterval lines = spark.read.textFile("/path/to/data.txt")val res = lines .flatMap(_.split(" ")) .filter(_ != "")//reduceval ds = Seq(1, 2, 3, 4).toDsds.reduce((a, b) => a + b)
reduceByKey
RDDs
val reduceCountByRDD = wordsPair .reduceByKey(_+_)
Datasets
val reduceCountByDs = wordsPairDs .mapGroups((key,values) =>(key,values.length))
RDD,DataFrame,Dataset的相互转化
import spark.implicits._//Dataset转化为RDDval ds2rdd = ds.rdd//Dataset转为DataFrameval ds2df = ds.toDF//RDD转化为Datasetval rdd2ds = rdd.toDS//RDD转化为DataFrameval rdd2df = rdd.toDF//DataFrame转化为RDDval df2rdd = df.rdd//DataFrame转化为DataSetval df2ds = df.as[Type]
wordCount
data.txt
hello worldhello spark
RDDs
val rdd = sc.textFile("src/main/resources/data.txt")val wordCount = rdd .map(word => (word,1)) .reduceByKey(_+_)
Datasets
import spark.implicits._val wordCount1 = lines .flatMap(r => r.split(" ")) .groupByKey(r => r) .mapGroups((k, v) => (k, v.length))wordCount1.show// +-----+--------+// |value|count(1)| // +-----+--------+// |hello| 2|// |spark| 1|// |world| 1|// +-----+--------+//也可以直接使用count函数val wordCount2 = lines .flatMap(r => r.split(" ")) .groupByKey(v => v) .count()wordCount2.show// +-----+---+// | _1| _2|// +-----+---+// |hello| 2|// |spark| 1|// |world| 1|// +-----+---+
Dataset性能提升(来自官方)
3. Catalog
Spark 2.0中添加了标准的API(称为catalog)来访问Spark SQL中的元数据。这个API既可以操作Spark SQL,也可以操作Hive元数据。
获取catalog
从SparkSession中获取catalog
val catalog = spark.catalog
查询临时表和元数据中的表
返回Dataset[Table]
catalog.listTable.show// +----+--------+-----------+---------+-----------+// |name|database|description|tableType|isTemporary|// +----+--------+-----------+---------+-----------+// |table| null| null|TEMPORARY| true|// |act | default| null| EXTERNAL| false|// +----+--------+-----------+---------+-----------+
创建临时表
使用createTempView
和createOrReplaceTempView
取代registerTempTable
。
例如
df.createTempView("table")df.createOrReplaceTempView("table")
createTempView
创建临时表,如果已存在同名表则报错。
createOrReplaceTempView
创建临时表,如果存在则进行替换,与老版本的
registerTempTable
功能相同。
销毁临时表
使用dropTempView
取代dropTempTable
,销毁临时表的同事会清除缓存的数据。
spark.dropTempView("table")
缓存表
对数据进行缓存
//缓存表有两种方式df.cachecatalog.cacheTable("table")//判断数据是否缓存catalog.isCached("table")
catalog相较于之前的API,对metadata的操作更加的简单,直观。
参考
http://blog.madhukaraphatak.com/categories/spark-two/
http://www.jianshu.com/p/c0181667daa0
https://databricks.com/blog/2016/01/04/introducing-apache-spark-datasets.html
- 将代码从 spark 1.x 移植到 spark 2.x
- 编译 Spark 1.x
- spark 从1.x 转到2.x,编写程序的的一些区别
- 将cocos2d-x项目从x-code移植到vs2012下记录
- 【持续更新中】从cocos2d-x 1.x.x 到 cocos2d-x 2.x.x 须知
- Cocos2d-x将win32移植到android
- Cocos2d-x将win32移植到android
- 将cocos2d-x项目移植到android
- Cocos2d-x将win32移植到android
- Spark-Graph x
- spark-1.6.x-总结
- 1.将cocos2d-x项目移植到Linux环境下,将cocos2d-x项目移植到手机上
- Coco2d-x从Win32移植到Android
- 从Win32移植cocos2d-x到Android
- fcgi.py 从python2.x到3.x的移植
- 如何将你的Sprite Kit游戏从ios移植到Mac OS X平台
- 将Cocos2d-x从iOS平台移植到Android平台需要修改的地方
- spark 2.x ML概念与应用
- 浅谈iOS中MVVM的架构设计与团队协作
- uva 11971 Polygon 连续概率
- ListView 的item中有多个控件导致列表点击事件失效解决
- Android之百度地图开发,包含定位,覆盖物,经纬度位置转换,长按设置中心位置
- Android下jni开发之ndk的使用(下载、配置、编译遇到的问题)
- 将代码从 spark 1.x 移植到 spark 2.x
- android点击屏幕上EditText区域以外的任何地方隐藏键盘的方法
- 搭建Kafka集群环境
- 《毛泽东思想和中国特色社会主义理论体系概论》课程 社会实践调研报告 题目:大学生理财能力调查与分析
- 刷刷笔试题--贪心算法
- 动态查询一个树形结构表中:某一个节点的所有父节点或者子节点
- 安装eclipse部分注意事项
- System类的使用 (数组拷贝)获取当前时间 返回long类型
- JS 关于原型和闭包的理解