Pyspark sql: создать новый столбец в зависимости от того, существует ли значение в другом столбце DataFrame - PullRequest
0 голосов
/ 30 мая 2018

Я пытался следовать этому ответу , но мой вопрос немного отличается.

У меня есть два фрейма данных pyspark df2 и bears2.Оба имеют целочисленную переменную, и я хочу создать логическое значение, подобное этому псевдокоду:

df3 = df2.withColumn("game", (df2.week_id.isin(bears2.week_if), 1,0))

В принципе, если значение df2 существует в соответствующем столбце bears2, я хочу 1 еще 0

Я попробовал expr() из другого вопроса, но не смог заставить его работать.Выглядело это так:

new_column_1 = F.expr(
    """IF(df2.week_id IN(bears2.week_if), 1, 0))"""
    )

1 Ответ

0 голосов
/ 30 мая 2018

В настоящее время вы не можете использовать IN таким образом с pyspark-sql 1 .Вместо этого вам придется присоединиться к DataFrames.

Попробуйте что-то вроде:

from pyspark.sql.functions import col, when
df3 = df2.withColumn("id", col("week_id")).alias("df2")\
    .join(bears2.withColumn("id", col("week_if")).alias("bears2"), on="id", how="left")\
    .select("df2.*", when(col("bears2.id").isNotNull(), 1).otherwise(0))

Чтобы объединение работало, столбец ключа объединения должен существовать в обоих DataFrames.По этой причине я сначала вызываю withColumn("id", ...), чтобы переименовать столбцы с тем же значением для объединения.

Затем мы выполняем левое соединение, чтобы сохранить все столбцы в df2.Наконец, мы выбираем все столбцы в df2 и используем pyspark.sql.functions.when() для создания логического столбца.

Первый аргумент when() является условием.Если это True, возвращается второй аргумент.Если нет, используется значение в otherwise().

...