Случай, когда оператор с предложением IN в Pyspark

Я новичок в программировании на Spark, и у меня есть сценарий для присвоения значения, когда набор значений появляется в моем вводе. Ниже приведен традиционный код SQL, который я бы использовал для выполнения своей задачи. То же самое нужно сделать в Spark.

Код SQL:

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

Мне известно об использовании when в Spark только с одним условием.

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

person Sid    schedule 26.04.2016    source источник


Ответы (1)


Я предполагаю, что вы работаете с 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()

Вы также можете использовать select, создав определяемая пользователем функция, которая имитирует оператор case вашего запроса:

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()
person Galen Long    schedule 26.04.2016
comment
Спасибо за ваш ответ. Это сработало. Есть ли способ использовать функцию when непосредственно в фрейме данных Spark и предоставить список значений? - person Sid; 27.04.2016
comment
Думаю, я нашел то, чем хотел заниматься. df.when (df.char.isin ('H', 'O', 'M'), 1). в противном случае (0) - person Sid; 27.04.2016
comment
@ user3258274 Это тоже работает. Вы также можете извлечь список значений из столбца, преобразовав DataFrame в rdd и собрав, например: rdd = df.rdd; rdd.map(lambda x: x.transform).collect(). - person Galen Long; 28.04.2016