我试图创建一个基于少数条件的Map数组。以下是我的职责。即使我被提供 Map
斯卡拉强迫我 tuple
作为返回类型。有什么办法我能修好它吗?
def getSchemaMap(schema: StructType): Array[(String, String)] ={
schema.fields.flatMap {
case StructField(name, StringType, _, _) => Map(name-> "String")
case StructField(name, IntegerType, _, _) => Map(name-> "int")
case StructField(name, LongType, _, _) => Map(name-> "int")
case StructField(name, DoubleType, _, _) => Map(name-> "int")
case StructField(name, TimestampType, _, _) => Map(name-> "timestamp")
case StructField(name, DateType, _, _) => Map(name-> "date")
case StructField(name, BooleanType, _, _) => Map(name-> "boolean")
case StructField(name, _:DecimalType, _, _) => Map(name-> "decimal")
case StructField(name, _, _, _) => Map(name-> "String")
}
}
3条答案
按热度按时间hs1ihplo1#
使用
toMap
转换Array[(String, String)]
至Map[String, String]
:但实际上你不需要
flatMap
在这里,因为您将一个值Map到一个值,而不是将一个值Map到多个值。所以在这种情况下你可以map
值转换为元组,然后将元组列表转换为Maprks48beu2#
一切正常除了
flatmap
将转换为(flatten
)Array[Map(String, String)]
至Array[(String, String)]
.替换
flatmap
与map
.wvt8vs2t3#
如果我理解正确,您正在尝试将列(名称/类型对)提取到
Map[String, String]
. 您可以为此使用内置功能并利用现有api,因此我认为不需要任何自定义模式匹配。你可以用
df.schema.fields
或者df.schema.toDDL
如下所述:具有以下功能: