java - 从插入的 DataSet 获取主键以链接到其他插入

标签 java oracle apache-spark jdbc apache-spark-sql

假设我在 Oracle 数据库中有下表

福:

+--------+---------+---------+
| id_foo | string1 | string2 |
+--------+---------+---------+
|      1 | foo     | bar     |
|      2 | baz     | bat     |
+--------+---------+---------+

酒吧:

+--------+-----------+--------+
| id_bar | id_foo_fk | string |
+--------+-----------+--------+
|      1 |         1 | boo    |
|      2 |         1 | bum    |
+--------+-----------+--------+

当我插入 Foo 时,通过使用数据集和 JDBC,例如

Dataset<Row> fooDataset = //Dataset is initialized
fooDataset.write().mode(SaveMode.Append).jdbc(url, table, properties)

ID 由数据库自动生成。现在,当我需要使用相同的策略保存 Bar 时,我希望能够通过 id_foo_fk 将其链接到 Foo

我研究了一些可能性,例如按照this question中的建议使用monotonically_increasing_id() ,但这并不能解决问题,因为我需要数据库生成的ID。我尝试了 this question 中的建议,但它会导致相同的问题,即唯一的非数据库 ID

也不可能再次从 JDBC 中进行选择,因为 string1string2 可能不是唯一的。也不可能更改数据库。例如,我无法将其更改为 UUID,也无法为其添加触发器。这是一个我们只能使用的遗留数据库

我怎样才能实现这个目标? Apache Spark 可以做到这一点吗?

最佳答案

我不是 Java 专家,因此您必须研究数据库层以了解如何准确进行操作,但有 3 种方法可以做到这一点:

  • 如果您使用的数据库服务器能够(大多数情况下)可以创建存储过程,并从您的代码中调用它。
  • 创建一个触发器,在第一次插入时返回 ID 号,并在下一次数据库插入中使用它。
  • 使用 UUID 并将其用作 key ,而不是数据库自动生成的 key 。

关于java - 从插入的 DataSet 获取主键以链接到其他插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573300/

相关文章:

java - 我该如何修复这个代码错误?

python - 如何将 Python 连接到 Spark session 并保持 RDD 事件

java - Apache Spark 无法处理大型 Cassandra 列族

Java - 空指针异常错误

java - 单元测试 : check if a particular Comparable has been called

sql - ORA-00907 : missing right parenthesis (With Examples)

oracle - ORA-01031: 通过 dblink 插入时权限不足

scala - columnSimilarities() 返回 Spark 数据框

java - 使用泛型来指定子类类型?

oracle - 管道破裂迭代?