Pyspark: как сделать запрос, который возвращает только идентификаторы с записями больше одного? - PullRequest
0 голосов
/ 25 марта 2020

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

Timestamp,  Name,    Value  
1577862435, Tom,      0.25  
1577915618, Tom,      0.50  
1577839734, John,     0.34
1577839734, John,     0.34
1577839734, John,     0.34
1577839734, Eric,     0.34

Чтобы подсчитать записи для каждого пользователя, я делаю

query = """ SELECT ID,
            COUNT(*) AS `num`
            FROM
            myTable
            GROUP BY Name
            ORDER BY num DESC
"""
count = spark.sql(query)
count.show()

Name    num
John     3
Tom      2
Eric     1

Я бы запросил, что ID арендной платы имеют num>=2. Мой финальный стол должен быть:

Timestamp,  Name,    Value  
1577862435, Tom,      0.25  
1577915618, Tom,      0.50  
1577839734, John,     0.34
1577839734, John,     0.34
1577839734, John,     0.34

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Вы можете написать это как SQL:

SELECT ID, Name, num
FROM (SELECT t.*, COUNT(*) OVER (PARTITION BY Name) AS num
      FROM myTable t
     ) t
WHERE num >= 2;
0 голосов
/ 25 марта 2020

тогда вы должны использовать оконные функции.

from pyspark.sql import Window 

df = spark.table("myTable")

df.withColumn(
    "cnt", 
    F.count('*').over(Window.partitionBy("Name"))
).where("cnt > 1").drop("cnt").show()
...