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类型