我有一张表格,描述如下:
# col_name data_type comment
id string
persona_model map<string,struct<score:double,tag:string>>
# Partition Information
# col_name data_type comment
process_date string
示例行将是这样的(制表符分隔):
000000E91010441BB122402A45D439E7 {"Tech":{"score":0.21678,"tag":"OTHERS"}} 2018-05-16-01
现在我想构建另一个表格,其中只有2列id
及其各自的score
。
我怎样才能在scala spark中做到这一点?
此外,最让我烦恼的是我如何才能访问特定的score
,如何将其存储在整数变量中,可以说temp
?
答案 0 :(得分:0)
你可以这样做:
val newDF = oldDF.select(col("id"), col("persona_model")("Tech")("score").as("temp"))
然后您可以轻松提取 temp 值。
更新:如果您有多个密钥,则该过程会稍微复杂一些。
首先为结构创建一个类(类型转换必需品):
case class Score(score: Double, tag: String)
然后从数据中提取所有密钥:
val keys = oldDF.rdd
.flatMap(r => r.getMap(1).asInstanceOf[Map[String, Score]].toList)
.collect.map(_._1).distinct.toList
最后你可以提取所有这样的名字:
def condition(keys: List[String]): Column = {
keys match {
case k::ks => when(col("persona_model")(k)("score").isNotNull, col("persona_model")(k)("score")).otherwise(condition(ks))
case nil => lit(null)
}
}
val newDF = oldDF.select(col("id"), condition(keys))