How to write an Encoder for a collection in 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)]] = ....
For the inner tuple in the Array
Я могу написать:
val rowEncoder = RowEncoder(mydata.schema)
Encoders.tuple(Encoders.STRING, rowEncoder)
but how can I write the Encoder
для внешнего Array
?
1 ответ
Вам нужно будет либо использовать 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(...))))
или используйте статический кодировщик для всех полей.