假设我们有一个 DataFrame
有一列 map
类型。将其转换为 struct
(或者,等价地,用相同的键和值定义一个新列,但作为 struct
类型)?请参见以下内容 spark-shell
(2.4.5)会话,以一种极其低效的方式进行:
val df = spark.sql("""select map("foo", 1, "bar", 2) AS mapColumn""")
val jsonStr = df.withColumn("jsonized", to_json($"mapColumn")).select("jsonized").collect()(0)(0).asInstanceOf[String]
spark.read.json(Seq(jsonStr).toDS()).show()
+---+---+
|bar|foo|
+---+---+
| 2| 1|
+---+---+
现在,很明显 collect()
是非常低效的,这通常是一个可怕的方式做事情的Spark。但实现这种转化的首选方法是什么? named_struct
以及 struct
两者都采用一系列参数值来构造结果,但我找不到任何方法来“展开”Map键/值以将它们传递给这些函数。
3条答案
按热度按时间mkh04yzy1#
我会用
explode
功能:+--------+
| struct|
+--------+
|[foo, 1]|
|[bar, 2]|
+--------+
root
|-- struct: struct (nullable = false)
| |-- key: string (nullable = false)
| |-- value: integer (nullable = false)
xv8emn3q2#
我看到了@chlebek的答案,但如果它应该放在一行中,你可以使用自定义项
0wi1tuuw3#
定义案例类