支持Spark StructType的嵌套结构



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)

相关内容

  • 没有找到相关文章

最新更新