2017-03-11 73 views
0

我有這樣的:如何在Spark 2.1中編寫集合的編碼器?

import spark.implicits._ 
import org.apache.spark.sql.catalyst.encoders.RowEncoder 

val mydata: Dataset[Row] = spark.read.format("csv").option("header", true).option("inferSchema", true).load("mydata.csv") 
// CSV header: Time,Area,City 
// CSV values: "2016-01","A1","NY" 
//    "2016-01","AB","HK" etc 

// ...somewhere in my aggregate: 
def bufferEncoder: Encoder[Array[(String, Row)]] = .... 

對於在Array內的元組我可以這樣寫:

val rowEncoder = RowEncoder(mydata.schema) 
Encoders.tuple(Encoders.STRING, rowEncoder) 

,但我怎麼能寫Encoder的外Array

+0

你能給出一個可重複的例子嗎? my.data中有什麼? – mtoto

回答

0

你需要要麼使用RowEncoder完整結構:

val enc = RowEncoder(StructType(Seq(
    StructField("data", ArrayType(
     StructType(Seq(StructField("k", StringType), 
     StructField("v", df.schema)))))))) 

,並轉換數據,以反映這一點:

Row(Seq(Row(string, Row(...), Row(sting, Row(...)))) 

或使用靜態編碼器的所有字段。

+0

我不確定我是否理解你的答案。我已經能夠轉換單個「行」。我的問題是'Array'。 – Randomize

相關問題