从插入的数据集中获取主键以链接到其他插入

时间:2019-02-07 12:25:00

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

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

Foo:

+--------+---------+---------+
| 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时,我希望能够通过Foo将其链接到id_foo_fk

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

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

我该如何实现?使用Apache Spark可以吗?

1 个答案:

答案 0 :(得分:0)

我不是Java专家,所以您必须研究数据库层中如何继续进行操作,但是您可以通过3种方法来做到这一点:

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