使用 java Spark DataFrame 通过 jdbc 访问 Oracle
Using java Spark DataFrame to access Oracle over jdbc
我发现用于访问传统数据库的现有 Spark 实现非常受限。特别是:
- 无法使用绑定变量。
- 将分区参数传递给生成的 SQL 非常受限。
最麻烦的是我无法自定义分区发生方式的查询,它只允许识别分区列和上/下边界,但只允许使用数字列和值。
我知道我可以像执行子查询一样向我的数据库提供查询,并将我的分区列映射到一个数值,但这会导致我的数据库执行计划效率非常低,其中分区修剪(真正的 Oracle Table 分区), 和/或索引的使用效率不高。
我有什么方法可以绕过这些限制...我可以更好地自定义我的查询吗...构建我自己的分区逻辑。理想情况下,我想将自己的自定义 jdbc 代码包装在一个可以延迟执行的迭代器中,并且不会导致整个结果集加载到内存中(就像 JdbcRDD 一样)。
哦 - 我更喜欢使用 Java 而不是 Scala 来完成所有这些。
看看JdbcRDD source code。内容不多。
您可以通过基于此代码编写自定义 RDD 类型,甚至通过子类化并覆盖 getPartitions()
和 compute()
.
来获得您正在寻找的灵活性
我都学过JdbcRDD and new Spark SQL Data source API。 None 个支持您的要求。
这很可能是您自己的实现。我建议编写新的数据源 API 而不是子类化 JdbcRDD,后者在 Spark 1.3 中已过时。
我发现用于访问传统数据库的现有 Spark 实现非常受限。特别是:
- 无法使用绑定变量。
- 将分区参数传递给生成的 SQL 非常受限。
最麻烦的是我无法自定义分区发生方式的查询,它只允许识别分区列和上/下边界,但只允许使用数字列和值。 我知道我可以像执行子查询一样向我的数据库提供查询,并将我的分区列映射到一个数值,但这会导致我的数据库执行计划效率非常低,其中分区修剪(真正的 Oracle Table 分区), 和/或索引的使用效率不高。
我有什么方法可以绕过这些限制...我可以更好地自定义我的查询吗...构建我自己的分区逻辑。理想情况下,我想将自己的自定义 jdbc 代码包装在一个可以延迟执行的迭代器中,并且不会导致整个结果集加载到内存中(就像 JdbcRDD 一样)。
哦 - 我更喜欢使用 Java 而不是 Scala 来完成所有这些。
看看JdbcRDD source code。内容不多。
您可以通过基于此代码编写自定义 RDD 类型,甚至通过子类化并覆盖 getPartitions()
和 compute()
.
我都学过JdbcRDD and new Spark SQL Data source API。 None 个支持您的要求。
这很可能是您自己的实现。我建议编写新的数据源 API 而不是子类化 JdbcRDD,后者在 Spark 1.3 中已过时。