Условие фильтра в искровом фрейме данных на основе списка значений - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь отфильтровать данные на основе списка значений, и я могу запустить его так, как указано в примере 1. Однако, когда я преобразовываю элементы в список, а затем передаю список в функцию 'isin'внутри функции фильтра она не работает (показано в примере 2).

val df1 = sc.parallelize(Seq((1,"abcd"), (2,"defg"), (3, "ghij"),(4,"xyzz"),(5,"lmnop"),(6,"pqrst"),(7,"wxyz"),(8,"lmnoa"),(9,"jklm"))).toDF("c1","c2")
//example 1:
val df2 = df1.filter(substring(col("c2"), 0, 3).isin("abc","def","ghi"))

//example 2:
val given_list = List("abc","def","ghi")
val df3 = df1.filter(substring(col("c2"), 0, 3).isin(given_list))

Сообщение об ошибке при выполнении примера 2 показано ниже:

Exception in thread "main" java.lang.RuntimeException: Unsupported literal type class scala.collection.immutable.$colon$colon List(abc, def, ghi)                                                  

19/10/22 17:03:10 INFO spark.SparkContext: Invoking stop() from shutdown hook                                                                                                                                   
19/10/22 17:03:10 INFO server.AbstractConnector: Stopped Spark@5817c15f{HTTP/1.1,[http/1.1]}{0.0.0.0:4040}                                                                                                      
19/10/22 17:03:10 INFO ui.SparkUI: Stopped Spark web UI at http://192.---.---.---:----                                                                                                                          
19/10/22 17:03:10 INFO spark.MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!                                                                                                            
19/10/22 17:03:10 INFO memory.MemoryStore: MemoryStore cleared                                                                                                                                                  
19/10/22 17:03:10 INFO storage.BlockManager: BlockManager stopped                                                                                                                                               
19/10/22 17:03:10 INFO storage.BlockManagerMaster: BlockManagerMaster stopped                                                                                                                                   
19/10/22 17:03:10 INFO scheduler.OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!                                                                                      
19/10/22 17:03:10 INFO spark.SparkContext: Successfully stopped SparkContext                                                                                                                                    
19/10/22 17:03:10 INFO util.ShutdownHookManager: Shutdown hook called                                                                                                                                           
19/10/22 17:03:10 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-d17c100d-3e95-4016-a2fd-4e1e02b2449f          

Заранее спасибо.

1 Ответ

2 голосов
/ 23 октября 2019

Метод isin принимает параметр Any* varargs, а не коллекцию типа List. Вы можете использовать оператор «splat» (т.е. _*), как показано ниже:

df1.filter(substring(col("c2"), 0, 3).isin(given_list: _*))

Spark 2.4 + предоставляет метод isInCollection, который принимает коллекцию Iterable, который можно использовать следующим образом:

df1.filter(substring(col("c2"), 0, 3).isInCollection(given_list))
...