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