当前位置: 首页 > 知识库问答 >
问题:

从JDBC创建火花数据框时如何指定sql方言?

轩辕煌
2023-03-14

我在使用Spark通过自定义JDBC读取数据时遇到了一个问题。我如何重写通过jdbcurl推断的sql方言?

有问题的数据库是vitess(https://github.com/youtube/vitess ),它运行一个mysql变体,所以我想指定一种mysql方言。jdbc url以jdbc:vitess/开头

否则,数据帧读取器将推断出使用“”作为引号标识符的默认方言。因此,通过 spark.read.jdbc 的查询将作为

从表中选择“id”、“col2”、“列3”、“等”

它选择字符串表示形式而不是列值,而不是

从表中选择id、列2、列3等

共有2个答案

隗昀
2023-03-14

你可以做这样的事情。

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .load()

有关更多信息,请查看此选项

也可以这样指定。

val connectionProperties = new Properties()
    connectionProperties.put("user", "username")
    connectionProperties.put("password", "password")
    val jdbcDF2 = spark.read
      .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)
邢卓
2023-03-14

也许已经太迟了。但接下来会有答案:

创建您的自定义方言,就像我对ClickHouse数据库所做的那样(我的jdbc连接url看起来像这样jdbc:clickhouse://localhost:8123)

 private object ClickHouseDialect extends JdbcDialect {
    //override here quoting logic as you wish
    override def quoteIdentifier(colName: String): String = colName

    override def canHandle(url: String): Boolean = url.startsWith("jdbc:clickhouse")
  }

并将其注册到您的代码中的某个位置,如下所示:

JdbcDialects.registerDialect(ClickHouseDialect)
 类似资料:
  • 我正在尝试使用Apache Spark,以便将具有多个连接和子选择的(大型)SQL查询的结果加载到来自Spark的DataFrame中,如从SQL查询创建Spark Dataframe中所述。 不幸的是,我这样做的尝试导致了拼花错误: 线程“main”组织中出现异常。阿帕奇。火花sql。AnalysisException:无法推断拼花地板的架构。必须手动指定。 我从谷歌看到的信息表明,当数据帧为空

  • 我确信这是一个简单的SQLContext问题,但我在Spark docs或Stackoverflow中找不到任何答案 我想从MySQL上的SQL查询创建一个Spark数据框 例如,我有一个复杂的MySQL查询,如 我想要一个带有X、Y和Z列的数据帧 我想出了如何将整个表加载到Spark中,然后可以将它们全部加载,然后在那里进行连接和选择。然而,这是非常低效的。我只想加载SQL查询生成的表。 这是我

  • 在一个字符串中传递路径、用户名、密码和所有选项可以方便地创建到数据库的连接。有没有办法从一个URL创建数据源对象?也许可以从开放的SQL连接创建数据源?

  • 我正在研究建立一个JDBC Spark连接,以便从r/Python使用。我知道和都是可用的,但它们似乎更适合交互式分析,特别是因为它们为用户保留了集群资源。我在考虑一些更类似于Tableau ODBC Spark connection的东西--一些更轻量级的东西(据我所知),用于支持简单的随机访问。虽然这似乎是可能的,而且有一些文档,但(对我来说)JDBC驱动程序的需求是什么并不清楚。 既然Hiv

  • 在spark streaming中,流数据将由在worker上运行的接收器接收。数据将被周期性地推入数据块中,接收者将向驱动程序发送receivedBlockInfo。我想知道这会引发流将块分发到集群吗?(换句话说,它会使用分发存储策略吗)。如果它不在集群中分发数据,如何保证工作负载平衡?(我们有一个10s节点的集群,但只有几个接收器)

  • 在PySpark中或者至少在Scala中,Apache Spark中是否有与Pandas Melt函数等价的函数? 到目前为止,我一直在用Python运行一个示例数据集,现在我想对整个数据集使用Spark。