PySpark не может удалить столбец после объединения с использованием обозначения table_name.colname, есть ли лучший способ?

#apache-spark #pyspark

Вопрос:

У меня есть главная таблица, на которой я объединяю несколько меньших таблиц. Я должен удалить столбец cat , присутствующий во всех меньших таблицах, но оба приведенных ниже метода не работают.

 a = spark.createDataFrame(pd.DataFrame({'id':[1,2],'cat':['a','b']}))
b = spark.createDataFrame(pd.DataFrame({'id':[3,4],'cat':[None,'b']}))
c = spark.createDataFrame(pd.DataFrame({'id':[1,4],'cat':['c','d']}))

p = spark.createDataFrame(pd.DataFrame({'id':[1,2,3,4,5]}))

(
    p
    .join(a,'id')
    .join(b,'id')
    .join(c,'id')
    .withColumn('category',F.expr('coalesce(a.cat,b.cat,c.cat)'))
    .drop('a.cat','b.cat','c.cat')
).columns
# output: ['id', 'cat', 'cat', 'cat', 'category']
(
    p
    .join(a.alias('a'),'id')
    .join(b.alias('b'),'id')
    .withColumn('category',F.expr('coalesce(a.cat,b.cat,c.cat)'))
    .drop('a.cat','b.cat')
).columns
# output: ['id', 'cat', 'cat', 'category]
 

Ответ №1:

Вы можете выбрать необходимые столбцы:

 (
    p
    .join(a,'id')
    .join(b,'id')
    .join(c,'id')
    .select(
        'id',
        *[p[i] for i in p.columns if i != 'id'],
        *[a[i] for i in a.columns if i != 'id' and i != 'cat'],
        *[b[i] for i in b.columns if i != 'id' and i != 'cat'],
        *[c[i] for i in c.columns if i != 'id' and i != 'cat']
    )
).columns
 

Комментарии:

1. На самом деле существует также функция withColumn() после соединений, которая использует случай, когда все cat столбцы поступают через меньшие таблицы, следовательно, не может этого сделать.

2. Ха-ха, так-то лучше. Это наверняка сработает. Приношу извинения за то, что не принимаю это, так как я чувствую, что это должно быть выполнимо только с помощью drop метода, так как я хочу, чтобы мой код был кратким (аудитория привыкла к SQL).

3. В SQL вы не можете этого сделать drop , но вы выбираете необходимые столбцы (что я и сделал). drop является искрой и плохо работает со столбцами с одинаковым именем

4. или вы можете подумать о переименовании столбцов cat в cat_a, cat_b и т. Д. Перед присоединением, затем вы можете использовать drop

5. Я согласен с советом заранее переименовать колонку. Но есть какие-нибудь идеи, почему drop не может работать? Я вижу, что drop может принимать несколько строк в качестве входных данных, он не ожидает списка, и он также может удалять другие столбцы. Вы думаете, проблема в добавлении псевдонима?