Programing

Column.isin을 목록과 함께 사용하는 방법?

crosscheck 2021. 1. 6. 20:18
반응형

Column.isin을 목록과 함께 사용하는 방법?


val items = List("a", "b", "c")

sqlContext.sql("select c1 from table")
          .filter($"c1".isin(items))
          .collect
          .foreach(println)

위의 코드는 다음 예외를 발생시킵니다.

Exception in thread "main" java.lang.RuntimeException: Unsupported literal type class scala.collection.immutable.$colon$colon List(a, b, c) 
at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:49)
at org.apache.spark.sql.functions$.lit(functions.scala:89)
at org.apache.spark.sql.Column$$anonfun$isin$1.apply(Column.scala:642)
at org.apache.spark.sql.Column$$anonfun$isin$1.apply(Column.scala:642)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.apache.spark.sql.Column.isin(Column.scala:642)

아래는 그것을 고치려는 나의 시도입니다. 컴파일 및 실행되지만 일치하는 항목을 반환하지 않습니다. 이유가 확실하지 않습니다.

val items = List("a", "b", "c").mkString("\"","\",\"","\"")

sqlContext.sql("select c1 from table")
          .filter($"c1".isin(items))
          .collect
          .foreach(println)

문서에 따르면 isin목록이 아닌 vararg를 사용합니다. 목록은 실제로 여기에서 혼란스러운 이름입니다. 다음과 같이 목록을 vararg로 변환 해 볼 수 있습니다.

val items = List("a", "b", "c")

sqlContext.sql("select c1 from table")
          .filter($"c1".isin(items:_*))
          .collect
          .foreach(println)

하나의 단일 문자열도 vararg (인수 수가 1과 같음)이기 때문에 mkString을 사용하는 변형이 컴파일되지만 달성하려는 것이 아닐 수 있습니다.


Java Api (Java 8)에서 이와 같이 작동했습니다.

.isin(sampleListName.stream().toArray(String[]::new))));

sampleListName은 목록입니다.


Tomalak이 언급했듯이 :

isin(java.lang.Object... list)
A boolean expression that is evaluated to true if the value 
of this expression is contained by the evaluated values of the arguments.

따라서이 문제를 수정하여 다음과 같이 변경할 수 있습니다.

val items = List("a", "b", "c").map(c => s""""$c"""")

더 쉽게 :

sqlContext.sql("select c1 from table")
          .filter($"c1".isin("a", "b", "c"))
          .collect
          .foreach(println)

목록 값이 많지 않으면 일반적으로 그렇지 않습니다.

ReferenceURL : https://stackoverflow.com/questions/32551919/how-to-use-column-isin-with-list

반응형