如何在特定位置向 PySpark 数据框添加多个空列

Man*_*ani 2 apache-spark pyspark

我尝试对此进行了大量研究,但我无法找到一种方法来执行并将多列添加到特定位置的 PySpark 数据框。

我有如下所示的数据框:

Customer_id   First_Name   Last_Name  
Run Code Online (Sandbox Code Playgroud)

我想在 3 个不同的位置添加 3 个空列,我最终生成的数据框需要如下所示:

Customer_id Address First_Name Email_address Last_Name Phone_no

有没有一种简单的方法可以解决它,就像你可以reindex在 python 上做的那样?

cph*_*sto 9

# Creating a DataFrame.
from pyspark.sql.functions import col, lit
df = sqlContext.createDataFrame(
    [('1','Moritz','Schulz'),('2','Sandra','Schröder')],
     ('Customer_id','First_Name','Last_Name')
)
df.show()
+-----------+----------+---------+
|Customer_id|First_Name|Last_Name|
+-----------+----------+---------+
|          1|    Moritz|   Schulz|
|          2|    Sandra| Schröder|
+-----------+----------+---------+
Run Code Online (Sandbox Code Playgroud)

您可以使用lit()函数添加空列,一旦创建,您可以使用 SQLselect以您希望的顺序对列重新排序。

df = df.withColumn('Address',lit(''))\
       .withColumn('Email_address',lit(''))\
       .withColumn('Phone_no',lit(''))\
       .select( 
           'Customer_id', 'Address', 'First_Name',
           'Email_address', 'Last_Name', 'Phone_no'
       )
df.show()
+-----------+-------+----------+-------------+---------+--------+
|Customer_id|Address|First_Name|Email_address|Last_Name|Phone_no|
+-----------+-------+----------+-------------+---------+--------+
|          1|       |    Moritz|             |   Schulz|        |
|          2|       |    Sandra|             | Schröder|        |
+-----------+-------+----------+-------------+---------+--------+
Run Code Online (Sandbox Code Playgroud)

正如用户@Pault 所建议的,一种更简洁的方式 -

df = df.select(
    "Customer_id", lit('').alias("Address"), "First_Name",
    lit("").alias("Email_address"), "Last_Name", lit("").alias("Phone_no")
)
df.show()
+-----------+-------+----------+-------------+---------+--------+
|Customer_id|Address|First_Name|Email_address|Last_Name|Phone_no|
+-----------+-------+----------+-------------+---------+--------+
|          1|       |    Moritz|             |   Schulz|        |
|          2|       |    Sandra|             | Schröder|        |
+-----------+-------+----------+-------------+---------+--------+
Run Code Online (Sandbox Code Playgroud)

  • 这里不需要`withColumn`s - 你可以只使用`select`:`df = df.select("Customer_id", lit('').alias("Address"), "First_Name", lit(" ").alias("Email_address"), "Last_Name", lit("").alias("Phone_no"))` (7认同)

Zet*_*taP 7

如果你想要更简洁,我觉得更短:

for col in ["mycol1", "mycol2", "mycol3", "mycol4", "mycol5", "mycol6"]:
    df = df.withColumn(col, F.lit(None))
Run Code Online (Sandbox Code Playgroud)

然后您可以为订单选择相同的阵列。

(编辑)注意:for 循环中的 withColumn 通常非常慢。不要对大量列执行此操作,而更喜欢使用 select 语句,例如:

select_statement = []
for col in ["mycol1", "mycol2", "mycol3", "mycol4", "mycol5", "mycol6"]:
    select_statement.append(F.lit(None).alias(col))
df = df.select(*df.columns, *select_statement)
Run Code Online (Sandbox Code Playgroud)