我有一个数据集,看起来像这样:
+-----+-----+
|prev |next |
+-----+-----+
| A| B|
| B| C|
| C| D|
+-----+-----+
因此,基本上值可以形成链,使得一行中的列next
与另一行中的值previous
相同。
我想将其“展平”到另一个数据集中,如下所示:
+-----+-----+
|prev |next |
+-----+-----+
| A | B|
| A | C|
| A | D|
+-----+-----+
在图形上我可以显示为变换链:
A -> B -> C -> D
到
A -> B
A -> C
A -> D
我进行此转换是因为我需要使用列prev
和next
将计算所得的数据集与其他两个数据集连接起来。
我创建了一个可行的递归解决方案:
public Dataset<Row> flatten(Dataset<Row> transfers) {
Dataset<Row> notChainingTransfers = transfers.as("left").join(
transfers.as("right"),
functions.expr("left.prev = right.next"), "leftanti"
);
Dataset<Row> chainingTransfers = transfers.as("left").join(
transfers.as("right"),
functions.expr("left.pre = right.next")
).select("right.prev", "left.next");
Dataset<Row> union = notChainingTransfers.union(chainingTransfers);
if (chainingTransfers.count() > 0) {
return flatten(union);
} else {
return union;
}
}
但是我觉得它不是很漂亮也不有效。它还有一个很大的缺点,就是当我收到不正确的数据而形成一个循环链时,它将进入无限递归:
A -> B -> A
这样的情况不应该发生,但是如果我有解决方案,那可以解决这样的问题,那将是很好的。
我正在寻找有关如何改善解决方案或替代方法的提示。