簡體   English   中英

Scala Spark 中的編碼器[行]

[英]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 中的現有字段時,這種方法可能很有用。

如果您正在處理全新的結構,則依賴StructTypeStructField顯式定義(如@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM