我想通過首先將其轉換為包含較少列的資料集來更新 spark 資料框的架構。背景:我想從模式中洗掉一些深度嵌套的欄位。
我嘗試了以下但架構沒有改變:
import org.apache.spark.sql.functions._
val initial_df = spark.range(10).withColumn("foo", lit("foo!")).withColumn("bar", lit("bar!"))
case class myCaseClass(bar: String)
val reduced_ds = initial_df.as[myCaseClass]
架構仍然包括其他欄位:
reduced_ds.schema // StructType(StructField(id,LongType,false),StructField(foo,StringType,false),StructField(bar,StringType,false))
有沒有辦法以這種方式更新架構?
這也讓我感到困惑,當我收集資料集時,它只回傳案例類中定義的欄位:
reduced_ds.limit(1).collect() // Array(myCaseClass(bar!))
uj5u.com熱心網友回復:
添加一個假操作以使用預定義的函式map強制投影:identity
import org.apache.spark.sql.functions._
val initial_df = spark.range(10).withColumn("foo", lit("foo!")).withColumn("bar", lit("bar!"))
case class myCaseClass(bar: String)
val reduced_ds = initial_df.as[myCaseClass].map(identity)
這產生
reduced_ds.schema // StructType(StructField(bar,StringType,true))
uj5u.com熱心網友回復:
在檔案中:https ://spark.apache.org/docs/latest/api/scala/org/apache/spark/sql/Dataset.html#as[U](implicitvidence$2:org.apache.spark.sql .Encoder[U]):org.apache.spark.sql.Dataset[U] 它說:
請注意,as[] 僅更改傳遞給型別化操作(例如 map())的資料視圖,并且不會急切地投影出指定類中不存在的任何列。
為了實作你想做的事情,你需要
initial_df.select(the columns in myCaseClass).as[myCaseClass]
這是正常的,因為當你收集 reduce_ds 時它回傳型別 myCaseClass 的記錄,myCaseClass 只有一個名為 bar 的屬性。這與資料集模式是其他東西這一事實并不沖突
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/526760.html
標籤:斯卡拉阿帕奇火花apache-spark-sql数据集
