반응형
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
반응형
'Programing' 카테고리의 다른 글
유닉스에서 파일의 마지막 문자를 제거하려면 어떻게해야합니까? (0) | 2021.01.06 |
---|---|
npm이 작동하지 않습니다. 항상이 오류가 발생합니다.-> 오류 : 'are-we-there-yet'모듈을 찾을 수 없습니다. (0) | 2021.01.06 |
로그 항목 당 타임 스탬프가있는 log4j (0) | 2021.01.06 |
일반 텍스트 URL을 PHP에서 HTML 하이퍼 링크로 변환 (0) | 2021.01.06 |
x86 asm에서 대괄호는 무엇을 의미합니까? (0) | 2021.01.06 |