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