Что делает раздел df.repartition без аргументов столбцов? - PullRequest
0 голосов
/ 29 ноября 2018

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

Мой вопрос - как перераспределение Spark при отсутствии ключа?Я не мог больше копаться в исходном коде, чтобы выяснить, где он проходит через Spark.

def repartition(self, numPartitions, *cols):
    """
    Returns a new :class:`DataFrame` partitioned by the given partitioning expressions. The
    resulting DataFrame is hash partitioned.

    :param numPartitions:
        can be an int to specify the target number of partitions or a Column.
        If it is a Column, it will be used as the first partitioning column. If not specified,
        the default number of partitions is used.

    .. versionchanged:: 1.6
       Added optional arguments to specify the partitioning columns. Also made numPartitions
       optional if partitioning columns are specified.

    >>> df.repartition(10).rdd.getNumPartitions()
    10
    >>> data = df.union(df).repartition("age")
    >>> data.show()
    +---+-----+
    |age| name|
    +---+-----+
    |  5|  Bob|
    |  5|  Bob|
    |  2|Alice|
    |  2|Alice|
    +---+-----+
    >>> data = data.repartition(7, "age")
    >>> data.show()
    +---+-----+
    |age| name|
    +---+-----+
    |  2|Alice|
    |  5|  Bob|
    |  2|Alice|
    |  5|  Bob|
    +---+-----+
    >>> data.rdd.getNumPartitions()
    7
    """
    if isinstance(numPartitions, int):
        if len(cols) == 0:
            return DataFrame(self._jdf.repartition(numPartitions), self.sql_ctx)
        else:
            return DataFrame(
                self._jdf.repartition(numPartitions, self._jcols(*cols)), self.sql_ctx)
    elif isinstance(numPartitions, (basestring, Column)):
        cols = (numPartitions, ) + cols
        return DataFrame(self._jdf.repartition(self._jcols(*cols)), self.sql_ctx)
    else:
        raise TypeError("numPartitions should be an int or Column")

Например: совершенно нормально называть эти строки, но я понятия не имею, что он на самом деле делает.Это хеш всей строки?Возможно, первый столбец в фрейме данных?

df_2 = df_1\
       .where(sf.col('some_column') == 1)\
       .repartition(32)\
       .alias('df_2')

1 Ответ

0 голосов
/ 29 ноября 2018

По умолчанию, если разделитель не указан, разбиение не основано на характеристике данных, а распределено случайным и равномерным образом по узлам.

Алгоритм перераспределения, стоящий за df.repartition, выполняет полные данныеперемешивает и равномерно распределяет данные по разделам.Для уменьшения тасования лучше использовать df.coalesce

Вот несколько хороших объяснений, как перераспределить с DataFrame https://hackernoon.com/managing-spark-partitions-with-coalesce-and-repartition-4050c57ad5c4

...