Scala 如何更改两级架构树中字段的数据类型?

Scala 如何更改两级架构树中字段的数据类型?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,现在我有了一个带有模式的数据框架: root |-- id: string (nullable = true) |-- st_one: struct (nullable = true) | |-- tid: long (nullable = true) | |-- st_two: struct (nullable = true) | | |-- name: string (nullable = true) | | |-- score: long (

现在我有了一个带有模式的数据框架:

root
 |-- id: string (nullable = true)
 |-- st_one: struct (nullable = true)
 |    |-- tid: long (nullable = true)
 |    |-- st_two: struct (nullable = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- score: long (nullable = true)
 |-- ts: double (nullable = true)
 |-- date: string (nullable = true)
我想将分数的类型从
long
更改为
double
。有什么好办法吗? 顺便说一句,我使用的是
Scala


我已经知道如何通过“列出”所有字段来做到这一点。我想要一个更常见的方法,即使Stu-2包含1000个或更多字段也可以使用。

您可以像这样更新struct-type列
st-u-one

val df1 = df.withColumn(
  "st_one",
  struct(
    $"st_one.tid",
    struct(
      $"st_one.st_two.name",
      $"st_one.st_two.score".cast("double").as("score")
    ).as("st_two")
  )
)

您可以执行复杂的强制转换:

val df2 = df.withColumn("st_one", $"st_one".cast("struct<tid:long, st_two:struct<name:string, score:double>>"))
val df2=df.withColumn(“st_one”,“st_one.”强制转换(“struct”))

谢谢!但这些代码基于已知字段或固定数量。例如,如果
st_two
包含1000个字段,我很难列出所有字段并选择要更新的字段。有没有更常用的方法来解决这个问题@blackbishop@Selyx这有点复杂,因为您必须遍历所有模式字段。请看我的,它可以给你一个如何做到这一点的想法。谢谢!但这些代码基于已知字段或固定数量。例如,如果st_2包含1000个字段,我很难列出所有字段并选择要更新的字段。有没有更常用的方法来解决这个问题@麦克