Spark dataframe - 将结构列拆分为 2 列
Spark dataframe - Split struct column into 2 columns
上下文
我有一个数据框包含 (我认为是) 对 (String, String)
。
看起来像这样:
> df.show
| Col1 | Col2 |
| A | [k1, v1]|
| A | [k2, v2]|
> df.printSchema
|-- _1: string (nullable = true)
|-- _2: struct (nullable = true)
| |-- _1: string (nullable = true)
| |-- _2: string (nullable = true)
Col2
用于包含一个 Map[String, String]
,我在其上做了一个 toList()
,然后 explode()
以获得原始地图中存在的每个映射的一行。
问题
我想将 Col2
拆分为 2 列并获取此数据框:
| Col1 | key | value |
| A | k1 | v1 |
| A | k2 | v2 |
有人知道怎么做吗?
或者,有谁知道如何将地图分解+拆分为多行(每个映射一个)和 2 列(一个用于键,一个用于值)。
我试过的东西/错误
我尝试将通常成功的模式与 (String, String)
一起使用,但这不起作用:
df.select("Col1", "Col2").
map(r =>(r(0).asInstanceOf[String],
r(1).asInstanceOf[(String, String)](0),
r(1).asInstanceOf[(String, String)](1)
)
)
Caused by: java.lang.ClassCastException:
org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to scala.Tuple2
==> 我猜 Col2 的类型是 org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema
,找不到为此的 spark / scala 文档。
即使这样可行,也会出现使用索引不是访问元组元素的正确方法的问题...
谢谢!
您可以使用select投影结构的每个元素来解压它。
df.select($"Col1", $"Col2._1".as("key"), $"Col2._2".as("value"))
您只需添加另一种方法即可:
df.withColumn("key", $"Col2._1")
.withColumn("value", $"Col2._2")
上下文
我有一个数据框包含 (我认为是) 对 (String, String)
。
看起来像这样:
> df.show
| Col1 | Col2 |
| A | [k1, v1]|
| A | [k2, v2]|
> df.printSchema
|-- _1: string (nullable = true)
|-- _2: struct (nullable = true)
| |-- _1: string (nullable = true)
| |-- _2: string (nullable = true)
Col2
用于包含一个 Map[String, String]
,我在其上做了一个 toList()
,然后 explode()
以获得原始地图中存在的每个映射的一行。
问题
我想将 Col2
拆分为 2 列并获取此数据框:
| Col1 | key | value |
| A | k1 | v1 |
| A | k2 | v2 |
有人知道怎么做吗?
或者,有谁知道如何将地图分解+拆分为多行(每个映射一个)和 2 列(一个用于键,一个用于值)。
我试过的东西/错误
我尝试将通常成功的模式与 (String, String)
一起使用,但这不起作用:
df.select("Col1", "Col2").
map(r =>(r(0).asInstanceOf[String],
r(1).asInstanceOf[(String, String)](0),
r(1).asInstanceOf[(String, String)](1)
)
)
Caused by: java.lang.ClassCastException:
org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to scala.Tuple2
==> 我猜 Col2 的类型是 org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema
,找不到为此的 spark / scala 文档。
即使这样可行,也会出现使用索引不是访问元组元素的正确方法的问题...
谢谢!
您可以使用select投影结构的每个元素来解压它。
df.select($"Col1", $"Col2._1".as("key"), $"Col2._2".as("value"))
您只需添加另一种方法即可:
df.withColumn("key", $"Col2._1")
.withColumn("value", $"Col2._2")