#python #pyspark #isin
Вопрос:
Я пытаюсь использовать isin
функцию, чтобы проверить, отображается ли значение столбца имени данных pyspark в той же строке другого столбца.
--- ------------- ---- ------------ -------- | ID| date| loc| main_list| GOAL_f| --- ------------- ---- ------------ -------- |ID1| 2017-07-01| L1| [L1]| 1| |ID1| 2017-07-02| L1| [L1]| 1| |ID1| 2017-07-03| L2| [L1]| 0| |ID1| 2017-07-04| L2| [L1,L2]| 1| |ID1| 2017-07-05| L1| [L1,L2]| 1| |ID1| 2017-07-06| L3| [L1,L2]| 0| |ID1| 2017-07-07| L3| [L1,L2,L3]| 1| --- ------------- ---- ------------ --------
Но я получаю ошибки при попытке собрать main_list для сравнения. Вот что я безуспешно пытался:
df.withColumn('GOAL_f', F.col('loc').isin(F.col('main_list').collect())
Сводный кодекс:
w = Window.partitionBy('id').orderBy('date').rowsBetween(Window.unboundedPreceeding,-1) df.withColumn('main_list', F.collect_set('loc').over(w)) .withColumn('GOAL_f', F.col('loc').isin(F.col('main_list').collect())
Ответ №1:
Вы можете отменить запрос, не спрашивая, есть ли значение в чем-то, а если что-то содержит значение.
Пример:
from pyspark.sql import SparkSession import pyspark.sql.functions as F if __name__ == "__main__": spark = SparkSession.builder.getOrCreate() data = [ {"loc": "L1", "main_list": ["L1", "L2"]}, {"loc": "L1", "main_list": ["L2"]}, ] df = spark.createDataFrame(data=data) df = df.withColumn( "GOAL_f", F.when(F.array_contains(F.col("main_list"), F.col("loc")), 1).otherwise(0), )
Результат:
--- --------- ------ |loc|main_list|GOAL_f| --- --------- ------ |L1 |[L1, L2] |1 | |L1 |[L2] |0 | --- --------- ------