gpt4 book ai didi

java - Spark 数据帧否定过滤条件

转载 作者:行者123 更新时间:2023-11-30 06:12:07 36 4
gpt4 key购买 nike

我正在尝试对 DataFrame 应用过滤条件的否定,如下所示。

!(`Ship Mode` LIKE '%Truck%')

下面抛出异常

Exception in thread "main" java.lang.RuntimeException: [1.3] failure: identifier expected

(!(`Ship Mode` LIKE '%Truck%'))
^
at scala.sys.package$.error(package.scala:27)
at org.apache.spark.sql.catalyst.SqlParser.parseExpression(SqlParser.scala:47)
at org.apache.spark.sql.DataFrame.filter(DataFrame.scala:748)
at Main.main(Main.java:73)

同一种否定过滤条件在 MySQL 中工作正常。请在下面找到

mysql> select count(*) from audit_log where !(operation like '%Log%' or operation like '%Proj%');
+----------+
| count(*) |
+----------+
| 129 |
+----------+
1 row in set (0.05 sec)

如果计划在未来的版本中在 Spark DataFrames 中修复这个问题,或者我应该提出一个 JIRA,谁能告诉我。

最佳答案

看起来您正在使用普通的 SQLContext,其中 ! 不受支持:

import org.apache.spark.sql.SQLContext
val sqlContext = new SQLContext(sc)

val data = Seq(("a", 1, 3), ("b", 2, 6), ("c", -1, 2))

val df = sqlContext.createDataFrame(data).toDF("x1", "x2", "x3")
df.registerTempTable("df")

sqlContext.sql("SELECT * FROM df WHERE ! (x2 > 2 OR x3 < 4)").show

// java.lang.RuntimeException: [1.25] failure: identifier expected
//
// SELECT * FROM df WHERE ! (x2 > 2 OR x3 < 4)
// ^

可以很容易地用NOT代替:

sqlContext.sql("SELECT * FROM df WHERE NOT (x2 >  2 OR x3 < 4)").show

// +---+---+---+
// | x1| x2| x3|
// +---+---+---+
// | b| 2| 6|
// +---+---+---+

如果您仍想使用 !,您应该使用 HiveContext:

import org.apache.spark.sql.hive.HiveContext

val hiveContext = new HiveContext(sc)

val df1 = hiveContext.createDataFrame(data).toDF("x1", "x2", "x3")
df1.registerTempTable("df")

hiveContext.sql("SELECT * FROM df WHERE ! (x2 > 2 OR x3 < 4)").show

// +---+---+---+
// | x1| x2| x3|
// +---+---+---+
// | b| 2| 6|
// +---+---+---+

关于java - Spark 数据帧否定过滤条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33275637/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com