Как установить раздел для функции окна для PySpark?

Я выполняю задание PySpark и получаю следующее сообщение:

WARN org.apache.spark.sql.execution.Window: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.

На что указывает сообщение и как определить раздел для оконной операции?

РЕДАКТИРОВАТЬ:

Я пытаюсь ранжироваться по всей колонке.

Мои данные организованы как:

A
B
A
C
D

И я хочу:

A,1
B,3
A,1
C,4
D,5

Я не думаю, что для этого должен использоваться .partitionBy (), только .orderBy (). Проблема в том, что это приводит к снижению производительности. Есть ли другой способ добиться этого без функции окна?

Если я разделю по первому столбцу, результат будет:

A,1
B,1
A,1
C,1
D,1

Чего я не хочу.


person cshin9    schedule 05.04.2016    source источник
comment
Если один из представленных ответов решает ваши проблемы, примите его, и мы сможем закрыть этот вопрос!   -  person eliasah    schedule 22.04.2016
comment
Извините, ни один из ответов еще не дал решения.   -  person cshin9    schedule 22.04.2016
comment
@ cshin9 Ну, на самом деле существующий ответ как раз отвечает на ваш вопрос. Не существует особой магии, которая может сделать оконную функцию без разбиения эффективной.   -  person zero323    schedule 24.04.2016


Ответы (1)


Учитывая информацию, предоставленную в вопросе, в лучшем случае я могу предоставить скелет того, как следует определять разделы в оконных функциях:

from pyspark.sql.window import Window

windowSpec = \
     Window \
     .partitionBy(...) \ # Here is where you define partitioning
     .orderBy(…)

Это эквивалентно следующему SQL:

OVER (PARTITION BY ... ORDER BY …)

Итак, что касается спецификации разделения:

Он контролирует, какие строки будут в одном разделе с данной строкой. Возможно, вы захотите убедиться, что все строки, имеющие одинаковое значение для столбца раздела, собраны на одном компьютере, прежде чем заказывать и вычислять фрейм.

Если вы не укажете спецификацию разделения, тогда все данные должны быть собраны на одном компьютере, поэтому появится следующее сообщение об ошибке:

WARN org.apache.spark.sql.execution.Window: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
person eliasah    schedule 05.04.2016
comment
Что, если я хочу упорядочить по всей таблице, а не использовать .partitionBy ()? Есть ли более эффективный способ сделать это? (например, RANK () OVER (ORDER BY ...) - person cshin9; 07.04.2016
comment
единственный эффективный способ - разделить по! - person eliasah; 07.04.2016
comment
По чему делить, если я занимаю место по всей таблице. Разделение подразумевает, что я хочу ранжировать каждый раздел отдельно. - person cshin9; 07.04.2016
comment
Я не могу ответить на этот вопрос без контекста. Вам нужно будет обновить свой вопрос хотя бы схемой DataFrame, в которой вы пытаетесь выполнить функцию Window. - person eliasah; 07.04.2016
comment
Я обновился с примером того, что пытаюсь сделать. - person cshin9; 07.04.2016
comment
То, что вы делаете, похоже на базовый порядок, я до сих пор не понимаю, как использовать оконную функцию для этой цели. - person eliasah; 07.04.2016
comment
Мне нужно сделать второй столбец, присвоив ранг каждому элементу в первом столбце. - person cshin9; 07.04.2016
comment
Вы все еще можете zipWithIndex после заказа. - person eliasah; 07.04.2016
comment
Не могли бы вы опубликовать решение, которое вы использовали для решения этой проблемы? @eliasah Я не вижу произошедшего обсуждения или предлагаемого здесь решения. - person CodeReaper; 20.03.2018
comment
Я предоставил решение в своем ответе @CodeReaper - person eliasah; 20.03.2018
comment
Я не вижу комментариев, связанных с zipWithIndex, в вашем ответе @eliasah. Я не получил вашего представления о zipWithIndex после заказа - person Galuoises; 27.07.2020