#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 может принимать несколько строк в качестве входных данных, он не ожидает списка, и он также может удалять другие столбцы. Вы думаете, проблема в добавлении псевдонима?