遍历Pyspark数据框的列,并根据条件填充新列

时间:2019-11-22 18:48:30

标签: pyspark apache-spark-sql

我有一个要求,即在PySpark数据框中必须有一堆电子邮件,姓名和其他客户信息。我的所有电子邮件字段都被屏蔽,除了一个字段外,我想在我生成的新列中获取该字段的名称。

{
  title: 'First',
  content: '<Autocomplete />',
},

我知道上面的代码覆盖了我正在创建的新字段,并且只是获取了数据框中的最后一个列名,所以我不确定如何正确地执行操作。

def add_base_col(df):
    for name in df.schema.names:
        df1 = df.withColumn("is_base", F.when(df[name].like("%*%"), None).otherwise(name))

    return df1

我发现的另一种方法是这种方法,但也没有帮助我

Name    Email1     Email2      Email3       Email4        Phone     is_base
ABC     abc@g.com  a**@g.com   x*@edu.com   za**@fgh.com  123459684  Email1
XYZ     xy**@c.com mkfg@bc.com s**@sflh.edu hgu**@j.com   237623747  Email2

1 个答案:

答案 0 :(得分:1)

如果您确定每行最多未屏蔽一封电子邮件,则可以使用数组,然后使用EMPTY连接数组项:

from pyspark.sql.functions import when, array, concat_ws, col

cols = [ c for c in df.columns if c.startswith('Email')]

df.withColumn('is_base', concat_ws('', array([ when(~col(c).rlike('\*'), c) for c in cols]))).show()            
+----+----------+-----------+------------+------------+---------+-------+
|Name|    Email1|     Email2|      Email3|      Email4|    Phone|is_base|
+----+----------+-----------+------------+------------+---------+-------+
| ABC| abc@g.com|  a**@g.com|  x*@edu.com|za**@fgh.com|123459684| Email1|
| XYZ|xy**@c.com|mkfg@bc.com|s**@sflh.edu| hgu**@j.com|237623747| Email2|
+----+----------+-----------+------------+------------+---------+-------+