Spark的StructType#add
方法的javadocs显示,第二个参数需要是一个扩展DataType
的类。
我有一个情况,我需要添加一个相当复杂的MapType
作为StructType
上的字段。
具体来说,这个MapType
字段是几个嵌套结构的映射:
Map<String,Map<Integer,Map<String,String>>>
因此它是一个包含2个嵌套/内部映射的映射。最内层的映射类型为Map<String,String>
(在Spark中称为MapType[StringType,StringType]
)。
中间的映射类型是Map<Integer,Map<String,String>>
(也就是Spark的说法,MapType[IntegerType,MapType[StringType,StringType]]
)。
在调用StructType#add
方法时,我如何指定这个复杂的映射嵌套结构?
也就是说,我希望能够做这样的事情:
var myStruct : StructType = new StructType()
myStruct.add("complex-o-map",
MapType[StringType,MapType[IntegerType,MapType[StringType,StringType]]])
然而,它看起来只像我可以添加一个最外面的MapType
:
var myStruct : StructType = new StructType()
myStruct.add("complex-o-map", MapType)
这让我很伤心。如何在调用add(...)
期间指定嵌套映射结构?
MapType
所期望的"类型"(例如:g StringTypes
, MapType
)在Scala意义上并不是真正的类型,它们是对象,所以您应该将它们作为构造函数参数传递,而不是作为类型参数传递——换句话说,使用()
代替[]
:
val myStruct = new StructType().add("complex-o-map",
MapType(StringType,MapType(IntegerType,MapType(StringType,StringType))))
myStruct.printTreeString()
// prints:
// root
// |-- complex-o-map: map (nullable = true)
// | |-- key: string
// | |-- value: map (valueContainsNull = true)
// | | |-- key: integer
// | | |-- value: map (valueContainsNull = true)
// | | | |-- key: string
// | | | |-- value: string (valueContainsNull = true)