пыспарк — находится между столбцами

#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 |  --- --------- ------