SparkSQL编程-DataSet

DataSet 和 RDD 类似, 但是DataSet没有使用 Java 序列化或者 Kryo序列化, 而是使用一种专门的编码器去序列化对象, 然后在网络上处理或者传输.
虽然编码器和标准序列化都负责将对象转换成字节,但编码器是动态生成的代码,使用的格式允许Spark执行许多操作,如过滤、排序和哈希,而无需将字节反序列化回对象。
DataSet是具有强类型的数据集合,需要提供对应的类型信息。

DataSet创建

1 使用样例类的序列得到DataSet

// 创建样例类
scala> case class Person(name: String, age: Int)
defined class Person
// 为样例类创建一个编码器
scala> val ds = Seq(Person("lisi", 20), Person("zs", 21)).toDS
ds: org.apache.spark.sql.Dataset[Person] = [name: string, age: int]
scala> ds.show
+----+---+
|name|age|
+----+---+
|lisi| 20|
| zs| 21|
+----+---+

2 使用基本类型的序列得到 DataSet

// 基本类型的编码被自动创建. importing spark.implicits._
scala> val ds = Seq(1,2,3,4,5,6).toDS
ds: org.apache.spark.sql.Dataset[Int] = [value: int]
scala> ds.show
+-----+
|value|
+-----+
| 1|
| 2|
| 3|
| 4|
| 5|
| 6|
+-----+

3 通过RDD转换

使用反射来推断包含特定类型对象的RDD的 schema 。
这种基于反射的方法可以生成更简洁的代码,并且当您在编写Spark应用程序时已经知道模式时,这种方法可以很好地工作。
为 Spark SQL 设计的 Scala API 可以自动的把包含样例类的 RDD 转换成 DataSet.
样例类定义了表结构: 样例类参数名通过反射被读到, 然后成为列名.
样例类可以被嵌套, 也可以包含复杂类型: 像Seq或者Array.
scala> val peopleRDD = sc.textFile("examples/src/main/resources/people.txt")
peopleRDD: org.apache.spark.rdd.RDD[String] = examples/src/main/resources/people.txt MapPartitionsRDD[1] at textFile at <console>:24

scala> case class Person(name: String, age: Long)
defined class Person

scala> peopleRDD.map(line => {val para = line.split(",");Person(para(0),para(1).trim.toInt)}).toDS
res0: org.apache.spark.sql.Dataset[Person] = [name: string, age: bigint]
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早拾碗吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值