带有选择位置的 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 新列的主要内容,如果未能解决你的问题,请参考以下文章