首页 > 解决方案 > Scala 将 map 隐式转换为 Tuple

问题描述

我正在尝试根据几个条件创建一个地图数组。以下是我的功能。即使我被提供了Mapscala 强制我有一个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")

    }
  }

标签: scalaapache-spark

解决方案


用于toMap转换Array[(String, String)]Map[String, String]

def getSchemaMap(schema: StructType): Map[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")
  }.toMap
}

但实际上您不需要在flatMap这里使用,因为您将一个值映射到一个值,而不是将值映射到多个值。因此,对于这种情况,您可以只map将值转换为元组,然后将元组列表转换为 Map

def getSchemaMap(schema: StructType): Map[String, String] = {
  schema.fields.map {
    case StructField(name, StringType, _, _) => name -> "String"
    case StructField(name, IntegerType, _, _) => name -> "int"
    case StructField(name, LongType, _, _) => name -> "int"
    case StructField(name, DoubleType, _, _) => name -> "int"
    case StructField(name, TimestampType, _, _) => name -> "timestamp"
    case StructField(name, DateType, _, _) => name -> "date"
    case StructField(name, BooleanType, _, _) => name -> "boolean"
    case StructField(name, _: DecimalType, _, _) => name -> "decimal"
    case StructField(name, _, _, _) => name -> "String"
 }.toMap
}

推荐阅读