Как объединить столбец фрейма данных в новый столбец списков с количеством? - PullRequest
1 голос
/ 30 октября 2019

У меня есть фрейм с искровыми данными в scala, например:

URL       Browser
A         Chrome
B         Chrome 
C         Firefox
A         Chrome
A         Firefox
A         Opera
A         Chrome
B         Chrome
B         Firefox
C         Tor

Столбец URL содержит широкий диапазон данных, но столбец Browser имеет ограниченный набор. Я хочу агрегировать по столбцу URL-адреса и получить верхние значения для каждого браузера в списке в порядке убывания, например:

URL      FrequentlyUsedBrowser 
A        [(Chrome,3),(Firefox,1),(Opera,1)]
B        [(Chrome,2),(Firefox,1)]
C        [(Chrome,1),(Tor,1)] 

Я писал SQL-код, чтобы он использовал раздел окна для получения счетчика какодна запись для каждого браузера, но не удалось получить его в списке.

Это для кластера данных Google Pro работает под управлением Spark 2.4 с Scala 2.11

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Вы можете достичь этого с помощью collect_list и отсортировать по sort_array.

  df.withColumn("num", lit(1))
    .groupBy('url, 'browser)
    .agg(sum('num).as("num"))
    .select('url, format_string("(%s)",concat_ws(",", 'browser, 'num)).as("dst"))
    .groupBy('url)
    .agg(sort_array(collect_list('dst))).toDF("URL","FrequentlyUsedBrowser")
    .orderBy('url)
    .show(false)

+---+-------+
|url|browser|
+---+-------+
|  A| Chrome|
|  B| Chrome|
|  C|Firefox|
|  A| Chrome|
|  A|Firefox|
|  A|  Opera|
|  A| Chrome|
|  B| Chrome|
|  B|Firefox|
|  C|    Tor|
+---+-------+

+---+------------------------------------+
|URL|FrequentlyUsedBrowser               |
+---+------------------------------------+
|A  |[(Chrome,3), (Firefox,1), (Opera,1)]|
|B  |[(Chrome,2), (Firefox,1)]           |
|C  |[(Firefox,1), (Tor,1)]              |
+---+------------------------------------+
0 голосов
/ 31 октября 2019

Я внес изменение в ответ @ chlebek, добавив заказ, чтобы он теперь отлично работал для меня. Список также отсортирован. Спасибо !!

df.withColumn("num", lit(1))
 .groupBy('url, 'browser)
 .agg(sum('num)
 .as("num"))
 .orderBy('num.desc)
 .select('url, format_string("(%s)",concat_ws(",", 'browser, 'num))
 .as("dst"))
 .groupBy('url)
 .agg(collect_list('dst))
 .toDF("URL","FrequentlyUsedBrowser")
 .orderBy('url).show(false)
...