架构为:
我想要这样的最终结果:
即,在enum Result{
case success(code:Int)
case fail(err:NSError)
}
var result = Result.success(code: 3)
switch result {
case .success(let code):// first
case let .success(code)://second
print("success",code)
default:
print("fail")
}
中的_1: integer
和_2: map
之间创建映射。
如何在Scala Spark中做到这一点?
答案 0 :(得分:1)
这是一种解决方案。首先,让我们创建一些与您的样本数据类似的样本数据,但是,发布一个具有可重复的输入和输出数据的问题会更加有用,如here所述。
val df = Seq(
(999, "2019-05-23", Seq((0,Map(2154 -> 0.545)))),
(511, "2019-06-30", Seq((1,Map(564654 -> 0.255699)))),
(322, "2019-02-10", Seq((2,Map(122 -> 0.896)))))
.toDF("user_id","dt", "site_group_collect")
// +-------+----------+---------------------------+
// |user_id|dt |site_group_collect |
// +-------+----------+---------------------------+
// |999 |2019-05-23|[[0, [2154 -> 0.545]]] |
// |511 |2019-06-30|[[1, [564654 -> 0.255699]]]|
// |322 |2019-02-10|[[2, [122 -> 0.896]]] |
// +-------+----------+---------------------------+
然后,我们遍历每个项目并使用数据框的site_group_collect
函数转换map
的值:
df.map{case Row(uid: Int, dt: String, group: Seq[Row]) =>
val transformed = group.map{ r => Map(r.getInt(0) -> r.get(1).asInstanceOf[Map[Int, Double]]) }
(uid, dt, transformed)
}
.toDF("user_id","dt", "site_group_collect")
.show(false)
// +-------+----------+-----------------------------+
// |user_id|dt |site_group_collect |
// +-------+----------+-----------------------------+
// |999 |2019-05-23|[[0 -> [2154 -> 0.545]]] |
// |511 |2019-06-30|[[1 -> [564654 -> 0.255699]]]|
// |322 |2019-02-10|[[2 -> [122 -> 0.896]]] |
// +-------+----------+-----------------------------+
这里的关键是将元组[[0, [2154 -> 0.545]]]
表示为Row
数组。另一种方法是将元组表示为case class
,即:
case class Item(pk: Int, m: Map[Int, Double])
该行:
val transformed = group.map{ r => Map(r.getInt(0) -> r.get(1).asInstanceOf[Map[Int, Double]]) }
将从现有元组中提取key/value
组合,并将其分配给新创建的Map
。
一些相关帖子: