在Spark SQL 編程時瘟栖,經(jīng)常需要對獲取的DataFrame 對象進(jìn)行map 操作。map 基于的元素是Row. 那么如何操作Row呢?
1. 使用Row 提供的 get方法,獲取需要的列
2. 使用類型匹配介粘,顯示的聲明列的類型
3. 使用類型匹配和樣例類
1. get 方法
val df = spark.sql("select id,idType,sid from graph")
val df1 = df.map(_.getString(0)) // 可通過占位符獲取指定元素,當(dāng)只能返回一個
val df2 = df.filter(_.getString(1) != "1")
val df3 = df.filter(_.getString(1)!= "1" && true) // 占位符只能使用一次
val df4 = df.map(x=>(x.getString(0),x.getString(1))).toDF("id","idType")
val df5 = df.map(x=> {
val id = x.getString(0)
val idType = x.getString(1)
val sid = x.getString(2)
val mock = (id+idType).hashCode
(mock,sid)
}).toDF("mock","sid")
2. 使用類型匹配晚树,并聲明列的類型
import org.apache.spark.sql.Row
val df = spark.sql("select id,idType,sid from graph")
val df_ = df.map{case Row(id:String,idType:String,sid:String) => (id,idType,sid)}
3. 使用類型匹配姻采,樣例類什么列的類型
val df = spark.sql("select id,idType,sid from graph")
case class graph(id:String,idType:String,sid:String)
val df_ = df.as[graph].map(x=> (x.id,x.idType,x.sid))
4. 結(jié)合Schema 的寫法
val df = spark.sql("select id,idType,sid from graph")
// 以下代碼等價與 df.select("id","idType")
val schema = df.schema.map(_.name).filter(_.contains("id"))
df.map(x=>{
val cList = new ListBuffer[String]
for(c<- schema) cList.append(x.getAs(c))
cList.toList
})
總結(jié):
由于Spark 提供的API豐富多樣,Scala 語言本身又支持類型匹配爵憎,解析一個數(shù)據(jù)結(jié)構(gòu)的方法多種多樣慨亲,可根據(jù)習(xí)慣,愛怎么寫宝鼓,怎么寫刑棵。