我当前的问题是以下问题...
Exception in thread "main" org.apache.spark.sql.AnalysisException: expression 'mapField' cannot be used as a grouping expression because its data type map<string,string> is not an orderable data type.;;
我想要实现的基本上只是在DataFrame中按给定的一组列对条目进行分组,但是在与MapType列(如前所述)进行分组时似乎失败了。
.groupBy(
...
"mapField",
...
)
我有几个主意,但必须有一种比我之前考虑的解决方案更简单的方法来解决此问题...
我已经将每个元素的键值保存在DF的串联字符串中,所以我可以将其解析为Map,然后使用withColumn
保存,但是没有找到任何方法,我也无法使我工作。这样做合理吗?
解析为RDD并将其分组,然后返回DF(我认为太麻烦了)
编辑
示例输入
id | myMap
'sample' | Map('a' -> 1, 'b' -> 2, 'c' -> 3)
所需的输出
id | a | b | c
'sample' | 1 | 2 | 3
答案 0 :(得分:2)
下一步可以使用map_values
和map_keys
:
import org.apache.spark.sql.functions.{map_values, map_keys}
val df = Seq(
(Map("k1"->"v1"), 12),
(Map("k2"->"v2"), 11),
(null, 10)
).toDF("map", "id")
df.select(map_values($"map")).show
// +---------------+
// |map_values(map)|
// +---------------+
// | [v1]|
// | [v2]|
// | null|
// +---------------+
df.select(map_keys($"map")).show
// +-------------+
// |map_keys(map)|
// +-------------+
// | [k1]|
// | [k2]|
// | null|
// +-------------+
df.withColumn("key", map_keys($"map").getItem(0)).show
// +----------+---+----+
// | map| id| key|
// +----------+---+----+
// |[k1 -> v1]| 12| k1|
// |[k2 -> v2]| 11| k2|
// | null| 10|null|
// +----------+---+----+
或直接与groupBy
:
df.groupBy(map_keys($"map").getItem(0)).count()