PySpark - 根据另一列中引用的列名创建列

时间:2018-06-18 21:59:05

标签: python pyspark apache-spark-sql

我很新兴,无法让它发挥作用......希望有一种简单的方法可以做到这一点...... 我想要做的是下表中最好的描述:(我需要获得“必需”列)

    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中执行此操作的任何建议吗?

1 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是使用whencoalesce函数:

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值将填充有效列值中的值。