Завдання та передумови
Приєднати до продажів ціну за числовим ключем і зберегти рядки, для яких ціни немає.
Приклад містить навчальні дані та налаштування. Виберіть власні тестові джерела й підключення замість ідентифікаторів demo_*, відтворіть очікуваний результат і лише потім використовуйте робочі об’єкти.
Навчальні вхідні дані
sales.csv
ID;Qty
1;2
2.0;5
4;1
prices.csv
ID;Price
1.0;5
2;3
3;4
Блоки, зв’язки й точні налаштування
Топологія прикладу 08: 4 блоки, 3 зв’язки. Збережено ідентифікатори вузлів і порти налаштованого графа.
Додайте наведені блоки в конструктор, відкрийте властивості кожного й установіть такі значення. Назви demo_* позначають навчальні джерела та підключення.
| Блок | Налаштування |
|---|---|
| 1 Файл sales |
|
| 2 Файл prices |
|
| 3 З’єднання (Join) join |
|
| 4 Вивантаження даних out |
|
Зв’язки портів
- sales
out→ joinsales - prices
out→ joinprices - join
out→ outin
Повна конфігурація графа JSON
{
"version": 3,
"nodes": [
{
"id": "sales",
"type": "file",
"label": "sales",
"config": {
"role": "source",
"source_id": "demo_join_sales",
"options": {
"sheet": "CSV",
"range": "A1:B4",
"header": true,
"delimiter": ";"
}
}
},
{
"id": "prices",
"type": "file",
"label": "prices",
"config": {
"role": "source",
"source_id": "demo_join_prices",
"options": {
"sheet": "CSV",
"range": "A1:B4",
"header": true,
"delimiter": ";"
}
}
},
{
"id": "join",
"type": "join",
"label": "join",
"config": {
"inputs": [
{
"id": "sales",
"alias": "sales"
},
{
"id": "prices",
"alias": "prices",
"how": "left",
"cardinality": "many_to_one",
"keys": [
{
"left": "sales.ID",
"right": "ID",
"numeric": true
}
]
}
],
"nulls_equal": false,
"decimal": "."
}
},
{
"id": "out",
"type": "export",
"label": "out",
"config": {
"format": "json",
"filename": "sales_with_prices",
"destination": "download",
"delimiter": ";",
"timezone": "Europe/Kyiv"
}
}
],
"edges": [
{
"source": "sales",
"target": "join",
"source_port": "out",
"target_port": "sales"
},
{
"source": "prices",
"target": "join",
"source_port": "out",
"target_port": "prices"
},
{
"source": "join",
"target": "out",
"source_port": "out",
"target_port": "in"
}
]
}Очікуваний результат
| sales.ID | sales.Qty | prices.ID | prices.Price |
|---|---|---|---|
| 1 | 2 | 1.0 | 5 |
| 2.0 | 5 | 2 | 3 |
| 4 | 1 | NULL | NULL |
Числове порівняння прирівнює 1 і 1.0. LEFT JOIN зберігає ID=4; ціна для нього порожня.
Запуск і перевірка
- Додайте обидва джерела та підключіть їх до різних іменованих входів Join.
- Першим входом задайте sales без ключів; ключі задаються для другого входу prices.
- Запустіть та перевірте 3 рядки; для ID=4 має бути NULL, а не випадково підставлена ціна.
Типові помилки
- Лівий ключ має містити псевдонім: sales.ID, не просто ID.
- Дві ціни для одного ID порушать many_to_one і мають бути виправлені в довіднику.
- Вимкнення numeric не прирівняє текстові "2.0" і "2".