Я совершенно новый, чтобы искра и не могу заставить его работать... Надеюсь, есть простой способ сделать это... То, что я пытаюсь сделать, лучше всего описано в следующей таблице: (Мне нужно получить "обязательный" столбец)
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?
Один из способов сделать это, чтобы использовать, 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 заполняются значениями из допустимых значений столбца.