как получить доступ к значениям карты и ключам, хранящимся во фрейме данных в Scala Spark - PullRequest
0 голосов
/ 22 мая 2018

У меня есть таблица, описание которой выглядит следующим образом:

# 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 голосов
/ 23 мая 2018

Вы можете сделать это:

val newDF = oldDF.select(col("id"), col("persona_model")("Tech")("score").as("temp"))

, тогда вы можете легко извлечь temp значений.

update : если у вас большеодин ключ, тогда процедура немного сложнее.

сначала создайте класс для структуры (необходимо для приведения типа):

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))
...