Давайте упростим вашу ситуацию для вашего массива контактов.Вот в чем проблема.Вы пытаетесь использовать эту схему:
val schema = new StructType()
.add("contacts", new StructType(
Array(
StructField("contactType", StringType),
StructField("areaCode", StringType),
StructField("number", StringType)
)))
для хранения списка контактов, который является структурным типом.Тем не менее, эта схема не может содержать список, только один контакт.Мы можем проверить это с помощью:
spark.createDataFrame(sc.parallelize(Seq[Row]()), schema).printSchema
root
|-- contacts: struct (nullable = true)
| |-- contactType: string (nullable = true)
| |-- areaCode: string (nullable = true)
| |-- number: string (nullable = true)
В самом деле, Array
, который вы имеете в своем коде, предназначен для того, чтобы содержать поля вашего типа структуры "contacts".Вы хотите, тип существует: ArrayType
.Это дает немного другой результат:
val schema_ok = new StructType()
.add("contacts", ArrayType(new StructType(Array(
StructField("contactType", StringType),
StructField("areaCode", StringType),
StructField("number", StringType)))))
spark.createDataFrame(sc.parallelize(Seq[Row]()), schema_ok).printSchema
root
|-- contacts: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- contactType: string (nullable = true)
| | |-- areaCode: string (nullable = true)
| | |-- number: string (nullable = true)
, и он работает:
val row = Row(Array(
Row("type", "code", "number"),
Row("type2", "code2", "number2")))
spark.createDataFrame(sc.parallelize(Seq(row)), schema_ok).show(false)
+-------------------------------------------+
|contacts |
+-------------------------------------------+
|[[type,code,number], [type2,code2,number2]]|
+-------------------------------------------+
Так что, если вы обновляете схему этой версией «контактов», просто замените val contacts = Row(homeContact,workContact)
на val contacts = Array(homeContact,workContact)
и это должно работать.
Примечание: если вы хотите пометить свои контакты (HOME или WORK), существует также тип MapType
.