[英]Encoder[Row] in Scala Spark
我正在嘗試在 Spark 2.0.0 中的Dataset[Row]
( DataFrame
) 上執行一個簡單的映射。 像這樣簡單的事情
val df: DataSet[Row] = ...
df.map { r: Row => r }
但是編譯器抱怨我沒有向 map 函數提供隱式Encoder[Row]
參數:
方法映射的參數不足:(隱式證據 $7:編碼器 [行])。
如果我首先轉換為 RDD,一切正常ds.rdd.map { r: Row => r }
但不應該有一種簡單的方法來獲得Encoder[Row]
就像元組類型Encoders.product[(Int, Double)]
?
[請注意,我的Row
是動態調整大小的,因此無法輕松將其轉換為強類型Dataset
。]
Encoder
需要知道如何打包Row
的元素。 因此,您可以使用row.structType
編寫自己的Encoder[Row]
,它在運行時確定Row
的元素並使用相應的解碼器。
或者,如果您對進入Row
的數據有更多了解,可以使用https://github.com/adelbertc/frameless/
SSry“有點”晚了。 希望這對現在遇到問題的人有所幫助。 定義編碼器的最簡單方法是從現有 DataFrame 派生結構:
val df = Seq((1, "a"), (2, "b"), (3, "c").toDF("id", "name")
val myEncoder = RowEndocer(df.schema)
當您需要更改原始 DataFrame 中的現有字段時,這種方法可能很有用。
如果您正在處理全新的結構,則依賴StructType
和StructField
顯式定義(如@Reactormonk 的小神秘響應中所建議的那樣)。
定義相同編碼器的示例:
val myEncoder2 = RowEncoder(StructType(
Seq(StructField("id", IntegerType),
StructField("name", StringType)
)))
請記住org.apache.spark.sql._
, org.apache.spark.sql.types._
和org.apache.spark.sql.catalyst.encoders.RowEncoder
庫必須被導入。
在映射函數不更改架構的特定情況下,您可以傳入 DataFrame 本身的編碼器:
df.map(r => r)(df.encoder)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.