Scala 无法在Spark中分解()映射[String,Struct]

Scala 无法在Spark中分解()映射[String,Struct],scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我已经为此挣扎了一段时间,但仍然无法下定决心 我正在尝试将平面映射(或者使用.withColumn替换为explode(),因为这样看起来更容易,所以我不会丢失列名),但我总是得到错误UDTF预期有2个别名,但改为“name” 我重温了一些类似的问题,但没有一个能说明问题,因为它们的模式太简单了 我正在尝试执行flatMap的模式的列如下所示 StructField(CarMake, StructType( List( StructField( Model

我已经为此挣扎了一段时间,但仍然无法下定决心

我正在尝试将平面映射(或者使用
.withColumn
替换为
explode()
,因为这样看起来更容易,所以我不会丢失列名),但我总是得到错误
UDTF预期有2个别名,但改为“name”

我重温了一些类似的问题,但没有一个能说明问题,因为它们的模式太简单了

我正在尝试执行flatMap的模式的列如下所示

StructField(CarMake,
  StructType(
    List(
      StructField(
        Models,
        MapType(
          StringType,
          StructType(
            List(
              StructField(Variant, StringType),
              StructField(GasOrPetrol, StringType)
            )
          )
        )
      )
    )
  ))
我试图通过像这样调用explode()来实现

carsDS
      .withColumn("modelsAndVariant", explode($"carmake.models"))
…是实现一个没有嵌套映射和结构的行,所以我得到的行数和变量数一样多

示例输入

(country: Sweden, carMake: Volvo, carMake.Models: {"850": ("T5", "petrol"), "V50": ("T5", "petrol")})
(country: Sweden, carMake: Volvo, Model: "850", Variant: "T5", GasOrPetrol: "petrol"}
(country: Sweden, carMake: Volvo, Model: "V50", Variant: "T5", GasOrPetrol: "petrol"}
示例输出

(country: Sweden, carMake: Volvo, carMake.Models: {"850": ("T5", "petrol"), "V50": ("T5", "petrol")})
(country: Sweden, carMake: Volvo, Model: "850", Variant: "T5", GasOrPetrol: "petrol"}
(country: Sweden, carMake: Volvo, Model: "V50", Variant: "T5", GasOrPetrol: "petrol"}
基本上将嵌套贴图及其内部结构保留在同一级别。

尝试以下操作:

case class Models(variant:String, gasOrPetrol:String)
case class CarMake(brand:String, models : Map[String, Models] )
case class MyRow(carMake:CarMake)

val df = List(
  MyRow(CarMake("volvo",Map(
    "850" -> Models("T5","petrol"),
    "V50" -> Models("T5","petrol")
  )))
).toDF()

df.printSchema()

df.show()
给予

现在分解,请注意
with column
不起作用,因为地图上的
èxplode
返回两列(
),所以需要使用
选择

val cols: Array[Column] = df.columns.map(col)

df
  .select((cols:+explode($"carMake.models")):_*)
  .select((cols:+$"key".as("model"):+$"value.*"):_*)
  .show()
给出:

+--------------------+-----+-------+-----------+
|             carMake|model|variant|gasOrPetrol|
+--------------------+-----+-------+-----------+
|[volvo, [850 -> [...|  850|     T5|     petrol|
|[volvo, [850 -> [...|  V50|     T5|     petrol|
+--------------------+-----+-------+-----------+

请添加一些可用于回答问题的示例数据(代码)(即,以编程方式创建的数据框架)参见例如,非常感谢您的快速回答!很抱歉没有为快速测试提供代码,我不得不匆忙离开,直到现在才回来,非常感谢:)