带有选择位置的 pyspark 新列

Posted

技术标签:

【中文标题】带有选择位置的 pyspark 新列【英文标题】:pyspark new column with select where 【发布时间】:2021-04-26 09:53:05 【问题描述】:

我需要为我的数据框创建 2 个额外的列,这些列基于涉及一列与自身除以另一列的条件的计算。

我有一个使用 SQL 转换的工作示例,但需要在 pyspark equvilent 中重写它并且无法正确处理。到目前为止我所拥有的:

%python

data = [("AUD", 7.1), ("EUR", 11.2), ("USD", 9.1)]
cols = ["Currency", "RateSEK"]
df = spark.createDataFrame(data, cols)
df.show()

+--------+-------+
|Currency|RateSEK|
+--------+-------+
|     AUD|    7.1|
|     EUR|   11.2|
|     USD|    9.1|
+--------+-------+

df.createOrReplaceTempView("tempdf")

以上是我目前在 pyspark 中的内容。 下面是我想用pyspark实现的SQL代码:

%sql
SELECT 
*,
RateSEK / (SELECT RateSEK FROM tempdf WHERE Currency = 'EUR') AS RateEur,
RateSEK / (SELECT RateSEK FROM tempdf WHERE Currency = 'USD') AS RateUSD
FROM
tempdf

【问题讨论】:

【参考方案1】:

您可以使用.head()获取子查询的结果:

import pyspark.sql.functions as F

df2 = df.withColumn(
    'RateEur', 
    F.col('RateSEK') / df.filter("Currency = 'EUR'").head()['RateSEK']
).withColumn(
    'RateUSD', 
    F.col('RateSEK') / df.filter("Currency = 'USD'").head()['RateSEK']
)

df2.show()
+--------+-------+------------------+------------------+
|Currency|RateSEK|           RateEur|           RateUSD|
+--------+-------+------------------+------------------+
|     AUD|    7.1|0.6339285714285714|0.7802197802197802|
|     EUR|   11.2|               1.0|1.2307692307692308|
|     USD|    9.1|            0.8125|               1.0|
+--------+-------+------------------+------------------+

【讨论】:

以上是关于带有选择位置的 pyspark 新列的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark 中添加带有压缩列表的新列作为常量值

如何在pyspark数据框中添加多个带有when条件的新列?

在 pyspark 数据框中的第一个序号位置添加一个新列

通过选择不为空的特定值在 pyspark 中创建一个新列

PySpark:基于数据框中具有 UUID 的列添加新列

在 pyspark 数据框中循环遍历两列时将值添加到新列