Структура данных ETL - PullRequest
       13

Структура данных ETL

0 голосов
/ 31 января 2020

Предположим, у меня есть поток ETL следующим образом:

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

Какова будет правильная структура данных, чтобы представить это? Моя мысль имела структуру from: to[].

1 Ответ

1 голос
/ 31 января 2020

Из комментариев видно, что вы хотите использовать формат JSON для хранения и загрузки этих графиков, поэтому простая структура данных, которая не использует слишком много места, должна подойти. список смежностей (который вы описали как from: to[]) - это хорошая структура данных графов общего назначения, и, вероятно, она подходит для вашего варианта использования.

Список смежностей может быть реализован в различных пути. Самый простой способ - это словарь, отображающий каждый узел в список соседей:

{
    "source1":   ["do_filter"],
    "do_filter": ["join"],
    "join":      ["output"],
    "output":    [],
    "source2":   ["join"]
}

Если вам нужно сохранить только имена узлов и топологию графа, это, вероятно, хорошо. Однако для больших графов с большим количеством ребер JSON займет больше места, чем необходимо, поскольку имя каждого узла записывается в виде строки для каждого ребра этого узла. Если требуется более компактное представление, вы можете использовать цифру c ID для ссылки на узлы:

{
    "nodes": ["source1", "do_filter", "join", "output", "source2"],
    "edges": [[1], [2], [3], [], [2]]
}

Здесь source1 - это узел 0, do_filter - это узел 1 и т. Д. по их показателям в nodes; поэтому край от source1 до do_filter представлен edges[0], содержащим число 1. Аналогично, edges[3] пусто, что означает, что nodes[3], то есть output, не имеет ребер для других узлов.

Другой вариант, если вам нужно хранить больше информации о каждом узле (например, координаты x, y для рисуя его, цвет и т. д. c.), нужно сделать каждый узел объектом. Это все еще список смежности, потому что он представляет топологию графа, связывая каждый узел со списком его соседей:

[
    { "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] }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...