Нужно удалить дубликаты столбцов из фрейма данных в pyspark - PullRequest
0 голосов
/ 31 мая 2019

У меня есть фрейм данных с 432 столбцами и 24 дубликатами столбцов.

  1. df_tickets -> 432 столбца
  2. duplicatecols -> Это столбцы из df_tickets, которые являются дубликатами.

Я хочу удалить столбцы в df_tickets, которые являются дубликатами. Таким образом, df_tickets должен иметь только 432-24 = 408 столбцов.

Я пробовал это с приведенным ниже кодом, но сгенерировал ошибку.

df_tickets.select([c for c in df_tickets.columns if c not in duplicatecols]).show()

Ошибка

An error occurred while calling o1657.showString.
: org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
HashAggregate(keys=[ms_bvoip_order_extension_id#953, ms_order_id#954...........

Может ли кто-нибудь помочь мне в этом?

Ответы [ 3 ]

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

Решение, приведенное ниже, должно избавить от дубликатов и сохранить порядок столбцов ввода df.

Загрузить некоторые образцы данных

df_tickets = spark.createDataFrame([(1,2,3,4,5)],['a','b','c','d','e'])
duplicatecols = spark.createDataFrame([(1,3,5)],['a','c','e'])

Проверить схемы df

df_tickets.printSchema()
root
 |-- a: long (nullable = true)
 |-- b: long (nullable = true)
 |-- c: long (nullable = true)
 |-- d: long (nullable = true)
 |-- e: long (nullable = true)

Удалить дублирующиеся столбцы

duplicatecols.printSchema()

root
 |-- a: long (nullable = true)
 |-- c: long (nullable = true)
 |-- e: long (nullable = true)

outCols = [x for x in df_tickets.columns if x not in set(duplicatecols.columns)]

df_tickets[outCols].show()

+---+---+
|  b|  d|
+---+---+
|  2|  4|
+---+---+
0 голосов
/ 01 июня 2019

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

# an example dataframe
cols = list('abcaded')
df_ticket = spark.createDataFrame([tuple(i for i in range(len(cols)))], cols)
>>> df_ticket.show()
#+---+---+---+---+---+---+---+
#|  a|  b|  c|  a|  d|  e|  d|
#+---+---+---+---+---+---+---+
#|  0|  1|  2|  3|  4|  5|  6|
#+---+---+---+---+---+---+---+

# unless you just want to filter a subset of all duplicate columns
# this list is probably not useful
duplicatecols = list('ad')

# create cols_new so that seen columns will have a suffix '_dup'
cols_new = [] 
seen = set()
for c in df_ticket.columns:
    cols_new.append('{}_dup'.format(c) if c in seen else c)
    seen.add(c)

>>> cols_new
#['a', 'b', 'c', 'a_dup', 'd', 'e', 'd_dup']

Затем отфильтруйте результат по новым именам столбцов

>>> df_ticket.toDF(*cols_new).select(*[c for c in cols_new if not c.endswith('_dup')]).show()
#+---+---+---+---+---+
#|  a|  b|  c|  d|  e|
#+---+---+---+---+---+
#|  0|  1|  2|  4|  5|
#+---+---+---+---+---+

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

0 голосов
/ 31 мая 2019

попробуйте это:

select_list = list(set(df_tickets.columns)-set(duplicatecols))
df_tickets.select(select_list).show()

дайте мне знать, если это работает для вас или нет.

...