Разделение PySpark DataFrame в зависимости от уникальных значений в столбце (Custom Partitioning) - PullRequest
0 голосов
/ 07 октября 2019

У меня есть фрейм данных PySpark, в котором у меня есть отдельные столбцы для имен, типов, дней и значений. Пример кадра данных можно увидеть ниже:

+------+----+---+-----+
|  Name|Type|Day|Value|
+------+----+---+-----+
| name1|   a|  1|  140|
| name2|   a|  1|  180|
| name3|   a|  1|  150|
| name4|   b|  1|  145|
| name5|   b|  1|  185|
| name6|   c|  1|  155|
| name7|   c|  1|  160|
| name8|   a|  2|  120|
| name9|   a|  2|  110|
|name10|   b|  2|  125|
|name11|   b|  2|  185|
|name12|   c|  3|  195|
+------+----+---+-----+

Для выбранного значения Type я хочу создать отдельные кадры данных в зависимости от уникальных значений столбца под названием Day. Допустим, я выбрал a в качестве предпочтительного Type. В приведенном выше примере у меня есть три уникальных значения Day (, а именно . 1, 2 , 3). Для каждого уникального значения Day, в котором есть строка с выбранными Type a - (то есть дни 1 и 2 в приведенных выше данных), я хочу создать фрейм данных, в котором все строки имеютвыбранный выбранный Type и Day. В приведенном выше примере у меня будет два кадра данных, которые будут выглядеть следующим образом:

+------+----+---+-----+
|  Name|Type|Day|Value|
+------+----+---+-----+
| name1|   a|  1|  140|
| name2|   a|  1|  180|
| name3|   a|  1|  150|
+------+----+---+-----+

и

+------+----+---+-----+
|  Name|Type|Day|Value|
+------+----+---+-----+
| name8|   a|  2|  120|
| name9|   a|  2|  110|
+------+----+---+-----+

Как я могу это сделать? В реальных данных, с которыми я буду работать, у меня есть миллионы столбцов. Итак, я хочу узнать о наиболее эффективном способе реализации вышеупомянутой цели.

Вы можете использовать приведенный ниже код для генерации приведенного выше примера.

from pyspark.sql import *
import numpy as np

Stats = Row("Name", "Type", "Day", "Value")

stat1 = Stats('name1', 'a', 1, 140)
stat2 = Stats('name2', 'a', 1, 180)
stat3 = Stats('name3', 'a', 1, 150)
stat4 = Stats('name4', 'b', 1, 145)
stat5 = Stats('name5', 'b', 1, 185)
stat6 = Stats('name6', 'c', 1, 155)
stat7 = Stats('name7', 'c', 1, 160)
stat8 = Stats('name8', 'a', 2, 120)
stat9 = Stats('name9', 'a', 2, 110)
stat10 = Stats('name10', 'b', 2, 125)
stat11 = Stats('name11', 'b', 2, 185)
stat12 = Stats('name12', 'c', 3, 195)

1 Ответ

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

Вы можете просто использовать df.repartition("Type", "Day")

Документы для того же.

Когда я проверяю, используя следующую функцию, я получаю упомянутый вывод

def validate(partition):
    count = 0
    for row in partition:
        print(row)    
        count += 1
    print(count)

Мои данные

+------+--------------------+-------+-------+
|amount|          trans_date|user_id|row_num|
+------+--------------------+-------+-------+
|  99.1|2019-06-04T00:00:...|    101|      1|
| 89.27|2019-06-04T00:00:...|    102|      2|
|  89.1|2019-03-04T00:00:...|    102|      3|
| 73.11|2019-09-10T00:00:...|    103|      4|
|-69.81|2019-09-11T00:00:...|    101|      5|
| 12.51|2018-12-14T00:00:...|    101|      6|
| 43.23|2018-09-11T00:00:...|    101|      7|
+------+--------------------+-------+-------+

После df.repartition("user_id") я получаю следующее:

Вывод

Row(amount=73.11, trans_date='2019-09-10T00:00:00.000+05:30', user_id='103', row_num=4)
1
Row(amount=89.27, trans_date='2019-06-04T00:00:00.000+05:30', user_id='102', row_num=2)
Row(amount=89.1, trans_date='2019-03-04T00:00:00.000+05:30', user_id='102', row_num=3)
2
Row(amount=99.1, trans_date='2019-06-04T00:00:00.000+05:30', user_id='101', row_num=1)
Row(amount=-69.81, trans_date='2019-09-11T00:00:00.000+05:30', user_id='101', row_num=5)
Row(amount=12.51, trans_date='2018-12-14T00:00:00.000+05:30', user_id='101', row_num=6)
Row(amount=43.23, trans_date='2018-09-11T00:00:00.000+05:30', user_id='101', row_num=7)
4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...