Мне нужен эффективный способ перечисления и удаления одинарных столбцов в Spark DataFrame (я использую PySpark
API).Я определяю унарный столбец как столбец, который имеет не более одного отдельного значения, и для целей определения я также считаю null
значением.Это означает, что столбец с одним отдельным значением non-null
в некоторых строках и null
в других строках не является унарным столбцом.
На основании ответов на на этот вопрос мне удалосьнаписать эффективный способ получить список пустых столбцов (которые являются подмножеством моих унарных столбцов) и отбросить их следующим образом:
counts = df.summary("count").collect()[0].asDict()
null_cols = [c for c in counts.keys() if counts[c] == '0']
df2 = df.drop(*null_cols)
Исходя из моего очень ограниченного понимания внутренней работы Spark, этобыстро, потому что сводка метода управляет всем фреймом данных одновременно (у меня есть приблизительно 300 столбцов в моем начальном DataFrame).К сожалению, я не могу найти аналогичный способ для работы со вторым типом унарных столбцов, которые не имеют значений null
, но имеют значение lit(something)
.
В настоящее время у меня есть следующее (используя df2
, полученный из фрагмента кода выше):
prox_counts = (df2.agg(*(F.approx_count_distinct(F.col(c)).alias(c)
for c in df2.columns
)
)
.collect()[0].asDict()
)
poss_unarcols = [k for k in prox_counts.keys() if prox_counts[k] < 3]
unar_cols = [c for c in poss_unarcols if df2.select(c).distinct().count() < 2]
По сути, я сначала нахожу столбцы, которые могут быть одинарными в быстром, ноприблизительный путь, а затем смотреть на «кандидатов» более подробно и медленнее.
Что мне не нравится в этом, так это то, что а) даже при предварительном предварительном отборе он все еще довольно медленный, захватывая всеминута бега, хотя на данный момент у меня всего около 70 столбцов (и около 6 миллионов строк) и б) я использую approx_count_distinct
с магической постоянной 3
(approx_count_distinct
не считается null
, следовательно3
вместо 2
).Поскольку я не совсем уверен, как внутренне работает approx_count_distinct
, я немного обеспокоен тем, что 3
не особенно хорошая константа, поскольку функция может оценивать количество различных (non-null
) значений, как, скажем, 5, когда это действительноравно 1, и поэтому, возможно, требуется более высокая константа, чтобы гарантировать, что в списке кандидатов ничего не пропущено poss_unarcols
.
Есть ли более разумный способ сделать это, в идеале, чтобы мне даже не пришлось отбрасыватьобнулить столбцы отдельно и сделать все это одним махом (хотя это на самом деле довольно быстро и так большая проблема)?