【问题标题】:pyspark new column with select where带有选择位置的 pyspark 新列
【发布时间】: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

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案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|
    +--------+-------+------------------+------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多