apache-spark - 为什么spark在sql查询的末尾追加 'WHERE 1=0'

标签 apache-spark apache-spark-sql spark-dataframe

我正在尝试使用 Apache Spark 执行一个简单的 mysql 查询并创建一个数据框。但由于某些原因, Spark 附加 'WHERE 1=0'在我要执行的查询的末尾并抛出一个异常声明 'You have an error in your SQL syntax' .

val spark = SparkSession.builder.master("local[*]").appName("rddjoin"). getOrCreate()
 val mhost = "jdbc:mysql://localhost:3306/registry"
val mprop = new java.util.Properties
mprop.setProperty("driver", "com.mysql.jdbc.Driver")mprop.setProperty("user", "root")
mprop.setProperty("password", "root")
val q= """select id from loaded_item"""
val res=spark.read.jdbc(mhost,q,mprop)
res.show(10)

异常(exception)如下:
18/02/16 17:53:49 INFO StateStoreCoordinatorRef: Registered StateStoreCoordinator endpoint
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select id from loaded_item WHERE 1=0' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:62)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.<init>(JDBCRelation.scala:114)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:52)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:307)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)
    at org.apache.spark.sql.DataFrameReader.jdbc(DataFrameReader.scala:193)
    at GenerateReport$.main(GenerateReport.scala:46)
    at GenerateReport.main(GenerateReport.scala)
18/02/16 17:53:50 INFO SparkContext: Invoking stop() from shutdown hook

最佳答案

您调用 spark.read.jdbc 的第二个参数是不正确的。您应该使用由架构限定的表名或具有别名的有效 SQL 查询,而不是指定 sql 查询。在您的情况下,这将是 val q="registry.loaded_item" .如果您想提供附加参数(可能用于 where 语句),另一种选择是使用 DataframeReader.jdbc 的其他版本。 .

顺便说一句:你看到奇怪的查询的原因 WHERE 1=0是 Spark 尝试在不加载任何实际数据的情况下推断数据帧的架构。此查询保证永远不会提供任何结果,但 Spark 可以使用查询结果的元数据来获取架构信息。

关于apache-spark - 为什么spark在sql查询的末尾追加 'WHERE 1=0',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48827041/

相关文章:

arrays - 如何使用Scala和Spark从数组中选择非顺序子集元素?

scala - 如何使用 Scala 聚合 Spark 数据帧以获得稀疏向量?

scala - Spark 在 Hbase 的 InputSplit 期间给出空指针异常

scala - Spark SQL 查找列中的最小值并获取整行

java - Spark sql 连接 mongo-spark 和 Spark-redshift 连接器的性能问题

sql - pyspark中的DataFilter是什么?

python - pyspark:合并(外连接)两个数据框

apache-spark - Spark Parquet 分区 : Large number of files

apache-spark - 禁用 Spark 催化剂优化器

apache-spark - Spark 从不同的模式目录中读取数据帧