如何将Column.isin与列表一起使用?

时间:2015-09-13 16:32:16

标签: scala apache-spark apache-spark-sql

function login($_email, $_pass){
    global $con;
    $query = "SELECT * FROM users WHERE user_email = '$_email'";
    $results = mysqli_query($con, $query) or die("Connection could not be established");
    if (mysqli_num_rows($results) == 1){
        $row = mysqli_fetch_assoc($results);
        $hased_pass = $row['user_pass'];
        if (password_verify($_pass, $hased_pass)){
            $_SESSION['name'] = $row['user_name'];
            $_SESSION['email'] = $row['user_email'];
            return true;    
        }
    }
    //soft_logout();
    return false;
}

上面的代码抛出以下异常。

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)

4 个答案:

答案 0 :(得分:93)

根据文档,isin采用vararg而不是列表。 List在这里实际上是一个令人困惑的名字。您可以尝试将列表转换为vararg,如下所示:

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

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

使用mkString编译的变体,因为一个String也是一个vararg(参数个数等于1),但它可能不是你想要实现的。

答案 1 :(得分:11)

它在Java Api(Java 8)

中的工作方式如下
.isin(sampleListName.stream().toArray(String[]::new))));

sampleListName是一个List

答案 2 :(得分:5)

Spark现在(从2.4.0版本开始)使用了一种名为isInCollection的方法,而这正是您正在寻找的方法,而不是isIn

(他们不应该统一方法吗?)

答案 3 :(得分:0)

更容易:

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

除非您有很多列表值,通常不是这种情况。