【问题标题】:Prepared statement in spark-jdbcspark-jdbc 中的预处理语句
【发布时间】:2019-05-12 20:30:10
【问题描述】:

我正在尝试使用具有指定偏移量的 Spark jdbc 从 MSSQL 数据库中读取数据。所以数据应该只在指定的时间戳之后加载,这就是这个偏移量。我尝试通过在 jdbc 配置中提供查询来实现它,但是,我没有发现创建带有参数化值的准备好的语句的可能性。在这种情况下,我想参数化一个偏移量,该偏移量在每次应用程序启动后都会改变。如何使用 jdbc 选项实现它?

所有数据库配置都驻留在 application.conf 文件中。 这是我从数据库中读取的方式:

def jdbcOptions(query: String) = Map[String,String](
    "driver" -> config.getString("sqlserver.db.driver"),
    "url" -> config.getString("sqlserver.db.url"),
    "dbtable" -> s"(select * from TestAllData where update_database_time >= '2019-03-19 12:30:00.003') as subq,
    "user" -> config.getString("sqlserver.db.user"),
    "password" -> config.getString("sqlserver.db.password"),
    "customSchema" -> config.getString("sqlserver.db.custom_schema")
  )

    val testDataDF = sparkSession
      .read
      .format("jdbc")
      .options(jdbcOptions())
      .load()

查询应该看起来像这样:

s"(select * from TestAllData where update_database_time >= $tmstp) as subq

【问题讨论】:

  • 如果我正确理解您的问题,您可以直接将您的 $tmstp 放入查询中。
  • 因为它不是使用字符串而不是准备好的语句将参数嵌入查询的最佳和安全方式。
  • 你要根据用户的参数来运行这个作业吗?
  • 我将提供一个从 Kafka 读取的更改参数,因此我不想硬编码该值
  • 据我所知,没有办法使用 spark 内置的可能性。但是,您可以尝试在插入 spark 阅读器之前验证您的查询的第三方库。

标签: sql-server apache-spark spark-jdbc


【解决方案1】:

Spark-jdbc中没有prepared statement,所以除了在String中设置参数没有其他方法:

val dayColumn = "update_database_time"
val dayValue = "2019-03-19 12:30:00.003"

s"(select * from TestAllData where $dayColumn > '$dayValue') as subq"

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 2012-07-31
    • 2020-11-12
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多