Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spark数据帧否定过滤器条件_Java_Apache Spark_Apache Spark Sql - Fatal编程技术网

Java Spark数据帧否定过滤器条件

Java Spark数据帧否定过滤器条件,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,我正在尝试对数据帧应用一个否定的过滤条件,如下所示 !(`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

我正在尝试对数据帧应用一个否定的过滤条件,如下所示

!(`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
where
不受支持:

import org.apache.spark.sql.SQLContext
val sqlContext=新的sqlContext(sc)
val数据=序号(((“a”,1,3),(“b”,2,6),(“c”,-1,2))
val df=sqlContext.createDataFrame(数据).toDF(“x1”、“x2”、“x3”)
df.寄存器可清空(“df”)
sqlContext.sql(“从df WHERE!(x2>2或x3<4)中选择*).show
//java.lang.RuntimeException:[1.25]失败:应为标识符
//
//从df WHERE中选择*!(x2>2或x3<4)
//                         ^
它可以很容易地替换为
而不是

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

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

你试过使用“不喜欢”吗?是的,但我不想使用“不喜欢”,因为表达式可能会变得非常复杂,我只想从整体上否定它们。好的。您是否也考虑过使用
rdd
+
filterNot
,这样您就可以
registerTable
并跳过
!像您的查询中的
?@ccheneson没有必要这样做
NOT
子句可以否定一组谓词,
HiveContext
支持
和数据帧API提供了
函数和一元
operator(我不确定最后一个是否在Java中工作)。
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|
// +---+---+---+