DataSet 的基本使用

21 篇文章 0 订阅
21 篇文章 0 订阅

 

DataSet 简介

DataSet是分布式的数据集合,Dataset提供了强类型支持,也是在RDD的每行数据加了类型约束。DataSet是在Spark1.6中添加的新的接口。它集中了RDD的优点(强类型和可以用强大lambda函数)以及使用了Spark SQL优化的执行引擎。DataSet可以通过JVM的对象进行构建,可以用函数式的转换(map/flatmap/filter)进行多种操作。

DataSet包含了DataFrame的功能,Spark2.0中两者统一,DataFrame表示为DataSet[Row],即DataSet的子集。

DataSet可以在编译时检查类型:

相比DataFrame,Dataset提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,这会浪费大量的时间,这也是引入Dataset的一个重要原因。
 

 

DataSet 使用

读取 txt 文件

person.txt

路飞 17 1 15 xxxxxxxxxxx@xxxxxxx.com
索隆 18 1 9 xxxxxxxxxxx@xxxxxxx.com
乔巴 5 1 5 xxxxxxxxxxx@xxxxxxx.com
艾斯 18 2 18 xxxxxxxxxxx@xxxxxxx.com
萨博 18 2 16 xxxxxxxxxxx@xxxxxxx.com
香克斯 32 3 30 xxxxxxxxxxx@xxxxxxx.com
 3 3 30 xxxxxxxxxxx@xxxxxxx.com
null 3 3 30 xxxxxxxxxxx@xxxxxxx.com
object DataSetDemo {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("DataSetDemo").master("local[*]").getOrCreate()

    import spark.implicits._
    val df = spark.read.text("C:\\Users\\LUFFY\\Desktop\\testData\\person.txt")
    val ds = df.as[String]
    ds.map(_.split(" "))
      .map(line => Person(line(0), line(1).toInt, line(2).toInt, line(3).toDouble, line(4)))
      .toDF().show()
    spark.stop()
  }
  case class Person(name: String, age: Int, deptno: Int, money: Double, email: String)
}

运行结果如下:

object DataSetDemo2 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("DataSetDemo").master("local[*]").getOrCreate()
    import spark.implicits._
    val ds =spark.read.text("C:\\Users\\LUFFY\\Desktop\\testData\\person.txt").as[String]
    val personDF = ds.map(_.split(" ")).map(line => Person(line(0), line(1).toInt, line(2).toInt, line(3).toDouble, line(4)))
      .toDF
      personDF.select(personDF("name").as("姓名"), personDF("email").as("邮箱")).show(false)
  }
  case class Person(name: String, age: Int, deptno: Int, money: Double, email: String)
}

运行结果为:

 

读取 Json 文件

person.json

{"name":"路飞","age":17,"deptno":1,"money":15}
{"name":"索隆","age":18,"deptno":1,"money":9}
{"name":"乔巴","age":5,"deptno":1,"money":5}
{"name":"艾斯","age":18,"deptno":2,"money":18}
{"name":"萨博","age":18,"deptno":2,"money":16}
{"name":"香克斯","age":32,"deptno":3,"money":30}
import org.apache.spark.sql.{Dataset, SparkSession}

object DataSetDemo2 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("DataSetDemo").master("local[*]").getOrCreate()
    import spark.implicits._
    val ds = spark.read.json("C:\\Users\\LUFFY\\Desktop\\testData\\person.json")
      .as[Person]
    ds.show()
  }
  case class Person(name: String, age: BigInt, deptno: BigInt, money: Double)
}

结果如下

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值