Python pySpark从列表中添加列

Python pySpark从列表中添加列,python,dataframe,apache-spark,pyspark,databricks,Python,Dataframe,Apache Spark,Pyspark,Databricks,我有一个datafame,希望根据列表中的值向其中添加列 mylist = ['ConformedLeaseRecoveryTypeId', 'ConformedLeaseStatusId', 'ConformedLeaseTypeId', 'ConformedLeaseRecoveryTypeName', 'ConformedLeaseStatusName', 'ConformedLeaseTypeName'] 我的值列表将从3-50个值变化。我是pySpark的新手,我正在尝试将这些值作为

我有一个datafame,希望根据列表中的值向其中添加列

mylist = ['ConformedLeaseRecoveryTypeId', 'ConformedLeaseStatusId', 'ConformedLeaseTypeId', 'ConformedLeaseRecoveryTypeName', 'ConformedLeaseStatusName', 'ConformedLeaseTypeName']
我的值列表将从3-50个值变化。我是pySpark的新手,我正在尝试将这些值作为新列(空)附加到我的df中

我已经看到了如何将[1列][1]添加到数据帧而不是列表中的多个数据帧的推荐代码

mylist = ['ConformedLeaseRecoveryTypeId', 'ConformedLeaseStatusId', 'ConformedLeaseTypeId', 'ConformedLeaseRecoveryTypeName', 'ConformedLeaseStatusName', 'ConformedLeaseTypeName']
我下面的代码只附加了一列

for new_col in mylist:
  new = datasetMatchedDomains.withColumn(new_col,f.lit(0))
new.show()




  [1]: https://stackoverflow.com/questions/48164206/pyspark-adding-a-column-from-a-list-of-values-using-a-udf

您可以在循环中浏览列表,更新df:

for col_name in mylist:
    datasetMatchedDomains = datasetMatchedDomains.withColumn(col_name, lit(0))
有趣的后续行动-如果有效,请尝试使用
reduce
:)


注意:关于您的编辑-
with column
不是修改原始数据帧,而是每次都返回一个新的数据帧,每次循环迭代都会覆盖该数据帧。

我们还可以使用
列表理解
。选择
将新列添加到数据帧中

示例:

#sample dataframe
df.show()
#+---+-----+---+---+----+
#| _1|   _2| _3| _4|  _5|
#+---+-----+---+---+----+
#|   |12343|   |9  |   0|
#+---+-----+---+---+----+

mylist = ['ConformedLeaseRecoveryTypeId', 'ConformedLeaseStatusId', 'ConformedLeaseTypeId', 'ConformedLeaseRecoveryTypeName', 'ConformedLeaseStatusName', 'ConformedLeaseTypeName']

cols=[col(col_name) for col_name in df.columns] + [(lit(0)).name( col_name) for col_name in mylist]

#incase if you want to cast new fields then
cols=[col(col_name) for col_name in df.columns] + [(lit(0).cast("string")).name( col_name) for col_name in mylist]

#adding new columns and selecting existing columns    
df.select(cols).show()
#+---+-----+---+---+----+----------------------------+----------------------+--------------------+------------------------------+------------------------+----------------------+
#| _1|   _2| _3| _4|  _5|ConformedLeaseRecoveryTypeId|ConformedLeaseStatusId|ConformedLeaseTypeId|ConformedLeaseRecoveryTypeName|ConformedLeaseStatusName|ConformedLeaseTypeName|
#+---+-----+---+---+----+----------------------------+----------------------+--------------------+------------------------------+------------------------+----------------------+
#|   |12343|   |9  |   0|                           0|                     0|                   0|                             0|                       0|                     0|
#+---+-----+---+---+----+----------------------------+----------------------+--------------------+------------------------------+------------------------+----------------------+

您建议的代码给了我渴望的输出,谢谢!感谢您在
栏中提供的
说明。你对
reduce
有什么建议?我的意思是,你可以用稍微功能化一点的风格重写它(尽管这只是一种风格偏好,完全由你决定,不会以任何方式影响性能):你可以尝试做一些类似的事情:
functools.reduce(lambda df,col\u name:df.withColumn(col\u name),mylist)
(这里更多的是伪代码,我无法从头开始正确编写)明白了。另一个问题,在重新运行代码几次之后,现在它只将最后一个列表值打印为一列…@Rayan RalI还有另一个问题。我不知道我缺少了什么。@Rayan ral感谢您提供的替代解决方案和解释!我同意这个答案,因为使用
with column
只从e列表。@ShuI还有一个问题,提前感谢!@ShuI有一个后续问题,删除链接,提前感谢!@ShuI还有一个问题。我想不出我遗漏了什么。提前感谢!