如何在scala spark中访问存储在数据框中的地图值和键

时间:2018-05-22 09:35:13

标签: scala apache-spark bigdata

我有一张表格,描述如下:

# 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

1 个答案:

答案 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))