Algorithm ETL数据结构

Algorithm ETL数据结构,algorithm,data-structures,graph,Algorithm,Data Structures,Graph,假设我有一个ETL流,如下所示: source1 ---> do_filter ---> join -----> output ^ | source2 --------------------- 用什么样的数据结构来表示这一点?我的想法是有一个from:to[]结构。从评论中可以看出,您希望使用JSON格式来存储和加载这些图形,因此一个不占用太多空间的简单数据结

假设我有一个ETL流,如下所示:

source1 ---> do_filter ---> join -----> output
                             ^
                             |
source2 ---------------------

用什么样的数据结构来表示这一点?我的想法是有一个
from:to[]
结构。

从评论中可以看出,您希望使用JSON格式来存储和加载这些图形,因此一个不占用太多空间的简单数据结构应该可以。一个(您描述为
from:to[]
)是一个很好的通用图形数据结构,可能适合您的用例

邻接列表可以以各种方式实现。最简单的方法是使用字典将每个节点映射到其邻居列表:

{
    "source1":   ["do_filter"],
    "do_filter": ["join"],
    "join":      ["output"],
    "output":    [],
    "source2":   ["join"]
}
[
    { "name": "source1",   "colour": "green",  "edges": [1] },
    { "name": "do_filter", "colour": "red",    "edges": [2] },
    { "name": "join",      "colour": "orange", "edges": [3] },
    { "name": "output",    "colour": "blue",   "edges": [] },
    { "name": "source2",   "colour": "black",  "edges": [2] }
]
如果您只需要存储节点的名称和图形的拓扑结构,那么这可能很好。但是,对于具有多条边的大型图,JSON将占用更多的空间,因为每个节点的名称都作为该节点的每条边的字符串写入。如果需要更紧凑的表示形式,可以使用数字ID来引用节点:

{
    "nodes": ["source1", "do_filter", "join", "output", "source2"],
    "edges": [[1], [2], [3], [], [2]]
}
这里,
source1
是节点0,
do\u filter
是节点1,依此类推,基于它们在
节点中的索引;因此,从
source1
do\u filter
的边由包含数字
1
edges[0]
表示。类似地,
边[3]
为空,表示
节点[3]
,即
输出
,与其他节点没有边

如果需要存储有关每个节点的更多信息(例如,绘制节点的x、y坐标、颜色等),另一个选项是将每个节点设置为对象。这仍然是一个邻接列表,因为它通过将每个节点与其邻居列表关联来表示图形的拓扑:

{
    "source1":   ["do_filter"],
    "do_filter": ["join"],
    "join":      ["output"],
    "output":    [],
    "source2":   ["join"]
}
[
    { "name": "source1",   "colour": "green",  "edges": [1] },
    { "name": "do_filter", "colour": "red",    "edges": [2] },
    { "name": "join",      "colour": "orange", "edges": [3] },
    { "name": "output",    "colour": "blue",   "edges": [] },
    { "name": "source2",   "colour": "black",  "edges": [2] }
]

这取决于最常用的图形操作
from:to[]
a.k.a.an是一种很好的通用图形数据结构,但它并不总是最好的选择。你想用这个图表做什么?@kaya3--谢谢你的反馈。基本上是将其存储为单个json对象或数组,这样我们就可以在用户保存ETL“版本”时重新创建它们;那么它只是为了序列化/反序列化?在这种情况下,邻接列表似乎很好,但如果存储大小/传输速度是一个问题,并且图形很大,您可以通过为每个节点分配一个整数id,使用邻接列表中的整数id,并将节点名作为字符串使用单独的数组来避免多次写入节点名。@kaya3--我明白了,谢谢您的反馈。您是否能够使用邻接列表来显示上述ETL管道的外观?谢谢,您能否解释一下
“边”:[[1]、[2]、[3]、[2]]
是如何到达的?
[1]
是什么意思?谢谢你的更新。因此,一个示例边缘可以理解为:
索引0处的节点“source1”连接到索引1处的节点“do_filter”
,对吗?是的,正是这样。更正式地说,
j
边[i]
的成员,当且仅当
节点[i]
节点[j]
有边。