假设我在 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 中进行选择,因为 string1
和 string2
可能不是唯一的。也不可能更改数据库。例如,我无法将其更改为 UUID,也无法为其添加触发器。这是一个我们只能使用的遗留数据库
我怎样才能实现这个目标? Apache Spark 可以做到这一点吗?
最佳答案
我不是 Java 专家,因此您必须研究数据库层以了解如何准确进行操作,但有 3 种方法可以做到这一点:
- 如果您使用的数据库服务器能够(大多数情况下)可以创建存储过程,并从您的代码中调用它。
- 创建一个触发器,在第一次插入时返回 ID 号,并在下一次数据库插入中使用它。
- 使用 UUID 并将其用作 key ,而不是数据库自动生成的 key 。
关于java - 从插入的 DataSet 获取主键以链接到其他插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573300/