Pyspark 中带有 IN 子句的语句时的情况
Case when statement with IN clause in Pyspark
我是 Spark 编程的新手,有一个场景可以在我的输入中出现一组值时分配一个值。下面是我用来完成任务的传统 SQL 代码。需要在 Spark 中做同样的事情。
Sql代码:
SELECT CASE WHEN c.Number IN ( '1121231', '31242323' ) THEN 1
ELSE 2 END AS Test
FROM Input c
我知道在只有一个条件的情况下在 spark 中使用 when
。
Input.select(when(Input.Number==1121231,1).otherwise(2).alias("Test")).show()
我假设您使用的是 Spark DataFrames,而不是 RDD。需要注意的一件事是,您可以 运行 SQL 直接在 DataFrame 上查询:
# 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()
您还可以通过创建一个模仿查询的 case 语句的 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()
我是 Spark 编程的新手,有一个场景可以在我的输入中出现一组值时分配一个值。下面是我用来完成任务的传统 SQL 代码。需要在 Spark 中做同样的事情。
Sql代码:
SELECT CASE WHEN c.Number IN ( '1121231', '31242323' ) THEN 1
ELSE 2 END AS Test
FROM Input c
我知道在只有一个条件的情况下在 spark 中使用 when
。
Input.select(when(Input.Number==1121231,1).otherwise(2).alias("Test")).show()
我假设您使用的是 Spark DataFrames,而不是 RDD。需要注意的一件事是,您可以 运行 SQL 直接在 DataFrame 上查询:
# 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()
您还可以通过创建一个模仿查询的 case 语句的 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()