這篇文章主要講解了“Spark SQL中的RDD與DataFrame轉換實例用法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spark SQL中的RDD與DataFrame轉換實例用法”吧!

反射 把schema信息全部定義在case class 類里面
package core
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.StructType
object Test {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("Test")
.master("local[2]")
.getOrCreate()
val mess = spark.sparkContext.textFile("file:///D:\\test\\person.txt")
import spark.implicits._
val result = mess.map(_.split(",")).map(x => Info(x(0).toInt,x(1),x(2).toInt)).toDF()
// result.map(x => x(0)).show() //在1.x 版本是可以的 在2.x不可以需要價格rdd
result.rdd.map(x => x(0)).collect().foreach(println)
result.rdd.map(x => x.getAs[Int]("id")).collect().foreach(println)
}
}
case class Info(id:Int,name:String,age:Int)注意2.2版本以前 類的構造方法參數有限 在2.2后沒有限制了


制定scheme信息 就是編程的方式 作用到Row 上面

從原有的RDD轉化 ,類似于textFile 一個StructType匹配Row里面的數據結構(幾列),就是幾個StructField 通過createDataFrame 把schema與RDD關聯上

StructField 可以理解為一列 StructType 包含 1-n 個StructField
package core
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SparkSession}
object TestRDD2 {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("TestRDD2")
.master("local[2]")
.getOrCreate()
val mess = spark.sparkContext.textFile("file:///D:\\test\\person.txt")
val result = mess.map(_.split(",")).map(x => Row(x(0).toInt, x(1), x(2).toInt))
//工作中這樣寫
val structType = new StructType(
Array(
StructField("id", IntegerType, true),
StructField("name", StringType, true),
StructField("age", IntegerType, true)
)
)
val schema = StructType(structType)
val info = spark.createDataFrame(result,schema)
info.show()
}
}
自己定義的schema信息與Row中的信息不匹配
val result = mess.map(_.split(",")).map(x => Row(x(0), x(1), x(2)))
//工作中這樣寫
val structType = new StructType(
Array(
StructField("id", IntegerType, true),
StructField("name", StringType, true),
StructField("age", IntegerType, true)
)
)
上面的是string 要的是int ,一定要注意因為會經常出錯要轉化類型
val result = mess.map(_.split(",")).map(x => Row(x(0).toInt, x(1), x(2).toInt))df.select('name).show 這個在spark-shell 可以
或者df.select('name').show
但是代碼里面不行,需要隱士轉show源碼 默認是true 顯示小于等于20條,對應行中的字符 是false就全部顯示出來 show(30,false) 也是全部顯示出來不會截斷 show(5) 但是后面的多與20字符就不會顯示 你可以show(5,false)




df.select("name").show(false)
import spark.implicits._
//這樣不隱士轉換不行
df.select('name).show(false)
df.select($"name")
第一個select走的底層源碼是 第一個源碼圖
2,3個select走的源碼是第二個head 默認調第一條,你想展示幾條就調幾條


sort源碼默認升序 降序解釋中有


全局視圖加上 global_temp 規定


val spark = SparkSession.builder()
.appName("Test")
.master("local[2]")
.getOrCreate()
val mess = spark.sparkContext.textFile("file:///D:\\test\\person.txt")
import spark.implicits._
val result = mess.map(_.split(",")).map(x => Info(x(0).toInt,x(1),x(2).toInt)).toDF()
//在1.x 版本是可以的 在2.x不可以需要價格rdd
result.map(x => x(0)).show()
這樣寫是對的
result.rdd.map(x => x(0)).collect().foreach(println)
去類中的數據兩種寫法:
result.rdd.map(x => x(0)).collect().foreach(println)
result.rdd.map(x => x.getAs[Int]("id")).collect().foreach(println)對于分隔符 | 你切分一定要加轉義字符,否則數據不對
感謝各位的閱讀,以上就是“Spark SQL中的RDD與DataFrame轉換實例用法”的內容了,經過本文的學習后,相信大家對Spark SQL中的RDD與DataFrame轉換實例用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。