我想使用 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/

10-11 22:28