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

标签 apache-spark pyspark apache-spark-sql

我是 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。需要注意的一件事是,您可以直接在 DataFrame 上运行 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()

关于apache-spark - Pyspark 中带有 IN 子句的语句时的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36874161/

相关文章:

scala - 数据帧中的 OR 条件完全外部连接降低性能 spark/scala

python - 如何获取 csv 文件的子集作为 Spark RDD

apache-spark - 将 Python 字典转换为 Spark DataFrame

scala - 如何编写嵌套查询?

scala - 在 Scala Spark 中按模式更改数据帧的数据类型

scala - 当添加具有随机 double 的列时,Spark Dataframe 在所有行中都有重复值

apache-spark - 依赖于公共(public)列的两个数据帧之间的交叉连接

pyspark - 如何一次(在多个Jupyter Notebook中)运行多个Spark 2.0实例?

apache-spark - 如何在 PySpark 中将数据帧保存到 Elasticsearch?

scala - 如何使用 withColumn 创建新列以将两个数字列集中为 String ?