Apache spark Pyspark:在运行时为when()子句动态生成条件

Apache spark Pyspark:在运行时为when()子句动态生成条件,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我已将csv文件读入pyspark数据帧。 现在,如果我在when()子句中应用条件,那么当在运行时之前给出条件时,它就可以正常工作 import pandas as pd from pyspark import SparkContext from pyspark.sql import SQLContext from pyspark.sql import functions from pyspark.sql.functions import col sc = SparkContext('loc

我已将csv文件读入
pyspark数据帧
。 现在,如果我在
when()
子句中应用条件,那么当在
运行时
之前给出条件时,它就可以正常工作

import pandas as pd
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql import functions
from pyspark.sql.functions import col

sc = SparkContext('local', 'example')
sql_sc = SQLContext(sc)

pandas_df = pd.read_csv('file.csv')  # assuming the file contains a header
# Sample content of csv file
# col1,value
# 1,aa
# 2,bbb

s_df = sql_sc.createDataFrame(pandas_df)

new_df = s_df.withColumn('value', functions.when((col("col1") == 2) | (col("value") == "aa"), s_df.value).otherwise(
    2))

new_df.show(truncate=False)
但是我需要从列表中动态地形成when子句中的条件

[{'column': 'col1', 'operator': '==', 'value': 2}, {'column': 'value', 'operator': '==', 'value': "aa"}]
有没有办法做到这一点

提前感谢。

您可以:

  • 动态生成SQL字符串,Python3.6+的f字符串非常方便
  • 将其传递到
    pyspark.sql.functions.expr
    以生成一个
    pyspark.sql.column.column

  • 以您的示例为例,类似这样的操作应该会起作用:

    给定
    s_df
    的模式:

    root
     |-- col1: long (nullable = false)
     |-- value: string (nullable = false)
    
    导入函数并实例化条件集合:

    […]
    从pyspark.sql.functions导入col、expr,当
    条件=[
    {'column':'col1','operator':'=','value':3},
    {'column':'value','operator':'==','value':“'aa'”}
    ]
    
    • 生成整个if语句时:

    new_df=s_df.withColumn('value',expr(
    f“如果({conditions[0]['column']}{conditions[0]['operator']}{conditions[0]['value']}”
    f“或{conditions[1]['column']}{conditions[1]['operator']}{conditions[1]['value']},”
    “值,2)”)。show()
    
    • 或者只生成条件,在函数时传递给

    new_df=s_df.withColumn('value',当(
    expr(
    f“{conditions[0]['column']}{conditions[0]['operator']}{conditions[0]['value']}”
    f“或{conditions[1]['column']}{conditions[1]['operator']}{conditions[1]['value']}”
    ),
    col(“value”)。否则(2))。show()
    
    谢谢。您能在when子句中为上述值提供一个示例SQL字符串吗?
    new_df=s_df.withColumn('value',functions.expr)(“if(col('col1')==2或col('value')='aa'))、col('value')、2)
    。我使用硬编码条件尝试了上述语句。但这会引发错误,即pyspark.SQL.utils.ParseException:“\n匹配的输入''应为{'),','}(第1行,第43位)\n\n==SQL==nif(col('col1')==2或col('value')='aa'\n-----------------------------------------------------------------------------------^^\n”
    new_-df=s_-df.withColumn('value',functions.expr)('if(col1==2或value='aa')),value,2)
    也不起作用,我使用f-strings编辑了一个示例。”(Python3.6+),请确保在条件值中为字符串加上引号:
    “'aa'
    ,而不仅仅是
    “aa”
    。详细的答案确实很有帮助。