【问题标题】:pySpark adding columns from a listpySpark从列表中添加列
【发布时间】:2020-08-28 15:06:29
【问题描述】:

我有一个数据名,想根据列表中的值向其中添加列。

我的值列表将在 3-50 个值之间变化。我是 pySpark 的新手,我正在尝试将这些值作为新列(空)附加到我的 df 中。

我已经看到了如何将 [one column][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

【问题讨论】:

    标签: python dataframe apache-spark pyspark databricks


    【解决方案1】:

    我们还可以使用 list comprehension.select 向数据框添加新列。

    Example:

    #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|
    #+---+-----+---+---+----+----------------------------+----------------------+--------------------+------------------------------+------------------------+----------------------+
    

    【讨论】:

    【解决方案2】:

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

    for col_name in mylist:
        datasetMatchedDomains = datasetMatchedDomains.withColumn(col_name, lit(0))
    

    有趣的后续行动 - 如果可行,请尝试使用 reduce :)

    附:关于您的编辑 - withColumn 不会修改原始 DataFrame,而是每次都返回一个新的,您在每次循环迭代时都会覆盖它。

    【讨论】:

    • 你建议的代码给了我想要的输出,谢谢!并感谢withColumn 的解释。你对reduce有什么建议?
    • 我的意思是,你可以用更实用的风格重写它(虽然它只是一种风格偏好,完全取决于你,不会以任何方式影响性能):你可以尝试做类似的事情:functools.reduce(lambda df, col_name: df.withColumn(col_name), mylist)(这里比较伪代码,我脑子里写不出来)
    • 明白了。另一个问题,在重新运行代码几次后,现在它只将最后一个列表值打印为列...@Rayan Ral
    • 我还有一个问题。无法弄清楚我错过了什么。 stackoverflow.com/questions/62070186/…@Rayan Ral
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多