Есть способы определить функцию, которая будет делать именно то, что вы просите.
Я покажу только 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)
также являются уникальными, и это определенно значительно уменьшит пространство поиска.Однако наихудший сценарий остается тем же, то есть если в таблице нет уникальной комбинации столбцов, вам придется исчерпать все пространство поиска, чтобы сделать такой вывод.
В заключение я бы предложилВы должны подумать, почему вы хотите эту функцию в первую очередь.Я согласен, что для небольших таблиц могут быть некоторые конкретные варианты использования, просто чтобы сэкономить время, но, если честно, это не то, как следует обращаться с таблицей.Если таблица существует, то должна существовать цель ее существования и правильный дизайн таблицы, т. Е. Как на самом деле структурируются и обновляются данные внутри таблицы.И это должно стать отправной точкой при поиске уникальных идентификаторов.Поскольку, несмотря на то, что вы сможете теперь найти другие уникальные идентификаторы с помощью этого метода, вполне может быть так, что дизайн таблицы уничтожит их при следующем обновлении.Я бы предпочел использовать метаданные и документацию таблицы, потому что тогда вы можете быть уверены, что обрабатываете таблицу правильно, как она была задумана, и, если в таблице много столбцов, она на самом деле быстрее.