在 Scala 中将 Struct 数据类型转换为 Map 数据类型

Posted

技术标签:

【中文标题】在 Scala 中将 Struct 数据类型转换为 Map 数据类型【英文标题】:Convert Struct data type to Map data type in Scala 【发布时间】:2019-07-31 05:27:38 【问题描述】:

如何将数据类型为 struct 的列转换为 Map 或 String。这是架构:

root
 |-- Col1: string (nullable = true)
 |-- Col2: struct (nullable = true)
 |    |-- _1: string (nullable = true)
 |    |-- _2: integer (nullable = false)

当我想将数据框转储到文件中时,第二列会出现问题。我尝试了许多不同的方法,例如转换为字符串,但它改变了第二列中的值。我也尝试将 Col2 转换为地图,但没有成功。

我试图通过 udf 获取 struct(_1) 中的第一个值,但它有错误:

执行用户定义函数失败($anonfun$1: (struct) => string)

【问题讨论】:

【参考方案1】:
Select Col1, Col2._1, Col2._2 from <your table>

通过 spark.sql,你可以试试这个并将其保存到另一个数据帧,然后写入 CSV。

【讨论】:

谢谢!这是我在 Scala 中使用您的建议的方式: var df_new = df_old.select($"col1", $"col2._1", $"col2._2")【参考方案2】:

在 Scala 中我们可以这样做:

val df_new = df_old.select($"Col1", $"Col2._1", $"Col3._2")

【讨论】:

在 scala 中使用 var 不是一个好习惯,除非您打算使 df_new 可变【参考方案3】:

您还可以使用 * 表示法来扩展 Struct 数据类型中的所有列。

架构

root
|-- address: struct (nullable = false)
|    |-- street: string (nullable = true)
|    |-- city: string (nullable = true)
|    |-- state: string (nullable = true)

扩展 SQL

val df1 = df.select("address.*").show(false)
df1.printSchema
root
 |-- street: string (nullable = true)
 |-- city: string (nullable = true)
 |-- state: string (nullable = true)

【讨论】:

以上是关于在 Scala 中将 Struct 数据类型转换为 Map 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark SQL 中将结构转换为映射

使用 Spark Scala 将 Sql Server 数据类型转换为 Hive 数据类型

在 Scala 中将 JSON 转换为 CSV?

如何在Scala中将rdd对象转换为数据框

如何在 Scala 中将数据帧转换为 Apache Spark 中的数据集?

在scala数据框中将日期格式从MM / dd / yyyy转换为yyyyMMdd [重复]