spark2.0版本RDD、DataFrame、DataSet介绍

1. 相关概念
1) RDD:spark中最基本的 弹性分布式数据集,提供了很多api 来操作数据集中的元素
2) DataFrame:spark的基于RDD的一种高级抽象,在RDD之上加入了scheme信息,给RDD的元素的每一列提供了 名称和数据类型 的标志;同 时它还提供了更多的api,可以实现类似于sql的操作;但是DataFrame也丢掉了RDD的优点:编译时类型检查和面向对象
3) DataSet:引入了Encoder,成功结合了RDD 和 DataFrame 的优点 (dataset从spark1.6开始引入的)
2. spark 2.0之前的老版本:
RDD的创建 依赖于 sparkcontext;
流处理 依赖于 streamingcontext
sql 依赖于 sqlcontext
hive 依赖于 hivecontext
spark 2.0 之后,这些都统一于 sparksession,sparksession 封装了 sparkcontext,sqlcontext,例如下面:
sparksession 的 创建
val sparkSession : SparkSession = SparkSession.builder.master("").appName("").getOrCreate
获取sparkcontext:
val sc : SparkContext = sparkSession.sparkContext
获取sqlcontext:
val sqlContext : SQLContext = sparkSession.sqlContext
3. 1) DataFrame 的创建:
① 从 csv 数据源 创建:参考 http://blog.csdn.net/lw_ghy/article/details/51480358
② 从 json 数据源 创建
val dataFrame : DataFrame = sparkSession.read.json("some json file")
③ 从 parquet 数据源 创建
val dataFrame : DataFrame = sparkSession.read.json("some parquet file")
④ 从 sql 创建
val dataFrame : DataFrame = sparkSession.sql("select * from ...")
⑤ 从 load 函数(数据源)建
默认数据源(默认是parquet): val dataFrame : DataFrame = sparkSession.read.load("some parquet file")
指定数据源: val dataFrame : DataFrame = sparkSession.read.format("json").json("some json file")
case class People(name : String, age : Int)
def createDFWith_CaseClass = { //使用 case class 的方式创建
import sparkSession.implicits._
val rdd : RDD[People]= sparkSession.sparkContext.textFile(hdfsFile,2).map(line => line.split(","))
.map(arr => People(arr(0),arr(1).trim.toInt))
val peopleDF : DataFrame = rdd.toDF
}
def createDFWith_Scheme = { //使用 scheme 的方式创建
val schema = StructType(
Seq(
StructField("name",StringType,true)
,StructField("age",IntegerType,true)
)
)
import sparkSession.implicits._
val rowRDD = sparkSession.sparkContext.textFile(hdfsFile,2).map( x => x.split(",")).map( x => Row(x(0),x(1).trim().toInt))
val peopleRdd = sparkSession.createDataFrame(rowRDD,schema)
}
2) DataSet 的创建(同 上)
val dataSet : DataSet = rdd.toDS

4. 不同版本spark下的dataframe的差异
1) spark2.0 之前:
val df1 : DataFrame = sqlContex.createDataFrame(rddRow, schema)
2) spark2.0 之后:
val df : DataFrame = sparkSession.createDataFrame(rddRow, schema)
3) 虽然 df1 和 df2 都声明为 DataFrame 类型,但是在spark2.0之后,这里的DataFrame 实际上是DataSet,因为DataFrame被声明为Dataset[Row],如下:
package object sql {
// ...省略了不相关的代码
type DataFrame = Dataset[Row]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值