PySpark - создать столбец на основе имен столбцов, указанных в другом столбце

1

Я совершенно новый, чтобы искра и не могу заставить его работать... Надеюсь, есть простой способ сделать это... То, что я пытаюсь сделать, лучше всего описано в следующей таблице: (Мне нужно получить "обязательный" столбец)

    colA    colB    colC    ref     required
1   a1        b1    c1      colA     a1
2   a2        b2    c2      colA     a2
3   a3        b3    c3      colB     b3
4   a4        b4    c4      colB     b4
5   a5        b5    c5      colC     c5
6   a6        b6    c6      colC     c6

Вышеприведенное является просто примером - в реальном примере у меня есть> 50 столбцов, поэтому условия не будут работать...

Я знаю, что это можно легко сделать в пандах, используя что-то вроде:

df['required'] = df.apply(lambda x: x.loc[x.ref], axis=1)

или же

df['required'] = df.lookup(df.index, df.ref)

Любые предложения, как это сделать в PySpark?

Теги:
apache-spark-sql
pyspark

1 ответ

2

Один из способов сделать это, чтобы использовать, when и coalesce функции:

import pyspark.sql.functions as F

cols = ['colA', 'colB', 'colC']
df.withColumn('required', F.coalesce(*[F.when(df.ref == c, df[c]) for c in cols])).show()
+----+----+----+----+--------+
|colA|colB|colC| ref|required|
+----+----+----+----+--------+
|  a1|  b1|  c1|colA|      a1|
|  a2|  b2|  c2|colA|      a2|
|  a3|  b3|  c3|colB|      b3|
|  a4|  b4|  c4|colB|      b4|
|  a5|  b5|  c5|colC|      c5|
|  a6|  b6|  c6|colC|      c6|
+----+----+----+----+--------+

В основном вы проверяете, какое имя столбца имеет столбец ref, и принимает значение из этого столбца - F.when(df.ref == c, df[c]); Это создает список объектов столбца, значения которых сохраняются, когда его имя отображается в столбце ref, иначе его значения будут NULL; Затем, объединив список столбцов, значения NULL заполняются значениями из допустимых значений столбца.

  • 1
    Работал как шарм! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню