在 Spark 中使用 Scala - 當我們必須將 RDD[Row] 轉換為 DataFrame 時。為什么我們必須將 RDD[Row] 轉換為案例類的 RDD 或元組的 RDD 才能使用 rdd.toDF() 沒有為 RDD[Row] 提供它的任何具體原因
object RDDParallelize {
def main(args: Array[String]): Unit = {
val spark:SparkSession = SparkSession.builder().master("local[1]")
.appName("learn")
.getOrCreate()
val abc = Row("val1","val2")
val abc2 = Row("val1","val2")
val rdd1 = spark.sparkContext.parallelize(Seq(abc,abc2))
import spark.implicits._
rdd1.toDF() //doesn't work
}
}
uj5u.com熱心網友回復:
這是令人困惑的,因為 toDF 方法存在隱式轉換。您可能已經看到,toDF 不是 Rdd 類的方法,但它是在 DatasetHolder 中定義的,您在 SQLImplicits 中使用 rddToDatasetHolder 將您創建的 rdd 轉換為 DatasetHolder。如果您查看方法 rddToDatasetHolder,
implicit def rddToDatasetHolder[T : Encoder](rdd: RDD[T]): DatasetHolder[T] = {
DatasetHolder(_sqlContext.createDataset(rdd))
}
你會看到它需要一個編碼器的 T 是
用于將 T 型別的 JVM 物件與內部 Spark SQL 表示形式相互轉換。
如果您嘗試將 Rdd[Row] 轉換為 Datasetholder,您將需要一個編碼器來告訴 spark 您如何將 Row 物件轉換為內部 SQL 表示。然而
通過匯入 spark.implicits 支持原始型別(Int、String 等)和產品型別(案例“ ”類)。未來版本中將添加對序列化其他型別“ ”的支持
spark 沒有任何 Row 型別的編碼器,因此這種轉換從未成功完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/508559.html
