我想使用 AWS 粘合作业从 Mysql 实例读取过滤数据。由于胶水 jdbc 连接不允许我下推谓词,因此我试图在我的代码中显式创建 jdbc 连接。
我想使用 jdbc 连接对 Mysql 数据库运行带有 where 子句的选择查询,如下所示
import com.amazonaws.services.glue.GlueContext
import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession
object TryMe {
def main(args: Array[String]): Unit = {
val sc: SparkContext = new SparkContext()
val glueContext: GlueContext = new GlueContext(sc)
val spark: SparkSession = glueContext.getSparkSession
// Read data into a DynamicFrame using the Data Catalog metadata
val t = glueContext.read.format("jdbc").option("url","jdbc:mysql://serverIP:port/database").option("user","username").option("password","password").option("dbtable","select * from table1 where 1=1").option("driver","com.mysql.jdbc.Driver").load()
}
}
它因错误而失败
这不应该工作吗?如何使用 JDBC 连接检索过滤数据而不将整个表读入数据框?
最佳答案
我认为问题的发生是因为您没有在括号中使用查询并提供别名。在我看来,它应该如下例所示:
val t = glueContext.read.format("jdbc").option("url","jdbc:mysql://serverIP:port/database").option("user","username").option("password","password").option("dbtable","(select * from table1 where 1=1) as t1").option("driver","com.mysql.jdbc.Driver").load()
有关 SQL 数据源中参数的更多信息:
https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html
说到Glue和Glue提供的框架,也有“push_down_predicate”这个选项,但我只在基于S3的数据源上用过这个选项。我认为它不适用于 S3 和非分区数据以外的其他来源。
https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html
关于aws-glue - AWSglueContext读取不允许sql查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54094382/