#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. Пожалуйста. Но если у вас есть другой ответ, не ставьте его в вопрос. Вместо этого создайте второй ответ, даже если вы ответите на свой собственный вопрос. Это будет понятнее для людей, которые посетят этот пост 😉