はじめに:実際のプロジェクト開発では、RDD、DataFrame、およびDatasetの間で変換する必要があることがよくあります。主なポイントは、スキーマ制約構造情報です。
1)RDDはDataFrameまたはDatasetを変換します
- DataFrameを変換するときは、2つの方法でスキーマ情報を定義します
- データセットに変換する場合、スキーマ情報が必要なだけでなく、RDDデータタイプもCaseClassタイプです。
2)データセットまたはデータフレーム変換RDD
- DatasetまたはDataFrameの最下層はRDDであるため、rdd関数を呼び出すことで直接変換できます。
- dataframe.rddまたはデータセット.rdd
3)DataFrameとDatasetの間で変換する
- DataFrameはDatasetの特殊なケースであるため、DatasetはtoDF関数を直接呼び出してDataFrameに変換します
- DataFrameをDatasetに変換するときは、関数as [Type]を使用してCaseClassタイプを指定します。
コード:
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{
DataFrame, Dataset, SparkSession}
/**
* @author liu a fu
* @date 2021/1/17 0017
* @version 1.0
* @DESC 步骤 演示各个数据类型的转换 RDD DataFrame DateSet之间的转换
*/
case class PerSon2(id: Int, name: String, age: Int)
object _07SparkSQLataSetChange {
def main(args: Array[String]): Unit = {
//1-环境准备
val conf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName.stripSuffix("$")).setMaster("local[*]")
val spark: SparkSession = SparkSession
.builder()
.config(conf)
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
//如果从rdd转化到df需要引入隐式转换
import spark.implicits._
import org.apache.spark.sql.functions._
//读取元数据文件
val peopleRDD: RDD[String] = spark.sparkContext.textFile("data/input/sql/person.txt")
val valueRDD: RDD[PerSon2] = peopleRDD.map(_.split("\\s+")).map(line => PerSon2(line(0).toInt, line(1), line(2).toInt))
/**
* 开始相互转换
*/
//2 -从rdd转换为DataFrame,在使用case class的基础上增加schema在toDF
val peopleDF: DataFrame = valueRDD.toDF()
peopleDF.printSchema()
peopleDF.show()
/**
* +---+--------+---+
* | id| name|age|
* +---+--------+---+
* | 1|zhangsan| 20|
* | 2| lisi| 29|
* | 3| wangwu| 25|
* | 4| zhaoliu| 30|
* | 5| tianqi| 35|
* | 6| kobe| 40|
* +---+--------+---+
*/
// 3-从df转化为rdd
peopleDF.rdd.collect().foreach(println(_))
/**
* [1,zhangsan,20]
* [2,lisi,29]
* [3,wangwu,25]
* [4,zhaoliu,30]
* [5,tianqi,35]
* [6,kobe,40]
*/
//4-从df转到ds
val peopleDS: Dataset[PerSon2] = peopleDF.as[PerSon2]
peopleDS.show()
/**
* +---+--------+---+
* | id| name|age|
* +---+--------+---+
* | 1|zhangsan| 20|
* | 2| lisi| 29|
* | 3| wangwu| 25|
* | 4| zhaoliu| 30|
* | 5| tianqi| 35|
* | 6| kobe| 40|
* +---+--------+---+
*/
// 5- DS ---> RDD
peopleDS.rdd.foreach(println(_))
/**
* PerSon2(1,zhangsan,20)
* PerSon2(4,zhaoliu,30)
* PerSon2(2,lisi,29)
* PerSon2(5,tianqi,35)
* PerSon2(3,wangwu,25)
* PerSon2(6,kobe,40)
*/
//6- RDD -> DS
val peopleDS2: Dataset[PerSon2] = valueRDD.toDS()
peopleDS2.show()
//7- DS --> DF
val peopleDSDF: DataFrame = peopleDS.toDF()
peopleDSDF.show()
/**
* +---+--------+---+
* | id| name|age|
* +---+--------+---+
* | 1|zhangsan| 20|
* | 2| lisi| 29|
* | 3| wangwu| 25|
* | 4| zhaoliu| 30|
* | 5| tianqi| 35|
* | 6| kobe| 40|
* +---+--------+---+
*/
//关闭SparkSession
spark.sparkContext.stop()
}
}