Как я могу вернуть список ключей, если значения соответствуют условию в Spark SQL (версия

#sql #apache-spark #dictionary #apache-spark-sql #key-value

Вопрос:

В Spark SQL (версия:

 {"'12'": "False", "'18'": "False", "'9'": "True", "'586'": "True", "'4345'": "False", "'564'": "True", "'555'": "True", "'1'": "False"}
 

Я хотел бы вернуть только Ключи с Value = "True" собой . Например, я хотел бы вернуться:
[9, 586, 564, 555] .

Я хотел бы избежать тяжелых манипуляций со строками, если это возможно, из-за проблем во время создания запроса.

###Обновление с ответом в Spark-SQL:

 select 
  collect_list(keys)
from (
  select
    keys
  from my_table
  lateral view explode(my_column_with_map) f as keys, values
  where values="True"
 ) 
 

Ответ №1:

Одним из подходов было бы использовать разнесение на карте, удалить False значения, а затем использовать group by и collect_list для формирования нужного массива.

В scala это можно было бы написать так:

 // generating data
val m = Map(12 -> false, 18 -> false, 9 -> true, 586 -> true, 4345 -> false,
            564 -> true, 555 -> true, 1 -> false)
val df = Seq(0, m).toDF("id", "my_map")

// and filtering out the false values
df.select('id, explode('my_map))
  .where('value) // or where('value === "True") if you deal with strings
  .groupBy('id)
  .agg(collect_list('key) as "my_seq")
  .show(false)
 

что дает:

  --- ------------------ 
|id |my_seq            |
 --- ------------------ 
|0  |[555, 9, 586, 564]|
 --- ------------------ 
 

Комментарии:

1. также добавлен ответ выше на случай, если он кому-то понадобится в Spark SQL

2. Пожалуйста. Но если у вас есть другой ответ, не ставьте его в вопрос. Вместо этого создайте второй ответ, даже если вы ответите на свой собственный вопрос. Это будет понятнее для людей, которые посетят этот пост 😉