如何在Spark 2.1中为集合编写编码器?

时间:2017-03-11 13:12:57

标签: apache-spark apache-spark-encoders

我有这个:

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

1 个答案:

答案 0 :(得分: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(...))))

或对所有字段使用静态编码器。