Как посчитать, сколько раз появляется конкретная текстовая строка и группировать ее по другим столбцам - PullRequest
0 голосов
/ 10 июля 2019

У меня есть таблица population_table, которая содержит столбцы с user_id, provider_name и city. Я хочу посчитать, сколько раз пользователь появлялся в каждом городе на каждого провайдера. Так, например, я бы хотел, чтобы вывод выглядел примерно так:

provider_name |  Users |  Atlanta | Chicago | New York
______________________________________________________
Alpha            100        50         25        25
Beta             200       100         75        25
Kappa            500       300        100       100

Я пытался использовать:

select provider_name, count (distinct user_id) AS Users, count(city) AS City 
from population_table
group by provider_name

Как мне написать этот запрос, чтобы получить распределение пользователей по провайдерам по городам?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Я думаю, вы хотите условную агрегацию.Из вашего описания не ясно, что count(distinct) необходимо.Поэтому я бы попробовал сначала:

select provider_name, count(*) AS Users,
       sum(case when city = 'Atlanta' then 1 else 0 end) as Atlanta,
       sum(case when city = 'Chicago' then 1 else 0 end) as Chicago,
       sum(case when city = 'New York' then 1 else 0 end) as New_York
from population_table
group by provider_name;

Если необходимо count(distinct):

select provider_name, count(distinct user_id) AS Users,
       count(distinct case when city = 'Atlanta' then user_id end) as Atlanta,
       count(distinct case when city = 'Chicago' then user_id end) as Chicago,
       count(distinct case when city = 'New York' then user_id end) as New_York
from population_table
group by provider_name
0 голосов
/ 11 июля 2019

Если у вас переменное количество городов, я не знаю, как предоставить список в SparkSQL. Но используя pyspark, вы можете создать вывод table из input следующим образом:

counts = input.groupBy('provider_name', 'city').count().cache()
countsPerProvider = counts.groupBy('provider_name').count().withColumnRenamed("count", "users")
pivoted = counts.groupBy("provider_name").pivot("city").sum('count')
table = pivoted.join(countsPerProvider, pivoted["provider_name"] == countsPerProvider["provider_name"]).select(pivoted["*"], countsPerProvider["users"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...