使用 java Spark DataFrame 通过 jdbc 访问 Oracle
Posted
技术标签:
【中文标题】使用 java Spark DataFrame 通过 jdbc 访问 Oracle【英文标题】:Using java Spark DataFrame to access Oracle over jdbc 【发布时间】:2015-03-27 18:31:20 【问题描述】:我发现用于访问传统数据库的现有 Spark 实现非常受限和受限。特别是:
-
无法使用绑定变量。
将分区参数传递给生成的 SQL 非常受限。
最麻烦的是我无法自定义我的查询如何进行分区,它只允许识别分区列和上/下边界,但只允许数字列和值。 我知道我可以像执行子查询一样向我的数据库提供查询,并将我的分区列映射到一个数值,但这会导致我的数据库执行计划非常低效,其中分区修剪(真正的 Oracle 表分区),或者使用索引效率不高。
我有什么办法可以绕过这些限制...我可以更好地自定义我的查询...构建我自己的分区逻辑。理想情况下,我想将我自己的自定义 jdbc 代码包装在一个可以延迟执行的 Iterator 中,并且不会导致整个结果集加载到内存中(就像 JdbcRDD 一样)。
哦 - 我更喜欢使用 Java,而不是 Scala。
【问题讨论】:
【参考方案1】:看看JdbcRDD source code。没什么大不了的。
您可以通过基于此代码编写自定义 RDD 类型,甚至通过对其进行子类化并覆盖 getPartitions()
和 compute()
来获得所需的灵活性。
【讨论】:
我已经在考虑自定义 JdbcRDD,但最初是在尝试使用 Java 时遇到的。但是,我对 Scala(大多数 Spark 和 JdbcRDD 的实现语言)有了更好的理解,并且掌握了在两种语言类型之间转换的基础知识。现在我能够将 Base RDD 扩展到我自己的支持非常精细的分区控制和绑定变量!如此整洁,我觉得它应该是标准包的一部分。 Right :)我建议查看 JdbcRDD,因为它(相对)易于阅读和自定义。这是我过去选择的让某些东西快速工作的方法。但是,Spark 中 JDBC 的未来大概是 JDBCRDD 中面向 DataFrame 的实现。如果您希望改进“标准包”,我建议您将精力集中在那里:) 好的,谢谢。实际上,正是您的回答让我更加坚持不懈地努力让它发挥作用。它非常简单,它帮助我更好地理解了 spark 的工作原理。此外,我认为您可能在您最近的评论中回答了我接下来的几个问题。我想知道如何收集架构信息并将其有效地发送回驱动程序和/或下一个任务。我认为对 DataFrame 友好的 JDBCRDD 可能是答案?【参考方案2】:我研究了JdbcRDD 和新的Spark SQL Data source API。它们都不支持您的要求。
这很可能是您自己的实现。我建议编写新的数据源 API,而不是对在 Spark 1.3 中已过时的 JdbcRDD 进行子类化。
【讨论】:
以上是关于使用 java Spark DataFrame 通过 jdbc 访问 Oracle的主要内容,如果未能解决你的问题,请参考以下文章
Apache Spark:如何使用 Java 在 dataFrame 中的空值列中插入数据
Spark DataFrame - 使用 Java API 选择列列表
使用 Apache Spark 和 Java 将 CSV 解析为 DataFrame/DataSet
合并 Spark DataFrame 中的多列 [Java]