使用java Spark DataFrame通过jdbc访问Oracle



我发现现有的用于访问传统数据库的Spark实现非常有限。特别是:

  1. 无法使用绑定变量
  2. 将分区参数传递给生成的SQL是非常受限的

最麻烦的是,我无法自定义分区如何进行的查询,它只允许标识分区列和上下边界,但只允许数字列和值。我知道我可以像执行子查询一样将查询提供给我的数据库,并将我的分区列映射到一个数值,但这将导致我的数据库执行计划非常低效,分区修剪(真正的Oracle表分区)和/或索引的使用效率不高。

我有什么办法绕过这些限制吗。。。我可以更好地自定义我的查询吗。。。构建我自己的分区逻辑。理想情况下,我希望将自己的自定义jdbc代码封装在一个Iterator中,这样我就可以延迟执行,并且不会导致整个结果集加载到内存中(就像JdbcRDD一样)。

哦,我更喜欢用Java而不是Scala来完成这一切。

查看JdbcRDD源代码。没有太多。

通过基于此代码编写自定义RDD类型,甚至通过将其子类化并重写getPartitions()compute(),您可以获得所需的灵活性。

我研究了JdbcRDD和新的Spark SQL数据源API。它们都不支持您的要求。

这很可能是您自己的实现。我建议编写新的数据源API,而不是子类JdbcRDD,后者在Spark 1.3中已经过时。

最新更新