【发布时间】:2019-02-07 12:25:00
【问题描述】:
假设我在 Oracle 数据库中有以下表
富:
+--------+---------+---------+
| id_foo | string1 | string2 |
+--------+---------+---------+
| 1 | foo | bar |
| 2 | baz | bat |
+--------+---------+---------+
酒吧:
+--------+-----------+--------+
| id_bar | id_foo_fk | string |
+--------+-----------+--------+
| 1 | 1 | boo |
| 2 | 1 | bum |
+--------+-----------+--------+
当我使用 Dataset 和 JDBC 插入 Foo 时,例如
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 可以做到这一点吗?
【问题讨论】:
-
我是否正确理解
Foo和Bar之间没有可以仅从数据中推断出的联系? -
正确,除了外键没有其他链接
-
所以请原谅一个愚蠢的问题 - 但是你怎么知道记录在 Spark 中实际上是链接的?这意味着在某些时候 Foo 和 Bar 中的信息必须形成一行,对吧?
-
要创建
Bar,我需要Foo,因为我需要Foo_ID。所以当我创建Bar时,我在它之前创建了Foo的一个实例,这个实例包含一个从数据库自动生成的ID。创建 Bar 需要此 ID。 -
嗯,我明白了这一点,但我觉得那里缺少一块拼图。假设我有一个元组
(foo, bar)。我执行插入,然后取回 PK1。然后我想插入Bar。我有id_foo_fk,id_bar会由数据库生成,但是string(这里的“foo”)是从哪里来的呢?
标签: java oracle apache-spark jdbc apache-spark-sql