фрейм данных pyspark для получения первых 5 строк с использованием sql или pandas фрейма данных - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь получить топ-5 предметов для каждого района на основе rate_increase. Я пытаюсь использовать spark. sql как показано ниже:

Ввод:

   district   item   rate_increase(%)
     Arba     coil    500
     Arba     pen    -85
     Arba     hat     50
     Cebu     oil    -40
     Cebu     pen     1100

Top5item = spark.sql('select district, item , rate_increase, ROW_NUMBER() OVER (PARTITION BY district ORDER BY rate_increase DESC) AS RowNum from rateTable where rate_increase > 0')

И это работает. Как отфильтровать 5 лучших продуктов в одном заявлении. Я попробовал, как показано ниже, и есть лучший способ сделать это через spar. sql?

Top5item = spark.sql('select district, item from (select NCSA, Product, growthRate, ROW_NUMBER() OVER (PARTITION BY NCSA ORDER BY growthRate DESC) AS RowNum from rateTable where rate_increase > 0) where RowNum <= 5 order by NCSA')

output:

   district   item   rate_increase(%)
     Arba     coil    500
     Arba     hat     50
     Cebu     pen     1100

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Lilly, Вы можете прочитать данные из csv с помощью pandas или создать pandas фрейм данных, как показано ниже, а затем преобразовать его в спарк-фрейм данных

import pandas as pd

data_1 = { 
    'district': ["Arba", "Arba", "Arba","Cebu", "Cebu"],
    'item': ['coil', 'pen', 'hat','oil','pen'],
    'rate_increase(%)': [500,-85,50,-40,1100]}
    pandas_df = pd.DataFrame(data_1)
ddf_1 = spark.createDataFrame(pandas_df)
ddf_1.createOrReplaceTempView("ddf_1")

output = spark.sql("""

select district, item , `rate_increase(%)` from (
  select row_number() over (partition by district order by `rate_increase(%)` desc) as RowNum, district,item, `rate_increase(%)`  from ddf_1  where  `rate_increase(%)` > 0 )
where RowNum <= 5 order by district, RowNum

""")

output.show()

+--------+----+----------------+
|district|item|rate_increase(%)|
+--------+----+----------------+
|    Arba|coil|             500|
|    Arba| hat|              50|
|    Cebu| pen|            1100|
+--------+----+----------------+
0 голосов
/ 05 февраля 2020

Я пытался использовать pandas как простое решение.

Top5item = df.sort_values('rate_increase(%)', ascending = True).groupby(['district']).head(5)

В порядке возрастания (rate_increase(%)) после группировки по районам все равно не работает. Спасибо

0 голосов
/ 05 февраля 2020

Имейте в виду порядок выполнения запросов:

От / Соединения -> Где -> Группировать по -> Имея -> Выбрать

Предложение where where RowNum <= 5 не работает, потому что не знает, что такое RowNum.

Попробуйте использовать блок подзапроса:

spark.sql("""

select district, item , `rate_increase(%)` from (
  select row_number() over (partition by district order by `rate_increase(%)` desc) as RowNum, district,item, `rate_increase(%)`  from ddf_1  where  `rate_increase(%)` > 0 )
where RowNum <= 5 order by district, RowNum

""").show()

Вывод:

+--------+----+----------------+
|district|item|rate_increase(%)|
+--------+----+----------------+
|    Arba|coil|             500|
|    Arba| hat|              50|
|    Cebu| pen|            1100|
+--------+----+----------------+
...