collect_set путем сохранения порядка - PullRequest
0 голосов
/ 10 октября 2019

Я имел в виду этот вопрос Здесь , однако он работает для collect_list, а не collect_set

У меня есть такой фрейм данных

    data = [(("ID1", 9)), 
            (("ID1", 9)),
            (("ID1", 8)),
            (("ID1", 7)),
            (("ID1", 5)),
            (("ID1", 5))]
df = spark.createDataFrame(data, ["ID", "Values"])
df.show()

+---+------+
| ID|Values|
+---+------+
|ID1|     9|
|ID1|     9|
|ID1|     8|
|ID1|     7|
|ID1|     5|
|ID1|     5|
+---+------+

Я пытаюсь создать новый столбец, собирая его как set

df = df.groupBy('ID').agg(collect_set('Values').alias('Value_set'))
df.show()

+---+------------+
| ID|   Value_set|
+---+------------+
|ID1|[9, 5, 7, 8]|
+---+------------+

Но порядок не поддерживается, мой заказ должен быть [9, 8, 7, 5]

Ответы [ 3 ]

0 голосов
/ 10 октября 2019

вы можете применить функцию array_sort() к вашему столбцу, если вы используете искру 2.4 или выше:

0 голосов
/ 10 октября 2019

Я решил это так

df = df.groupby('ID').agg(collect_list('Values').alias('Values_List'))
df.show()

def my_function(x):
    return list(dict.fromkeys(x))

udf_set = udf(lambda x: my_function(x), ArrayType(IntegerType()))
df = df.withColumn("Values_Set", udf_set("Values_List")) 

df.show(truncate=False)

+---+------------------+------------+
|ID |Values_List       |Values_Set  |
+---+------------------+------------+
|ID1|[9, 9, 8, 7, 5, 5]|[9, 8, 7, 5]|
+---+------------------+------------+
0 голосов
/ 10 октября 2019

Исходный код pyspark, документация для collect_set :

_collect_set_doc = """
    Aggregate function: returns a set of objects with duplicate elements eliminated.

    .. note:: The function is non-deterministic because the order of collected results depends
        on order of rows which may be non-deterministic after a shuffle.

    >>> df2 = spark.createDataFrame([(2,), (5,), (5,)], ('age',))
    >>> df2.agg(collect_set('age')).collect()
    [Row(collect_set(age)=[5, 2])]
    """

Это означает, что у вас будут неупорядоченные наборы, основанные на таблице hash, и выможно получить больше информации о 'порядке' неупорядоченных наборов Python

...