Как получить список столбцов, которые дадут мне уникальную запись в Pyspark Dataframe - PullRequest
0 голосов
/ 27 июня 2019

Мое намерение состоит в том, чтобы написать функцию python, которая бы принимала DataFrame pyspark в качестве входных данных, а ее вывод представлял бы собой список столбцов (может быть несколько списков), который дает уникальную запись при объединении вместе.

Итак, если вы возьмете набор значений для столбцов в списке, вы всегда получите только 1 запись из DataFrame.

Пример: Кадр входных данных

Name    Role    id
--------------------
Tony    Dev     130
Stark   Qa      131
Steve   Prod    132
Roger   Dev     133
--------------------

Выход:

Name,Role
Name,id 
Name,id,Role

Почему вывод, какой он есть? Для любой комбинации имени, роли я всегда получу только 1 запись И для любого имени, комбинации идентификаторов я всегда получу только 1 запись.

1 Ответ

0 голосов
/ 28 июня 2019

Есть способы определить функцию, которая будет делать именно то, что вы просите.

Я покажу только 1 возможность, и это очень наивное решение.Вы можете перебрать все комбинации столбцов и проверить, образуют ли они уникальную запись в таблице:

import itertools as it

def find_all_unique_columns_naive(df):
    cols = df.columns

    res = []
    for num_of_cols in range(1, len(cols) + 1):
        for comb in it.combinations(cols, num_of_cols):
            num_of_nonunique = df.groupBy(*comb).count().where("count > 1").count()

            if not num_of_nonunique:
                res.append(comb)
    return res

Результат для вашего примера:

[('Name',), ('id',), ('Name', 'Role'), ('Name', 'id'), ('Role', 'id'), 
 ('Name', 'Role', 'id')]

Очевидно, чтопроблема производительности, так как эта функция экспоненциально увеличивается во времени по мере роста числа столбцов, то есть O(2^N).Это означает, что время выполнения для таблицы с 20 столбцами уже займет довольно много времени.

Однако существуют некоторые очевидные способы ускорить это, например, если вы уже знаете, что столбец Name уникалентогда, безусловно, любая комбинация, которая включает в себя уже известную уникальную комбинацию, останется уникальной, следовательно, вы уже можете по этому факту сделать вывод, что комбинации (Name, Role), (Name, id) и (Name, Role, id) также являются уникальными, и это определенно значительно уменьшит пространство поиска.Однако наихудший сценарий остается тем же, то есть если в таблице нет уникальной комбинации столбцов, вам придется исчерпать все пространство поиска, чтобы сделать такой вывод.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...