как выбрать внутри группы с помощью spark sql - PullRequest
2 голосов
/ 19 июня 2020

Я пытаюсь выбрать строку с требуемым значением в столбце, используя pyspark sql, но это дает мне ошибку

Ниже моя таблица session

session_id  status    session_desc
----------  ------    -----------------
session1    Old       first_description
session1    Active    last_description
session1    Old       next_description
session1    Active    inter_description
session2    Old       next_description
session2    Old       inter_description

Ниже это моя искра sql запрос

spark.sql("select session_id, (CASE WHEN status='Active' THEN session_desc END) AS session_description from session group by session_id").show()

Но я получаю ошибку ниже

org.apache.spark.sql.AnalysisException: expression 'session.status' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.;

Мне нужно, как показано ниже

session_id  session_description
----------  -------------------
session1    last_description      # can be inter_description as well (I don't care)
session2    null

1 Ответ

3 голосов
/ 19 июня 2020

Используйте case statement inside subquery, затем сгруппируйте по по внешнему запросу.

Example:

df.show()
#+----------+------+-----------------+
#|session_id|status|     session_Desc|
#+----------+------+-----------------+
#|  session1|   Old|first_description|
#|  session1|Active| last_description|
#|  session1|   Old| next_description|
#|  session1|Active|inter_description|
#|  session2|   Old| next_description|
#|  session2|   Old|inter_description|
#+----------+------+-----------------+

spark.sql("select session_id,last(session_desc)session_description from (\
select session_id,case when status='Active' THEN session_desc END as session_desc from tmp)t \
group by session_id").\
show()

#+----------+-------------------+
#|session_id|session_description|
#+----------+-------------------+
#|  session1|  inter_description|
#|  session2|               null|
#+----------+-------------------+
...