Pyspark中带有IN子句的语句时的情况

Pyspark中带有IN子句的语句时的情况

问题描述:

我是Spark编程的新手,当我的输入中出现一组值时,会有一个方案来分配值。下面是我用来完成我的任务的传统SQL代码。需要在Spark中做同样的事情。Pyspark中带有IN子句的语句时的情况

的SQL代码:

SELECT CASE WHEN c.Number IN ('1121231', '31242323') THEN 1 
ELSE 2 END AS Test 
FROM Input c 

我知道火花使用when只有一个条件。

Input.select(when(Input.Number==1121231,1).otherwise(2).alias("Test")).show() 

我假设你正在使用Spark DataFrame而不是RDDs。有一点要注意的是,你可以在数据框直接运行SQL查询:

# register the DataFrame so we can refer to it in queries 
sqlContext.registerDataFrameAsTable(df, "df") 

# put your SQL query in a string 
query = """SELECT CASE WHEN 
    df.number IN ('1121231', '31242323') THEN 1 ELSE 2 END AS test 
    FROM df""" 

result = sqlContext.sql(query) 
result.show() 

您也可以通过创建一个user-defined function模仿您的查询的情况下语句中使用select

from pyspark.sql.types import * 
from pyspark.sql.functions import udf 

# need to pass inner function through udf() so it can operate on Columns 
# also need to specify return type 
column_in_list = udf(
    lambda column: 1 if column in ['1121231', '31242323'] else 2, 
    IntegerType() 
) 

# call function on column, name resulting column "transformed" 
result = df.select(column_in_list(df.number).alias("transformed")) 
result.show() 
+0

感谢您的答复。有效。有没有一种方法可以直接在spark数据框上使用when函数并给出一个值列表? – Sid

+2

我想我找到了我想要做的事情。 df.when('H','O','M'),1).otherwise(0) – Sid

+0

@ user3258274这也适用。您也可以通过将DataFrame转换为rdd并收集来从列中提取值列表,如下所示:'rdd = df.rdd; rdd.map(lambda x:x.transform).collect()'。 –