scala - Scala 将 map 隐式转换为 Tuple
问题描述
我正在尝试根据几个条件创建一个地图数组。以下是我的功能。即使我被提供了Map
scala 强制我有一个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")
}
}
解决方案
用于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
}
推荐阅读
- apache-spark - 无法在 pyspark 上运行查询
- snowflake-cloud-data-platform - 为什么雪花中的 Information_schema 查询如此缓慢,有什么方法可以加快它们的速度吗?
- reactjs - cypress waitForReact() require.resolve 不是函数
- javascript - Javascript图片上传问题
- javascript - 如何比较传递给间谍方法的参数
- wordpress - 使用 ACF 字段过滤的 Woo-commerce 展示产品
- javascript - Javascript 验证,然后显示元素
- c# - 我如何检查队列
基于指定的数字是否已满? - android - 应用程序因 Delphi 上的前台服务而崩溃
- reactjs - 在 React 中使用登录和注销的用户渲染组件