복붙노트

[SCALA] 어떻게 목록 Column.isin를 사용 하는가?

SCALA

어떻게 목록 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)

해결법

  1. ==============================

    1.문서에 따르면, ISIN는 가변 인자가 아닌 목록을합니다. 목록은 실제로 여기에 혼란 이름입니다. 이 같은 가변 인자에 목록을 변환 시도 할 수 있습니다 :

    문서에 따르면, ISIN는 가변 인자가 아닌 목록을합니다. 목록은 실제로 여기에 혼란 이름입니다. 이 같은 가변 인자에 목록을 변환 시도 할 수 있습니다 :

    val items = List("a", "b", "c")
    
    sqlContext.sql("select c1 from table")
              .filter($"c1".isin(items:_*))
              .collect
              .foreach(println)
    

    하나 개의 문자열이 가변 인자는 (인수의 수의 1로 동일) 또한이므로 된 mkString와 변형, 컴파일, 그러나 당신이 무엇을 달성하고자하는 proably 없습니다.

  2. ==============================

    2.그것은 자바 API에서이 같은 일 (자바 8)

    그것은 자바 API에서이 같은 일 (자바 8)

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

    sampleListName는 목록입니다

  3. ==============================

    3.로 Tomalak는 언급했다 :

    로 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"""")
    
  4. ==============================

    4.더 쉬운 방법

    더 쉬운 방법

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

    당신이하지 않는 한 보통이 아니다 목록 값을 많이 보유하고 있습니다.

  5. from https://stackoverflow.com/questions/32551919/how-to-use-column-isin-with-list by cc-by-sa and MIT license