{"id":334602,"date":"2022-06-16T21:49:53","date_gmt":"2022-06-16T21:49:53","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=334602"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=334602","title":{"rendered":"<span>DataVault \u043d\u0430 Greenplum \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e DBT<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b76\/9ab\/929\/b769ab929a4250505dc0fc6bec7a07a7.png\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b76\/9ab\/929\/b769ab929a4250505dc0fc6bec7a07a7.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u0440\u043a \u041f\u043e\u0440\u043e\u0448\u0438\u043d, \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c DataScience \u0432 DV Group. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0443\u0436\u0435\u00a0<a href=\"https:\/\/www.notion.so\/DBT-Data-Built-Tool-aa97fc403c564270bc84f04e65c0be19\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b<\/a>\u00a0\u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e dbt. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u043c\u044b \u0432 DV Group \u043f\u043e\u0436\u0435\u043d\u0438\u043b\u0438 dbt, Greenplum \u0438 DataVault, \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u0441\u0435 \u0433\u0440\u0430\u0431\u043b\u0438, \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u0438; \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u0438\u043b\u0438 \u0432 open-source, \u043d\u043e \u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 DataVault. DataVault &#8212; \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0430\u044f \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 (3\u0430\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430). \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0435\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>hub &#8212; \u201c\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u201d \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043b\u044e\u0447;<\/p>\n<\/li>\n<li>\n<p>satellite &#8212; \u201c\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438\u201d, \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u0435 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0441 \u0445\u0430\u0431\u043e\u043c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>link &#8212; \u201c\u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438\u201d &#8212; \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043c\u0435\u0436\u0434\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0432\u0443\u043c\u044f).<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u043b\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0445 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0445 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0442\u043e\u0432\u0430\u0440\u043e\u0432. \u041a\u0430\u043a \u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c ER \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430?<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ffc\/78c\/510\/ffc78c5106da5019aa7a9fc4f39ad9c4.png\" alt=\"er \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\" title=\"er \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\" width=\"1442\" height=\"1522\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ffc\/78c\/510\/ffc78c5106da5019aa7a9fc4f39ad9c4.png\"\/><figcaption>er \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430<\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u00a0\u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u0430\u0445\u00a0\u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u00a0<code>effective_from<\/code>\u00a0\u0438\u00a0<code>&lt;entity>_hashdiff<\/code>, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432 DavaVault \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B5%D0%B4%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE_%D0%BC%D0%B5%D0%BD%D1%8F%D1%8E%D1%89%D0%B5%D0%B5%D1%81%D1%8F_%D0%B8%D0%B7%D0%BC%D0%B5%D1%80%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">SCD2<\/a>, \u044d\u0442\u043e \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c   \u201c\u0432\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u044c\u201d \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e Data Vault \u043c\u043e\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwiXysm0gP33AhXWSPEDHS2wATsQFnoECC8QAQ&amp;url=https%3A%2F%2Fdanlinstedt.com%2Fwp-content%2Fuploads%2F2018%2F06%2FDVModelingSpecs2-0-1.pdf&amp;usg=AOvVaw1HMJWxIh7CKHNkeasrhvEf\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwjvwZHIgP33AhX_S_EDHeeMC9UQFnoECAwQAQ&amp;url=https%3A%2F%2Fhabr.com%2Fru%2Fpost%2F348188%2F&amp;usg=AOvVaw04i0YZK15-qSzU0yFPnEaP\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 1<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwjvwZHIgP33AhX_S_EDHeeMC9UQFnoECAkQAQ&amp;url=https%3A%2F%2Fhabr.com%2Fru%2Fpost%2F502968%2F&amp;usg=AOvVaw0wF5JaQEEHyRxHKLhwiejo\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 2<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0445\u043e\u0447\u0443 \u0434\u0430\u0442\u044c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f\u00a0<a href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/588582\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435\u0439<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0435 \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u044f \u0445\u043e\u0447\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044f\u0445, \u0430 \u0435\u0449\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b\u0438.<\/p>\n<h3>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h3>\n<p>\u0418\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443\u00a0<code>pure.pure_transactions<\/code>\u00a0\u043d\u0430 Greenplum \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Data Vault, \u0442.\u0435. \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0445\u0430\u0431\u044b, \u043b\u0438\u043d\u043a\u0438 \u0438 \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u044b. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 3 \u044d\u0442\u0430\u043f\u0430.<\/p>\n<ol>\n<li>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f (\u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 1 \u0434\u0435\u043d\u044c).<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043e\u0433\u0430\u0442\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0445\u0435\u0448\u0430\u043c\u0438, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0440\u0430\u0441\u0449\u0435\u043f\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/073\/3d5\/82d\/0733d582dc396fa7e544c049bc4bfd8d.png\" alt=\"pipeline \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f datavault\" title=\"pipeline \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f datavault\" width=\"1898\" height=\"224\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/073\/3d5\/82d\/0733d582dc396fa7e544c049bc4bfd8d.png\"\/><figcaption>pipeline \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f datavault<\/figcaption><\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430\u00a0<code>pure.pure_transactions<\/code>\u00a0\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443, \u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<ol>\n<li>\n<p>id \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438(<code>transaction_id<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u0442\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438(<code>transaction_date<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u0446\u0435\u043d\u0430 \u0442\u043e\u0432\u0430\u0440\u0430(<code>price<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u043e\u0432\u0430\u0440\u0430(<code>quantity<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u0430(<code>product_name<\/code>);<\/p>\n<\/li>\n<li>\n<p>id \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u043e\u0432\u0430\u0440\u0430(<code>cat_id<\/code>);<\/p>\n<\/li>\n<\/ol>\n<p>\u041c\u044b \u0432\u044b\u0434\u0435\u043b\u0438\u043b\u0438 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0432\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438<\/p>\n<ol>\n<li>\n<p>\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0432 \u0447\u0435\u043a\u0435 (<code>transaction_id<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u0442\u043e\u0432\u0430\u0440 (<code>product_name<\/code>);<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0435\u0433\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438 \u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443.<\/p>\n<h3>\u0410\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f greenplum<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c dbt-\u043a\u043e\u0434, \u0445\u043e\u0447\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Greenplum. Greenplum \u2014 \u0431\u0430\u0437\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Postgres, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442, \u043d\u043e \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043b\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0<a href=\"https:\/\/github.com\/markporoshin\/dbt-greenplum\" rel=\"noopener noreferrer nofollow\">dbt<\/a>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c\u00a0<a href=\"https:\/\/gpdb.docs.pivotal.io\/6-20\/ref_guide\/sql_commands\/CREATE_TABLE_AS.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0410 \u0435\u0449\u0435 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u00a0<a href=\"https:\/\/www.youtube.com\/watch?v=TupXHhdSrhg\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u043b\u0430\u0434<\/a>\u043e\u043c, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c Greenplum.<\/p>\n<p><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430<\/strong><\/p>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c Greenplum \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0446\u0438\u0438. \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044e Greenplum \u0431\u0443\u0434\u0435\u0442 \u201c\u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u201d \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u043e\u043b\u044e \u0431\u0443\u0434\u0443\u0442 \u0441\u0430\u043c\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 join-\u044b. \u0423\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"sql\">{{     config( ...         distributed_by='&lt;field_name>' ...     ) }}<\/code><\/pre>\n<p><strong>\u0421\u0436\u0430\u0442\u0438\u0435 \u0438 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u0430\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/strong><\/p>\n<p>Greenplum \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\/\u0437\u0430\u043f\u0438\u0441\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0441\u0436\u0430\u0442\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0412 dbt \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0434\u043b\u044f Greenplum, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"sql\">{{     config(         ...         appendonly='true',         orientation='column',         compresstype='ZSTD',         compresslevel=4,         blocksize=32768 ...     ) }}<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u00a0<code>appendonly='true'<\/code>, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 Greenplum \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043e\u043a. \u0410 \u0435\u0449\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u0443\u044e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e\u00a0<code>orientation='column'<\/code>. \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0442\u0438\u043f \u0441\u0436\u0430\u0442\u0438\u044f\u00a0<code>compresstype='ZSTD'<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u00a0<code>compresslevel=4<\/code>,\u00a0<code>blocksize=32768<\/code>. \u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442.<\/p>\n<p><strong>\u041f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 postgres \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0442 \u0443 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 dbt-postgres(\u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u043d\u044f, \u0435\u0441\u043b\u0438 \u044f \u043e\u0448\u0438\u0431\u0430\u044e\u0441\u044c). \u041f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438. \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0432 Greenplum \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code>create table as select<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0439 \u0444\u0438\u0447\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u043e\u0439. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u0435\u0439 \u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"sql\">{% set fields_string %}      id int4 null,      incomingdate timestamp NULL {% endset %}   {% set raw_partition %}     PARTITION BY RANGE (incomingdate)     (         START ('2021-01-01'::timestamp) INCLUSIVE         END ('2023-01-01'::timestamp) EXCLUSIVE         EVERY (INTERVAL '1 day'),         DEFAULT PARTITION extra     ); {% endset %}  {{     config( ...         fields_string=fields_string,         raw_partition=raw_partition,         default_partition_name='other_data' ...     ) }}<\/code><\/pre>\n<h3>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 DataVault<\/h3>\n<h4>Raw<\/h4>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u0434\u0435\u043d\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u00a0<code>raw.raw_transaction<\/code>:<\/p>\n<pre><code class=\"sql\">{{     config(         schema='raw',         materialized='table'     ) }}   with transaction_day_dedup as ( select * from ( select *,    row_number() over (       partition by pa.\"transaction_id\"                order by pa.\"savetime\" asc            ) as rn from {{ source('pure', 'pure_transactions') }} pa where  '{{ var('raw_transactions')['start_date'] }}' &lt;= transaction_date and  transaction_date &lt; '{{ var('raw_transactions')['end_date'] }}' ) as h where rn = 1 ) select \"transaction_id\" as transaction_id, \"transaction_date\" as transaction_date, \"price\" as price, \"quantity\" as quantity, \"product_name\" as product_name, \"cat_id\" as cat_id,     ...     'PURE_TRANSACTIONS' as record_source from transaction_day_dedup ra<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e CTE \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u0438 \u0434\u0435\u0434\u0443\u0431\u043b\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e \u043f\u043e\u043b\u044e\u00a0<code>transaction_id<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u00a0<code>raw.raw_transaction<\/code>\u00a0\u0443 \u043d\u0430\u0441 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 1 \u0434\u0435\u043d\u044c, \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435\u00a0<br \/><code>var('raw_transactions')['start_date']<\/code>\u00a0\u0438\u00a0<br \/><code>var('raw_transactions')['end_date']<\/code>:<\/p>\n<pre><code class=\"yaml\">vars:   raw_transactions:     start_date: '2022-01-01 00:00:00.0'     end_date: '2022-01-02 00:00:00.0'<\/code><\/pre>\n<h4>Stage<\/h4>\n<p>\u041a \u0434\u0430\u043d\u043d\u044b\u043c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u00a0<code>raw.raw_transaction<\/code>\u00a0\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u0445 DataVault.<\/p>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u00a0<a href=\"https:\/\/dbtvault.readthedocs.io\/en\/latest\/\" rel=\"noopener noreferrer nofollow\">dbtvault<\/a>\u00a0(\u0435\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e dbt). \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e boilerplate \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 \u043a\u043e\u0440\u0435\u043d\u044c dbt \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0444\u0430\u0439\u043b\u00a0<code>package.yml<\/code>\u00a0\u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"yaml\">packages:   - git: \"https:\/\/github.com\/markporoshin\/dbtvault.git\"     revision: develop<\/code><\/pre>\n<p>\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">dbt deps<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443 \u0432\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0430\u043f\u043a\u0430 dbt_packages, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u043c\u043e\u0434\u0435\u043b\u0438\u00a0<code>stage_transactions<\/code>\u00a0\u043c\u044b \u0437\u0430\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\u00a0<code>yaml_metadata<\/code>\u00a0\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043d\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0439. \u0418\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430:<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439: \u0445\u0430\u0431\u044b \u0438 \u043b\u0438\u043d\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>HASHDIFF \u2014 \u0445\u0435\u0448\u0438 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"sql\">{{     config(         schema='stage',         materialized='table',     ) }}   {%- set yaml_metadata -%} source_model: 'raw_transactions' derived_columns:   LOAD_DATE: (SAVETIME + 1 * INTERVAL '1 day')   EFFECTIVE_FROM: 'SAVETIME' hashed_columns:   TRANSACTION_PK:     - 'transaction_id'   TRANSACTION_HASHDIFF:     is_hashdiff: true     columns:       - 'price'       - 'quantity'       - 'transaction_date'   PRODUCT_PK:     - 'product_name'   PRODUCT_HASHDIFF:     is_hashdiff: true     columns:     - 'cat_id'   LINK_TRANSACTION_PRODUCT_PK:     - 'transaction_id'     - 'product_name' ... {%- endset -%}  {% set metadata_dict = fromyaml(yaml_metadata) %}  {% set source_model = metadata_dict['source_model'] %}  {% set derived_columns = metadata_dict['derived_columns'] %}  {% set hashed_columns = metadata_dict['hashed_columns'] %}  {{ dbtvault.stage(include_source_columns=true,                   source_model=source_model,                   derived_columns=derived_columns,                   hashed_columns=hashed_columns,                   ranked_columns=none) }}<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u00a0<code>stage.stage_transactions<\/code>\u00a0\u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><code>transaction_id<\/code><\/p>\n<\/li>\n<li>\n<p><code>transaction_date<\/code><\/p>\n<\/li>\n<li>\n<p><code>price<\/code><\/p>\n<\/li>\n<li>\n<p><code>quantity<\/code><\/p>\n<\/li>\n<li>\n<p><code>product_name<\/code><\/p>\n<\/li>\n<li>\n<p><code>cat_id<\/code><\/p>\n<\/li>\n<li>\n<p><code>transaction_pk<\/code><\/p>\n<\/li>\n<li>\n<p><code>transaction_hashdiff<\/code><\/p>\n<\/li>\n<li>\n<p><code>product_pk<\/code><\/p>\n<\/li>\n<li>\n<p><code>product_hashdiff<\/code><\/p>\n<\/li>\n<li>\n<p><code>link_transaction_product_pk<\/code><\/p>\n<\/li>\n<li>\n<p><code>load_date<\/code><\/p>\n<\/li>\n<li>\n<p><code>effective_from<\/code><\/p>\n<\/li>\n<li>\n<p><code>record_source<\/code><\/p>\n<\/li>\n<li>\n<p>\u2026<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0445\u0435\u0448\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0438 DataVault.<\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0425\u0430\u0431\u0430<\/h4>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0445\u0430\u0431\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u201c\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u201d, \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u00a0<code>cleanedname<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043b\u044e\u0447\u043e\u043c(natural key), \u043d\u0430 stage \u0441\u0442\u0430\u0434\u0438\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\u00a0<code>product_pk<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0435\u00a0<code>classid<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c.<\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0445\u0430\u0431\u0430 product \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"sql\">{{     config(         schema='raw_vault',         materialized='incremental',         distributed_by='product_pk',     ) }}   {%- set source_model = \"stage_transactions\" -%} {%- set src_pk = \"product_pk\" -%} {%- set src_nk = \"cleanedname\" -%} {%- set src_ldts = \"load_date\" -%} {%- set src_source = \"record_source\" -%}  {{ config(schema='raw_vault') }}  {{ dbtvault.hub(src_pk=src_pk, src_nk=src_nk, src_ldts=src_ldts,                 src_source=src_source, source_model=source_model) }}<\/code><\/pre>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0445\u0435\u043c\u0443, \u0442\u0438\u043f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043a\u043b\u044e\u0447 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<ol>\n<li>\n<p><code>source_model<\/code>\u00a0\u2014 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0445\u0430\u0431\u0430;<\/p>\n<\/li>\n<li>\n<p><code>src_pk<\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0445\u0430\u0431\u0430;<\/p>\n<\/li>\n<li>\n<p><code>src_nk<\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043b\u044e\u0447 \u0445\u0430\u0431\u0430;<\/p>\n<\/li>\n<li>\n<p><code>load_date<\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0441 \u0434\u0430\u0442\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p><code>src_source<\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c DDL:<\/p>\n<pre><code class=\"sql\">CREATE TABLE raw_vault.h_product ( product_pk text NULL, cleanedname text NULL, load_date text NULL, record_source unknown NULL ) WITH ( appendonly=true, blocksize=32768, orientation=column, compresstype=zstd, compresslevel=4 ) DISTRIBUTED BY (product_pk);<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u0445\u0430\u0431\u0430. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c &#171;\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f&#187;(\u0441\u0442\u043e\u0447\u043a\u0430 \u0447\u0435\u043a\u0430), \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b\u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0443, \u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 <code>incomingdate<\/code> \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043d\u0435\u043c\u0443. \u0423 \u043d\u0430\u0441 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0445\u0430\u0431\u0430 \u0431\u0435\u0437 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432.<\/p>\n<pre><code class=\"sql\">{% set fields_string %}     transaction_pk text NULL,     load_date text NULL,     record_source text NULL,     transaction_id text NULL,     transaction_date timestamp NULL {% endset %}   {% set raw_partition %}     PARTITION BY RANGE (transaction_date)     (         START ('2020-01-01'::timestamp) INCLUSIVE         END ('2028-01-01'::timestamp) EXCLUSIVE         EVERY (INTERVAL '1 day'),         DEFAULT PARTITION extra     ); {% endset %}  {{     config(         schema='raw_vault',         materialized='incremental',         compresslevel=4,         distributed_by='transaction_pk',         fields_string=fields_string,         raw_partition=raw_partition     ) }}   {%- set source_model = \"stage_transactions\" -%} {%- set src_pk = \"transaction_pk\" -%} {%- set src_nk = \"transaction_date\" -%} {%- set src_ldts = \"load_date\" -%} {%- set src_source = \"record_source\" -%} {%- set src_extra = [\"transaction_date\"] -%} {%- set partition_cause = \"'\" + var('h_transaction')['start_date'] + \"' &lt;= transaction_date and transaction_date &lt; '\" + var('h_transaction')['start_date'] + \"'\" -%}   {{ config(schema='raw_vault') }}  {{ dbtvault.hub(src_pk=src_pk, src_nk=src_nk, src_ldts=src_ldts,                 src_source=src_source, source_model=source_model,                 src_extra=src_extra, partition_cause=partition_cause) }}<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 DataVault, \u043d\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0435\u043c\u0443 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u0440\u043e\u0433\u043e.<\/p>\n<p>DDL \u043c\u043e\u0434\u0435\u043b\u0438\u00a0<code>h_transaction<\/code>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE raw_vault.h_transaction ( transaction_pk text NULL, load_date text NULL, record_source text NULL, transaction_id text NULL, transaction_date timestamp NULL ) WITH ( appendonly=true, blocksize=32768, orientation=column, compresstype=zstd, compresslevel=4 ) DISTRIBUTED BY (transaction_pk) PARTITION BY RANGE(transaction_date)  ( START ('2020-01-01 00:00:00'::timestamp without time zone) END ('2028-01-01 00:00:00'::timestamp without time zone) EVERY ('1 day'::interval) WITH (appendonly='true', blocksize='32768', orientation='column', compresstype=zstd, compresslevel='4')            COLUMN transaction_pk ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4)            COLUMN load_date ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4)            COLUMN record_source ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4)            COLUMN transaction_id ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4)            COLUMN transaction_date ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4),  DEFAULT PARTITION extra  WITH (appendonly='true', blocksize='32768', orientation='column', compresstype=zstd, compresslevel='4')            COLUMN transaction_pk ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4)            COLUMN load_date ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4)            COLUMN record_source ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4)            COLUMN transaction_id ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4)            COLUMN transaction_date ENCODING (blocksize=32768, compresstype=zstd, compresslevel=4) );<\/code><\/pre>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u0430<\/h4>\n<p>\u0423 \u0445\u0430\u0431\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u00a0<code>cat_id<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442 \u0434\u043b\u044f \u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"sql\">{{     config(         schema='raw_vault',         materialized='incremental',         distributed_by='product_pk',     ) }}   {%- set source_model = \"stage_transactions\" -%} {%- set src_pk = \"product_pk\" -%} {%- set src_hashdiff = \"product_hashdiff\" -%} {%- set src_payload = [\"cat_id, productname\"] -%} {%- set src_eff = \"effective_from\" -%} {%- set src_ldts = \"load_date\" -%} {%- set src_source = \"record_source\" -%}   {{ dbtvault.sat(src_pk=src_pk, src_hashdiff=src_hashdiff,                 src_payload=src_payload, src_eff=src_eff,                 src_ldts=src_ldts, src_source=src_source,                 source_model=source_model) }}<\/code><\/pre>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438\u0445 \u0445\u0430\u0431 \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445:<\/p>\n<ol>\n<li>\n<p><code>src_hashdiff<\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435 \u0445\u0435\u0448 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432;<\/p>\n<\/li>\n<li>\n<p><code>src_eff<\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0435 \u0434\u0430\u0442\u0443, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p><code>src_payload<\/code>\u00a0\u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 \u0445\u0430\u0431\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u043e\u0432, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442 \u0434\u043b\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"sql\">{% set fields_string %}   transaction_pk text NULL, transaction_id text NULL, transaction_hashdiff text NULL, price float4 NULL, quantity float4 NULL, transaction_date timestamp NULL, load_date text NULL, record_source text NULL {% endset %}   {% set raw_partition %}     PARTITION BY RANGE (transaction_date)     (         START ('2020-01-01'::timestamp) INCLUSIVE         END ('2028-01-01'::timestamp) EXCLUSIVE         EVERY (INTERVAL '1 day'),         DEFAULT PARTITION extra     ); {% endset %}  {{     config(         schema='raw_vault',         materialized='incremental',         compresslevel=4,         distributed_by='transaction_pk',         fields_string=fields_string,         raw_partition=raw_partition     ) }}  {%- set source_model = \"stage_transactions\" -%} {%- set src_pk = \"transaction_pk\" -%} {%- set src_hashdiff = \"transaction_hashdiff\" -%} {%- set src_payload = [     \"price\",     \"quantity\",     \"itemsum\",     \"transaction_id\",     \"transaction_date\" ] -%} {%- set src_eff = \"EFFECTIVE_FROM\" -%} {%- set src_ldts = \"LOAD_DATE\" -%} {%- set src_source = \"RECORD_SOURCE\" -%} {%- set partition_cause = \"'\" + var('hs_transaction')['start_date'] + \"' &lt;= transaction_date and transaction_date &lt; '\" + var('hs_transaction')['start_date'] + \"'\" -%}   {{ config(schema='raw_vault') }}  {{ dbtvault.sat(src_pk=src_pk, src_hashdiff=src_hashdiff,                 src_payload=src_payload, src_eff=src_eff,                 src_ldts=src_ldts, src_source=src_source,                 source_model=source_model, partition_cause=partition_cause) }}<\/code><\/pre>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u0438\u043d\u043a\u0438<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0445\u0430\u0431\u0430 \u0438 \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u044b \u043a \u043d\u0438\u043c, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0438\u0445. \u0412 \u0440\u043e\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 DavaVault \u0441\u043b\u0443\u0436\u0430\u0442 \u0441\u0441\u044b\u043b\u043a\u0438.<\/p>\n<pre><code class=\"sql\">{% set fields_string %}     link_transaction_product_pk text NULL,     transaction_pk text NULL,     product_pk text NULL,     load_date text NULL,     record_source text NULL,     transaction_date timestamp NULL {% endset %}   {% set raw_partition %}     PARTITION BY RANGE (transaction_date)     (         START ('2020-01-01'::timestamp) INCLUSIVE         END ('2028-01-01'::timestamp) EXCLUSIVE         EVERY (INTERVAL '1 day'),         DEFAULT PARTITION extra     ); {% endset %}  {{     config(         schema='raw_vault',         materialized='incremental',         compresslevel=4,         distributed_by='link_transaction_product_pk',         fields_string=fields_string,         raw_partition=raw_partition     ) }}   {%- set source_model = \"stage_transactions\" -%} {%- set src_pk = \"link_transaction_product_pk\" -%} {%- set src_fk = [\"transaction_pk\", \"product_pk\"] -%} {%- set src_ldts = \"load_date\" -%} {%- set src_source = \"record_source\" -%} {%- set src_extra = [\"incomingdate\"] -%} {%- set partition_cause = \"'\" + var('hs_transaction')['start_date'] + \"' &lt;= transaction_date and transaction_date &lt; '\" + var('hs_transaction')['start_date'] + \"'\" -%}  {{ dbtvault.link(src_pk=src_pk, src_fk=src_fk, src_ldts=src_ldts,                  src_source=src_source, source_model=source_model,                 src_extra=src_extra, partition_cause=partition_cause) }}<\/code><\/pre>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0438 DavaVault \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u044b \u0434\u043b\u044f link, \u043e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u0441\u0432\u044f\u0437\u0438 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c. \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430\u0441\u0447\u0435\u0442 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u0432\u0443\u043c\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u2014 \u043b\u0438\u0447\u043d\u043e \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0431\u0435\u0437 \u043e\u0441\u0442\u0440\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f NULL.<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>\u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0430\u0441 \u0443\u0431\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 dbt \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 datavault \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 DavaVault. \u042f \u0431\u0443\u0434\u0443 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0434 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f\u043c, \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u044e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0434\u043b\u044f Greenplum =)<\/p>\n<p>\u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0442\u043e\u0433 \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043c\u043e\u0433\u0443 \u0434\u0430\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a:<\/p>\n<ol>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e;<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0443\u0447\u0438\u0442\u0435 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 dbtvault, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u043e\u0433\u0434\u0430 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0432\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0412 greenplum \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0430\u044f \u0444\u0438\u0447\u0430\u00a0<code>external table<\/code>\u00a0\u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (<code>pure<\/code>\u00a0\u0441\u0445\u0435\u043c\u0430 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435).<\/p>\n<\/li>\n<\/ol>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043f\u043e\u043a\u0440\u044b\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0442\u0435\u043c\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Dagster(\u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 Airflow \u043e\u0442 \u0435\u0433\u043e \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439). \u0415\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430, \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043d\u0435\u0439.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/671836\/\"> https:\/\/habr.com\/ru\/post\/671836\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u0440\u043a \u041f\u043e\u0440\u043e\u0448\u0438\u043d, \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c DataScience \u0432 DV Group. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0443\u0436\u0435\u00a0<a href=\"https:\/\/www.notion.so\/DBT-Data-Built-Tool-aa97fc403c564270bc84f04e65c0be19\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b<\/a>\u00a0\u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e dbt. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u043c\u044b \u0432 DV Group \u043f\u043e\u0436\u0435\u043d\u0438\u043b\u0438 dbt, Greenplum \u0438 DataVault, \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u0441\u0435 \u0433\u0440\u0430\u0431\u043b\u0438, \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u0438; \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u0438\u043b\u0438 \u0432 open-source, \u043d\u043e \u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 DataVault. DataVault &#8212; \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0430\u044f \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 (3\u0430\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430). \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0435\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>hub &#8212; \u201c\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u201d \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043b\u044e\u0447;<\/p>\n<\/li>\n<li>\n<p>satellite &#8212; \u201c\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438\u201d, \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u0435 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0441 \u0445\u0430\u0431\u043e\u043c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>link &#8212; \u201c\u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438\u201d &#8212; \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043c\u0435\u0436\u0434\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0432\u0443\u043c\u044f).<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u043b\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0445 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0445 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0442\u043e\u0432\u0430\u0440\u043e\u0432. \u041a\u0430\u043a \u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c ER \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430?<\/p>\n<figure class=\"full-width\"><figcaption>er \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430<\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u00a0\u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u0430\u0445\u00a0\u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u00a0<code>effective_from<\/code>\u00a0\u0438\u00a0<code>&lt;entity>_hashdiff<\/code>, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432 DavaVault \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B5%D0%B4%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE_%D0%BC%D0%B5%D0%BD%D1%8F%D1%8E%D1%89%D0%B5%D0%B5%D1%81%D1%8F_%D0%B8%D0%B7%D0%BC%D0%B5%D1%80%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">SCD2<\/a>, \u044d\u0442\u043e \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c   \u201c\u0432\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u044c\u201d \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e Data Vault \u043c\u043e\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwiXysm0gP33AhXWSPEDHS2wATsQFnoECC8QAQ&amp;url=https%3A%2F%2Fdanlinstedt.com%2Fwp-content%2Fuploads%2F2018%2F06%2FDVModelingSpecs2-0-1.pdf&amp;usg=AOvVaw1HMJWxIh7CKHNkeasrhvEf\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwjvwZHIgP33AhX_S_EDHeeMC9UQFnoECAwQAQ&amp;url=https%3A%2F%2Fhabr.com%2Fru%2Fpost%2F348188%2F&amp;usg=AOvVaw04i0YZK15-qSzU0yFPnEaP\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 1<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwjvwZHIgP33AhX_S_EDHeeMC9UQFnoECAkQAQ&amp;url=https%3A%2F%2Fhabr.com%2Fru%2Fpost%2F502968%2F&amp;usg=AOvVaw0wF5JaQEEHyRxHKLhwiejo\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 2<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0445\u043e\u0447\u0443 \u0434\u0430\u0442\u044c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f\u00a0<a href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/588582\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435\u0439<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0435 \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u044f \u0445\u043e\u0447\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044f\u0445, \u0430 \u0435\u0449\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b\u0438.<\/p>\n<h3>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h3>\n<p>\u0418\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443\u00a0<code>pure.pure_transactions<\/code>\u00a0\u043d\u0430 Greenplum \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Data Vault, \u0442.\u0435. \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0445\u0430\u0431\u044b, \u043b\u0438\u043d\u043a\u0438 \u0438 \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u044b. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 3 \u044d\u0442\u0430\u043f\u0430.<\/p>\n<ol>\n<li>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f (\u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 1 \u0434\u0435\u043d\u044c).<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043e\u0433\u0430\u0442\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0445\u0435\u0448\u0430\u043c\u0438, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0440\u0430\u0441\u0449\u0435\u043f\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><figcaption>pipeline \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f datavault<\/figcaption><\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430\u00a0<code>pure.pure_transactions<\/code>\u00a0\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443, \u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<ol>\n<li>\n<p>id \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438(<code>transaction_id<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u0442\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438(<code>transaction_date<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u0446\u0435\u043d\u0430 \u0442\u043e\u0432\u0430\u0440\u0430(<code>price<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u043e\u0432\u0430\u0440\u0430(<code>quantity<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u0430(<code>product_name<\/code>);<\/p>\n<\/li>\n<li>\n<p>id \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u043e\u0432\u0430\u0440\u0430(<code>cat_id<\/code>);<\/p>\n<\/li>\n<\/ol>\n<p>\u041c\u044b \u0432\u044b\u0434\u0435\u043b\u0438\u043b\u0438 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0432\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438<\/p>\n<ol>\n<li>\n<p>\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0432 \u0447\u0435\u043a\u0435 (<code>transaction_id<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u0442\u043e\u0432\u0430\u0440 (<code>product_name<\/code>);<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0435\u0433\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438 \u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443.<\/p>\n<h3>\u0410\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f greenplum<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c dbt-\u043a\u043e\u0434, \u0445\u043e\u0447\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Greenplum. Greenplum \u2014 \u0431\u0430\u0437\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Postgres, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442, \u043d\u043e \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043b\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0<a href=\"https:\/\/github.com\/markporoshin\/dbt-greenplum\" rel=\"noopener noreferrer nofollow\">dbt<\/a>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c\u00a0<a href=\"https:\/\/gpdb.docs.pivotal.io\/6-20\/ref_guide\/sql_commands\/CREATE_TABLE_AS.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0410 \u0435\u0449\u0435 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u00a0<a href=\"https:\/\/www.youtube.com\/watch?v=TupXHhdSrhg\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u043b\u0430\u0434<\/a>\u043e\u043c, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c Greenplum.<\/p>\n<p><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430<\/strong><\/p>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c Greenplum \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0446\u0438\u0438. \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044e Greenplum \u0431\u0443\u0434\u0435\u0442 \u201c\u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u201d \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u043e\u043b\u044e \u0431\u0443\u0434\u0443\u0442 \u0441\u0430\u043c\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 join-\u044b. \u0423\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"sql\">{{     config( ...         distributed_by='&lt;field_name>' ...     ) }}<\/code><\/pre>\n<p><strong>\u0421\u0436\u0430\u0442\u0438\u0435 \u0438 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u0430\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/strong><\/p>\n<p>Greenplum \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\/\u0437\u0430\u043f\u0438\u0441\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0441\u0436\u0430\u0442\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0412 dbt \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0434\u043b\u044f Greenplum, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"sql\">{{     config(         ...         appendonly='true',         orientation='column',         compresstype='ZSTD',         compresslevel=4,         blocksize=32768 ...     ) }}<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u00a0<code>appendonly='true'<\/code>, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 Greenplum \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043e\u043a. \u0410 \u0435\u0449\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u0443\u044e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e\u00a0<code>orientation='column'<\/code>. \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0442\u0438\u043f \u0441\u0436\u0430\u0442\u0438\u044f\u00a0<code>compresstype='ZSTD'<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u00a0<code>compresslevel=4<\/code>,\u00a0<code>blocksize=32768<\/code>. \u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442.<\/p>\n<p><strong>\u041f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 postgres \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0442 \u0443 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 dbt-postgres(\u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u043d\u044f, \u0435\u0441\u043b\u0438 \u044f \u043e\u0448\u0438\u0431\u0430\u044e\u0441\u044c). \u041f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438. \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0432 Greenplum \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code>create table as select<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0439 \u0444\u0438\u0447\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u043e\u0439. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u0435\u0439 \u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"sql\">{% set fields_string %}      id int4 null,      incomingdate timestamp NULL {% endset %}   {% set raw_partition %}     PARTITION BY RANGE (incomingdate)     (         START ('2021-01-01'::timestamp) INCLUSIVE         END ('2023-01-01'::timestamp) EXCLUSIVE         EVERY (INTERVAL '1 day'),         DEFAULT PARTITION extra     ); {% endset %}  {{     config( ...         fields_string=fields_string,         raw_partition=raw_partition,         default_partition_name='other_data' ...     ) }}<\/code><\/pre>\n<h3>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 DataVault<\/h3>\n<h4>Raw<\/h4>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u0434\u0435\u043d\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u00a0<code>raw.raw_transaction<\/code>:<\/p>\n<pre><code class=\"sql\">{{     config(         schema='raw',         materialized='table'     ) }}   with transaction_day_dedup as ( select * from ( select *,    row_number() over (       partition by pa.\"transaction_id\"                order by pa.\"savetime\" asc            ) as rn from {{ source('pure', 'pure_transactions') }} pa where  '{{ var('raw_transactions')['start_date'] }}' &lt;= transaction_date and  transaction_date &lt; '{{ var('raw_transactions')['end_date'] }}' ) as h where rn = 1 ) select \"transaction_id\" as transaction_id, \"transaction_date\" as transaction_date, \"price\" as price, \"quantity\" as quantity, \"product_name\" as product_name, \"cat_id\" as cat_id,     ...     'PURE_TRANSACTIONS' as record_source from transaction_day_dedup ra<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e CTE \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u0438 \u0434\u0435\u0434\u0443\u0431\u043b\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e \u043f\u043e\u043b\u044e\u00a0<code>transaction_id<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u00a0<code>raw.raw_transaction<\/code>\u00a0\u0443 \u043d\u0430\u0441 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 1 \u0434\u0435\u043d\u044c, \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435\u00a0<br \/><code>var('raw_transactions')['start_date']<\/code>\u00a0\u0438\u00a0<br \/><code>var('raw_transactions')['end_date']<\/code>:<\/p>\n<pre><code class=\"yaml\">vars:   raw_transactions:     start_date: '2022-01-01 00:00:00.0'     end_date: '2022-01-02 00:00:00.0'<\/code><\/pre>\n<h4>Stage<\/h4>\n<p>\u041a \u0434\u0430\u043d\u043d\u044b\u043c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u00a0<code>raw.raw_transaction<\/code>\u00a0\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u0445 DataVault.<\/p>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u00a0<a href=\"https:\/\/dbtvault.readthedocs.io\/en\/latest\/\" rel=\"noopener noreferrer nofollow\">dbtvault<\/a>\u00a0(\u0435\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e dbt). \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e boilerplate \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 \u043a\u043e\u0440\u0435\u043d\u044c dbt \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0444\u0430\u0439\u043b\u00a0<code>package.yml<\/code>\u00a0\u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"yaml\">packages:   - git: \"https:\/\/github.com\/markporoshin\/dbtvault.git\"     revision: develop<\/code><\/pre>\n<p>\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">dbt deps<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443 \u0432\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0430\u043f\u043a\u0430 dbt_packages, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u043c\u043e\u0434\u0435\u043b\u0438\u00a0<code>stage_transactions<\/code>\u00a0\u043c\u044b \u0437\u0430\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\u00a0<code>yaml_metadata<\/code>\u00a0\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043d\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0439. \u0418\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430:<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439: \u0445\u0430\u0431\u044b \u0438 \u043b\u0438\u043d\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>HASHDIFF \u2014 \u0445\u0435\u0448\u0438 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u0441\u0430\u0442\u0435\u043b\u043b\u0438\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"sql\">{{     config(         schema='stage',         materialized='table',     ) }}   {%- set yaml_metadata -%} source_model: 'raw_transactions' derived_columns:   LOAD_DATE: (SAVETIME + 1 * INTERVAL '1 day')   EFFECTIVE_FROM: 'SAVETIME' hashed_columns:   TRANSACTION_PK:     - 'transaction_id'   TRANSACTION_HASHDIFF:     is_hashdiff: true     columns:       - 'price'       - 'quantity'       - 'transaction_date'   PRODUCT_PK:     - 'product_name'   PRODUCT_HASHDIFF:     is_hashdiff: true     columns:     - 'cat_id'   LINK_TRANSACTION_PRODUCT_PK:     - 'transaction_id'     - 'product_name' ... {%- endset -%}  {% set metadata_dict = fromyaml(yaml_metadata) %}  {% set source_model = metadata_dict['source_model'] %}  {% set derived_columns = metadata_dict['derived_columns'] %}  {% set hashed_columns = metadata_dict['hashed_columns'] %}  {{ dbtvault.stage(include_source_columns=true,                   source_model=source_model,                   derived_columns=derived_columns,                   hashed_columns=hashed_columns,                   ranked_columns=none) }}<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u00a0<code>stage.stage_transactions<\/code>\u00a0\u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><code>transaction_id<\/code><\/p>\n<\/li>\n<li>\n<p><code>transaction_date<\/code><\/p>\n<\/li>\n<li>\n<p><code>price<\/code><\/p>\n<\/li>\n<li>\n<p><code>quantity<\/code><\/p>\n<\/li>\n<li>\n<p><code>product_name<\/code><\/p>\n<\/li>\n<li>\n<p><code>cat_id<\/code><\/p>\n<\/li>\n<li>\n<p><code>transaction_pk<\/code><\/p>\n<\/li>\n<li>\n<p><code>transaction_hashdiff<\/code><\/p>\n<\/li>\n<li>\n<p><code>product_pk<\/code><\/p>\n<\/li>\n<li>\n<p><code>product_hashdiff<\/code><\/p>\n<\/li>\n<li>\n<p><code>link_transaction_product_pk<\/code><\/p>\n<\/li>\n<li>\n<p><code>load_date<\/code><\/p>\n<\/li>\n<li>\n<p><code>effective_from<\/code><\/p>\n<\/li>\n<li>\n<p><code>record_source<\/code><\/p>\n<\/li>\n<li>\n<p>\u2026<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0445\u0435\u0448\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0438 DataVault.<\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0425\u0430\u0431\u0430<\/h4>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0445\u0430\u0431\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u201c\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u201d, \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u00a0<code>cleanedname<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043b\u044e\u0447\u043e\u043c(natural key), \u043d\u0430 stage \u0441\u0442\u0430\u0434\u0438\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\u00a0<code>product_pk<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0435\u00a0<code>classid<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c.<\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0445\u0430\u0431\u0430 product \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"sql\">{{     config(         schema='raw_vault',         materialized='incremental',         distributed_by='product_pk',     ) }}   {%- set source_model = \"stage_transactions\" -%} {%- set src_pk = \"product_pk\" -%} {%- set src_nk = \"cleanedname\" -%} {%- set src_ldts = \"load_date\" -%} {%- set src_source = \"record_source\" -%}  {{ config(schema='raw_vault') }}  {{ dbtvault.hub(src_pk=src_pk, src_nk=src_nk, src_ldts=src_ldts,                 src_source=src_source,<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-334602","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/334602","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=334602"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/334602\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=334602"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=334602"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=334602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}