SparkSQL相关操作

SparkSQL相关操作

sparkSQL的应用程序入口为SparkSession,用来加载不同的数据源的数据,封装到DataFrame或Dataset中

RDD => DataFrame/DataSet

指定列名来创建DF

object SparkSQLTest {

  def main(args: Array[String]): Unit = {

    // 创建配置对象
    val conf = new SparkConf().setMaster("local[*]").setAppName("SparkSQLTest")
    val spark = SparkSession.builder().config(conf).getOrCreate()
    val sc = spark.sparkContext

    val list = List((1, "jx", 20), (2, "zx", 21))

    val rdd = sc.makeRDD(list)

    // RDD => DataFrame => DataSet转换需要引入隐式转换规则
    // spark是环境名
    import spark.implicits._
    // 可以添加schema
    val df = rdd.toDF("id", "name", "age")
    df.printSchema()
    df.show()


  }

}

/*
* 不添加schema的输出
*  root
 |-- _1: integer (nullable = false)
 |-- _2: string (nullable = true)
 |-- _3: integer (nullable = false)
 * 
 * +---+---+---+
| _1| _2| _3|
+---+---+---+
|  1| jx| 20|
|  2| zx| 21|
+---+---+---+
* 
* 
* 添加schema的输出
* root
 |-- id: integer (nullable = false)
 |-- name: string (nullable = true)
 |-- age: integer (nullable = false)
 * 
 * +---+----+---+
| id|name|age|
+---+----+---+
|  1|  jx| 20|
|  2|  zx| 21|
+---+----+---+
* */

使用样例类来创建DF

object SparkSQLTest {

  def main(args: Array[String]): Unit = {

    // 创建配置对象
    val conf = new SparkConf().setMaster("local[*]").setAppName("SparkSQLTest")
    val spark = SparkSession.builder().config(conf).getOrCreate()
    val sc = spark.sparkContext

    val line = sc.textFile("data/input.txt")

    val rdd = line.map(_.split(" "))

//    val rdd1 = rdd.map(_.split(" "))

    val rdd1 = rdd.map(arr => Person(arr(0).toInt, arr(1), arr(2).toInt))

    // RDD => DataFrame => DataSet转换需要引入隐式转换规则
    // spark是环境名
    import spark.implicits._
    // 可以添加schema
    val df = rdd1.toDF
    df.printSchema()
    df.show()


  }

}

/*
* root
 |-- id: integer (nullable = false)
 |-- name: string (nullable = true)
 |-- age: integer (nullable = false)

* +---+----+---+
| id|name|age|
+---+----+---+
|  1|  jx| 20|
|  2|  zx| 21|
+---+----+---+
*
* */

自定义Schema

object SparkSQLTest {

  def main(args: Array[String]): Unit = {

    // 创建配置对象
    val conf = new SparkConf().setMaster("local[*]").setAppName("SparkSQLTest")
    val spark = SparkSession.builder().config(conf).getOrCreate()
    val sc = spark.sparkContext

    val line = sc.textFile("data/input.txt")

    val rdd = line.map(_.split(" "))

//    val rdd1 = rdd.map(_.split(" "))

    val rdd1 = rdd.map(arr => Row(arr(0).toInt, arr(1), arr(2).toInt))

    // RDD => DataFrame => DataSet转换需要引入隐式转换规则
    // spark是环境名
    import spark.implicits._
    // 可以添加schema
    val schema = StructType(
      Array(
        StructField("id", IntegerType, true),
        StructField("name", StringType, true),
        StructField("age", IntegerType, true)
      )
    )

    val df = spark.createDataFrame(rdd1, schema)
    df.printSchema()
    df.show()


  }

}

/*
* root
 |-- id: integer (nullable = true)
 |-- name: string (nullable = true)
 |-- age: integer (nullable = true)
 * 
 * +---+----+---+
| id|name|age|
+---+----+---+
|  1|  jx| 20|
|  2|  zx| 21|
+---+----+---+
* 
* */

RDD、DF、DS相互转换

  • RDD转换成DF或DS

转换DF,需要定义schema

转换成DS,不仅需要schema,还需要RDD数据类型为CaseClass

  • DS\DF转换成RDD

DS和DF底层就是RDD,直接调用rdd函数

  • DF与DS之间的转换

DF为DS的特里,DS调用toDF函数可转换为DF

DF转换为DS,使用函数as[Type],只当CaseClass类型

仅需要schema,还需要RDD数据类型为CaseClass

  • DS\DF转换成RDD

DS和DF底层就是RDD,直接调用rdd函数

  • DF与DS之间的转换

DF为DS的特里,DS调用toDF函数可转换为DF

DF转换为DS,使用函数as[Type],只当CaseClass类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

健鑫.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值