展平链式数据集

时间:2019-06-18 11:03:42

标签: java apache-spark

我有一个数据集,看起来像这样:

+-----+-----+
|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

我进行此转换是因为我需要使用列prevnext将计算所得的数据集与其他两个数据集连接起来。

我创建了一个可行的递归解决方案:

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

这样的情况不应该发生,但是如果我有解决方案,那可以解决这样的问题,那将是很好的。

我正在寻找有关如何改善解决方案或替代方法的提示。

0 个答案:

没有答案