{"allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"cssClassNames":"page basicpage summit-page","templateName":"quickstart-page-template","description":"This is a sample Snowflake Guide","language":"en","title":"Leverage dbt Cloud to Generate ML ready pipelines using Snowpark python","analyticsPageType":"quickstart-page-template","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"markup_editor_1950346551":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-banner":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-header":"aem-GridColumn aem-GridColumn--default--12","responsivegrid":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-footer":"aem-GridColumn aem-GridColumn--default--12","modal_container":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"columnCount":12,":items":{"experiencefragment-banner":{"id":"experiencefragment-efeb29257d","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/master/jcr:content","configured":true,":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"pushdown_banner_copy":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-a68f3a45b6",":items":{"pushdown_banner_copy":{"id":"pushdown-banner-7e27eae24c","contentHeadline":"Snowflake World Tour hits your city","contentDescription":"See how leading teams deploy agents at scale. Find a stop near you. Register free.","contentJustifyContent":"center","linkStyle":"text-white","linkCTA":{"id":"link-cta","heapButtonClasses":["pushdown_banner"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"/en/world-tour/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Register now"},":type":"snowflake-site/components/pushdown-banner","appliedCssClassNames":"snowflake-pushdown-banner-text-white snowflake-pushdown-banner-background-black"}},":itemsOrder":["pushdown_banner_copy"],":type":"snowflake-site/components/container"},"image":{":type":"nt:unstructured"},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:metadata"],":type":"snowflake-site/components/experiencefragment","classNames":"aem-xf"},"experiencefragment-header":{"id":"experiencefragment-58d8ef7dd7","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/jcr:content","configured":true,":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"mega_header":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-ec290e2659",":items":{"markup_editor":{"id":"markup-editor-89b3190791","title":" ","cssContent":".footer-nav__link-group .snowflake-button-container,.subnav__item--button,.snowflake-card-v2-advanced-button .snowflake-button-container{justify-content:flex-start}.mega-nav__sign-in.snowflake-button-container{display:none}@media screen and (min-width:768px){.mega-nav__sign-in.snowflake-button-container{display:inline-block;font-family:'Texta',sans-serif;font-weight:800 !important}}@media screen and (min-width:1024px) and (max-width:1199px){.snowflake-mega-nav-header-buttons-container .snowflake-button-blue .snowflake-button-container{font-size:13px !important}.snowflake-language-navigation .language-icon{width:18px !important;height:18px !important;margin-right:4px !important}}.mega-nav__sign-in svg{display:none}.nav-item__platform-parent-why-sf.snowflake-mega-nav-nav-item\u003Ea:hover,.nav-item__platform-parent.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:transparent !important}.nav-platform-sidebar .snowflake-mega-nav-nav-item:hover.blue-icon .snowflake-mega-nav-nav-item-icon__inner{background-color:var(--ui-01) !important}@media screen and (min-width:1024px){.snowflake-mega-nav-navigation-dropdown{overflow:hidden}.meganav-platform-features{padding-left:64px}.meganav-platform-features::before{content:'';transform:translateX(-64px);display:block;z-index:0;width:100%;height:100%;position:absolute;top:0;background:#f7f9fa}.nav-item--si.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:transparent}.nav-item--si{border-bottom:1px solid #ccc;padding-bottom:16px;margin-bottom:8px}.nav-item__platform-parent{border-bottom:1px solid #ccc;margin-bottom:8px;padding-bottom:16px}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-description::after{content:'What Snowflake can do for you \u003E';display:block;color:var(--ui-01);margin-top:16px}.nav-item__platform-parent .snowflake-mega-nav-nav-item-description::after{content:'View the platform \u003E';display:block;color:var(--ui-01);margin-top:16px}}@media screen and (min-width:1367px){.snowflake-mega-nav-nav-item-description{font-size:13px !important;line-height:20px !important}.snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title{font-size:17px !important}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-title,.nav-item__platform-parent .snowflake-mega-nav-nav-item-title{font-size:24px !important;line-height:32px !important;margin-bottom:8px !important}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-description,.nav-item__platform-parent .snowflake-mega-nav-nav-item-description{font-size:14px !important;line-height:20px !important}}html.wf-texta-n9-loading .display-1-v2{font-size:48px!important;line-height:50px!important;letter-spacing:-.5px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-4-v2{font-size:18px!important;line-height:24px!important;font-family:sans-serif!important}@media screen and (min-width:768px){html.wf-texta-n9-loading .display-2-v2{font-size:48px!important;line-height:50px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-1-v2{font-size:55.5px!important;line-height:54px!important;letter-spacing:-.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .heading-5-v2,html.wf-lato-n4-loading .snowflake-card-v2-advanced-text .snowflake-text p{font-size:15.5px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-2,html.wf-texta-n9-loading .heading-2-v2{font-size:34px!important;line-height:38px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2.snowflake-mega-nav-navigation-title{font-size:13.5px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-4,html.wf-texta-n8-loading .snowflake-button-container,html.wf-texta-n8-loading .snowflake-button-regular .snowflake-button-container{font-size:13px!important;line-height:20px!important;letter-spacing:.25px!important;font-family:sans-serif!important}}@media screen and (min-width:1024px){html.wf-lato-n4-loading .snowflake-mega-nav-nav-item-description{font-size:11.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .text-size-regular .snowflake-text li,html.wf-lato-n4-loading .text-size-regular .snowflake-text p,html.wf-lato-n4-loading .text-size-regular .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom span[data-testid=text-content]{font-size:13.5px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .snowflake-button-compact .snowflake-button-container{font-size:12px!important;letter-spacing:0!important;line-height:18px!important}}@media screen and (min-width:1367px){html.wf-lato-n4-loading .hp-hero__eyebrow a\u003Eb:first-child{font-size:11px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .hp-hero__eyebrow a{font-size:13px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-2-v2{font-size:61px!important;line-height:60px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-1-v2{font-size:74.5px!important;line-height:74px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-2,html.wf-texta-n9-loading .heading-2-v2{font-size:41px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-3-v2{font-family:sans-serif!important;letter-spacing:-.75px!important;font-size:33.75px!important}html.wf-texta-n9-loading .heading-4-v2{font-size:19.5px!important;line-height:26px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2{font-size:12px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2.snowflake-mega-nav-navigation-title{font-size:14px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-1,html.wf-lato-n4-loading .cq-Editable-dom[data-cq-data-path*=text] ol\u003Eli,html.wf-lato-n4-loading .snowflake-text li,html.wf-lato-n4-loading .snowflake-text p,html.wf-lato-n4-loading .text-size-large .snowflake-text li,html.wf-lato-n4-loading .text-size-large .snowflake-text p,html.wf-lato-n4-loading .text-size-large .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-large.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-large.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-large.cq-Editable-dom span[data-testid=text-content],html.wf-lato-n4-loading.cq-Editable-dom[data-cq-data-path*=text]\u003Ep,html.wf-lato-n4-loading.cq-Editable-dom[data-cq-data-path*=text]\u003Eul\u003Eli{font-size:17.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .text-size-regular .snowflake-text li,html.wf-lato-n4-loading .text-size-regular .snowflake-text p,html.wf-lato-n4-loading .text-size-regular .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom span[data-testid=text-content],html.wf-texta-n8-loading .snowflake-button-link .snowflake-button-container,html.wf-texta-n8-loading .snowflake-button-link-back .snowflake-button-container{font-size:15.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-3,html.wf-lato-n4-loading .text-size-small .snowflake-text li,html.wf-lato-n4-loading .text-size-small .snowflake-text p,html.wf-lato-n4-loading .text-size-small .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-small.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-small.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-small.cq-Editable-dom span[data-testid=text-content]{font-size:13.5px!important;font-family:sans-serif!important}}#industryPlatformSection,.sc-hero{background-position:top left;background-size:20% auto}.bwalignc,.bwalignr{list-style-position:inside}.snowflake-text p sup{font-size:10px}#industryPlatformSection .industry-platform__row .snowflake-flexible-column-container-items,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container,.snowflake-hero-system-content-container{gap:16px}.agenda-item p,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.partner-details p{margin:0!important}.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container::after,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container::before,.hide-logo .snowflake-case-study-card-logo,.partner-page__powered-by-logo,.sc-hero div.code-toolbar\u003E.toolbar,.snowflake-card-v2-advanced.no-link .snowflake-card-v2-advanced-button,.snowflake-partner-hero-card-badge-container{display:none!important}.section--card-mobile-carousel .snowflake-flexible-column-container-items-with-carousel{max-width:100%!important}@media screen and (min-width:768px){.button-group-pair .snowflake-button-container.inline-button--desktop,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;display:inline-block!important}.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center;justify-content:flex-start!important}.button-group-pair.center\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center!important}.section--card-mobile-carousel{margin-left:var(--tablet-portrait-margin,48px)!important;margin-right:var(--tablet-portrait-margin,48px);width:calc(100% - 96px)!important;width:calc(100% - var(--tablet-portrait-margin) * 2)!important}}@media screen and (min-width:1024px){.section--card-mobile-carousel{margin-left:var(--tablet-horizontal-margin,48px)!important;margin-right:var(--tablet-horizontal-margin,48px);width:calc(100% - 96px)!important;width:calc(100% - var(--tablet-horizontal-margin) * 2)!important}.snowflake-mega-nav-header-mobile-icon{display:none!important}}@media screen and (min-width:1367px){.section--card-mobile-carousel{margin-left:var(--desktop-margin,6.5%)!important;margin-right:var(--desktop-margin,6.5%);width:87%!important;width:calc(100% - var(--desktop-margin) * 2)!important}.logo-container{min-width:143px}.sc-hero__headline .heading-1-v2{font-size:60px}.snowflake-mega-nav-navigation-title{font-size:17px}.snowflake-mega-nav-dropdown-footer-wrapper .snowflake-title-v2 .snowflake-title-v2-line:first-child{font-size:16px!important;line-height:24px!important}}.hero--home{overflow:hidden;background-color:var(--ui-01);z-index:2}.hp-hero__subheadline{width:90%}.hero--home .snowflake-button-container{transition:.3s}.hero--home .snowflake-button-primary a:hover,.hero--home .snowflake-button-secondary a:hover,.hero--home .snowflake-button-white a:hover{transition:.3s;background-color:var(--ui-02)!important;color:var(--ui-05)!important}.hero--home .snowflake-button-secondary a:hover{border-color:var(--ui-05)!important}.hero--home .snowflake-button-primary a:hover,.hero--home .snowflake-button-white a:hover{border-color:var(--ui-02)!important}.bwalignc,.hp-hero__eyebrow{text-align:center}.hp-hero__eyebrow a{display:inline-flex;flex-direction:column;justify-content:center;cursor:pointer;padding:8px;border-radius:var(--spacing-01);gap:8px;align-items:center;background-color:#45aee3;color:var(--ui-03);font-family:Texta,sans-serif;font-weight:800;font-size:16px;line-height:22px;transition:background-color .3s}.hp-hero__eyebrow a:hover{background-color:#7fc6ea;text-decoration:none;transition:background-color .3s}.hp-hero__eyebrow a\u003Eb:first-child{text-transform:uppercase;white-space:nowrap;display:inline-block;background-color:var(--ui-02);color:var(--ui-05);font-size:12px!important;line-height:16px!important;font-family:Lato,sans-serif;font-weight:500!important;padding:3px 6px;border-radius:2px;letter-spacing:1px}@media screen and (min-width:767px){.hp-hero__eyebrow{text-align:left}.hp-hero__eyebrow a{flex-direction:row;text-align:left}}.hero--home__inner .offset-video,.hero--home__inner .snowflake-experience-fragment,.offset-video__bg-image{max-height:200px;overflow:hidden}.hero--home__inner .offset-video .wistia-responsive-padding{padding-top:100%}.hero--home__inner .snowflake-experience-fragment,.offset-video__bg-image{position:absolute!important;top:0;left:0;width:100%}.offset-video__bg-image{z-index:-1}@media screen and (min-width:768px){.hero--home__inner .snowflake-experience-fragment,.offset-video,.offset-video__bg-image{position:absolute!important;max-height:none;top:0;left:0;width:250%;padding-bottom:250%;transform:translate(0,-50%);height:0}.workloads_7.unistore{max-width:317px}}.promo-banner--homepage{z-index:2}.homepage-banner-offset-container::after{content:\"\";display:block;position:absolute;bottom:0;z-index:1;left:0;width:100%;height:80%;background:#fff}.section--quicklinks .snowflake-button-full-width a{padding-left:24px!important;padding-right:24px!important;transition:box-shadow .25s cubic-bezier(.4,0,.2,1);text-align:left;display:flex;justify-content:center;align-items:center}.section--quicklinks .snowflake-button-full-width a:hover{box-shadow:0 16px 16px 0 rgb(0 0 0 / .16);transition:box-shadow .25s cubic-bezier(.4,0,.2,1)}.section--quicklinks .snowflake-button-container:focus-visible a::before,.section--quicklinks .snowflake-button-full-width a::before{content:\"\";width:23px;height:23px;flex-shrink:0;margin-right:12px;display:inline-block;background-size:cover;background-repeat:no-repeat;background-position:center}#industryPartnerSlider .snowflake-navigation-icon.swiper-button-disabled,#partnerResources .section--resource-hub a svg,.button-tabs span.snowflake-tabs-navigation-item:after,.customer-card--hide-cta .snowflake-case-study-card-button,.dot-tabs span.snowflake-tabs-navigation-item::after,.partner-sidebar__mobile-expand,html:not(.aem-AuthorLayer-initial):not(.aem-AuthorLayer-Edit) .tab-content:not(.is-active){display:none}.section--quicklinks .snowflake-button-full-width a.pricing::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/decorative-icons/pricing-icon.svg)}.section--quicklinks .snowflake-button-full-width a.snowflake_on_snowflake::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon_snowflake-bug.svg)}.section--quicklinks .snowflake-button-full-width a.virtual_hands_on_labs::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon__training.svg)}.section--quicklinks .snowflake-button-full-width a.weekly_demo::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon__webinars.svg)}@media screen and (min-width:1024px){.hero--home__inner .snowflake-experience-fragment,.offset-video,.offset-video__bg-image{left:-50%}.section--quicklinks .snowflake-flexible-column-container-items{gap:24px}.snowflake-quote-item-inner{padding:32px 24px 24px!important}}#communitiesOuter_overflowBottomGray::after{max-height:100px}#caseStudyOuter_overflowBottomMidBlue::after{max-height:180px}#caseStudyInner .snowflake-case-study-card .snowflake-wistia-video{border-radius:0!important}#caseStudyInner .snowflake-case-study-card{box-shadow:none!important;border-radius:0}#caseStudyInner{max-width:1200px;margin:0 auto;box-shadow:rgb(152 162 179 / .1) 0 10px 20px 0,rgb(152 162 179 / .25) 0 2px 6px 0;border-radius:8px;overflow:hidden;position:relative;z-index:1}.case-study__logo-bar\u003E.snowflake-flexible-column-container-items{background:#f7f9fa;padding:32px 16px 40px}.case-study__logo-bar .cmp-image__image{width:90%;margin:0 auto;max-width:240px}.hp-platform__text-group\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:first-child),.sc-sidebar__group .snowflake-button-link{margin-top:8px}.workloads_7.unistore{margin-left:auto;margin-right:auto}#homepageFootnotesInner .snowflake-simple-stat-disclaimer .snowflake-text p{color:#fff!important}.snowflake-simple-stat-disclaimer .snowflake-text p\u003Ea{border-bottom:1px solid var(--ui-03);color:var(--text-03)}.snowflake-card-v2-advanced{color:inherit}#workloadCardGridOuter .snowflake-card-v2-base-front{gap:0}.video-modal.snowflake-modal-window-open-inner{background-color:#fff0;padding:8px;border:none}.snowflake-container-arrow-dotted-faded .snowflake-container-arrow-dotted-faded-image{width:40%!important;max-width:420px;top:4%!important}.list--blue-bullets ul{margin:0!important;padding:0!important;list-style-type:none}.list--blue-bullets li{margin:0;padding:0 0 0 32px;position:relative}.list--blue-bullets li::before{content:\"\";display:block;border-radius:100%;background:#29b5e8;width:18px;height:18px;position:absolute;top:4px;left:0;border:5px solid #e5f2f7;box-sizing:border-box}.list--blue-bullets li:not(:last-child){margin-bottom:1rem}.logo-tabs .snowflake-navigation-container,.snowflake-simple-stat-content:empty,.summit-speaker-card .snowflake-card-v2-advanced-text{margin-bottom:0}#techResourceInner,#techResourceOuter,div.overflow-bottom--blue,div.overflow-bottom--gray,div.overflow-bottom--mid-blue,div.overflow-bottom--white,div.overflow-top--blue,div.overflow-top--gray,div.overflow-top--mid-blue,div.overflow-top--white,div[id$=overflowBottomGray],div[id$=overflowBottomMidBlue],div[id$=overflowTopBlue],div[id$=overflowTopGray]{position:relative}div.overflow-bottom--blue::after,div.overflow-bottom--gray::after,div.overflow-bottom--mid-blue::after,div.overflow-bottom--white::after,div.overflow-top--blue::after,div.overflow-top--gray::after,div.overflow-top--mid-blue::after,div.overflow-top--white::after,div[id$=overflowBottomGray]::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowBottomWhite]::after,div[id$=overflowTopBlue]::after,div[id$=overflowTopGray]::after,div[id$=overflowTopWhite]::after{content:\"\";display:block;position:absolute;left:0;width:100%;height:40%}div.overflow-top--blue::after,div.overflow-top--gray::after,div.overflow-top--mid-blue::after,div.overflow-top--white::after,div[id$=overflowTopBlue]::after,div[id$=overflowTopGray]::after,div[id$=overflowTopWhite]::after{top:0}div.overflow-bottom--blue::after,div.overflow-bottom--gray::after,div.overflow-bottom--mid-blue::after,div.overflow-bottom--white::after,div[id$=overflowBottomGray]::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowBottomWhite]::after{bottom:0}div.overflow-bottom--white::after,div.overflow-top--white::after,div[id$=overflowBottomWhite]::after,div[id$=overflowTopWhite]::after{background:#fff!important}div.overflow-bottom--gray::after,div.overflow-top--gray::after,div[id$=overflowBottomGray]::after,div[id$=overflowTopGray]::after{background:#f6f9fa!important}div.overflow-bottom--mid-blue::after,div.overflow-top--mid-blue::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowTopMidBlue]::after{background:#11567f!important}div.overflow-bottom--blue::after,div.overflow-top--blue::after,div[id$=overflowBottomBlue]::after,div[id$=overflowTopBlue]::after{background:#259edc!important}.snowflake-premium-content-banner.promo-banner--no-shadow{box-shadow:none!important}#industryPartnerSlider .cmp-image__image,#industryPartnerSlider .section--partner-tabs .snowflake-image-container .cmp-image__image,#partnerSidebar,.has-shadow .cmp-image__image{box-shadow:0 10px 20px 0 rgb(152 162 179 / .1),0 2px 6px 0 rgb(152 162 179 / .25)}.content-chip--has-desc{align-items:flex-start;padding:20px!important}.content-chip--has-desc .snowflake-content-chip-image{max-width:100px}.content-chip--has-desc .snowflake-content-chip-image__image{aspect-ratio:1}.content-chip--has-desc .snowflake-title-v2-line:first-child{font-size:18px!important}.content-chip--has-desc .snowflake-title-v2-line:nth-child(2){color:#000!important;font-weight:500!important;font-size:16px!important;line-height:22px!important;margin-top:2px!important}.content-chip--has-desc .snowflake-content-chip-button{margin-top:6px!important;font-size:18px!important;display:none}.square-image .snowflake-content-chip-image{aspect-ratio:1;max-width:120px}.section--logo-bar.smaller-logos .snowflake-image-container .cmp-image__image{max-width:200px;margin:0 auto}.snowflake-card-v2-advanced-tag,.snowflake-content-chip-tag{padding:3px 6px!important}.sc-overview__webinar-promo-banner .snowflake-content-chip-button,.snowflake-card-v2-advanced-title:first-child,.summit-pricing-block__aside ul{margin-top:0}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{width:40px;height:40px;display:flex;justify-content:center;align-items:center;margin:0!important}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{width:12px;height:12px;background:var(--ui-12);border-radius:100%}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p,.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{font-size:0!important}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active p{background:var(--ui-01)}.button-tabs .snowflake-navigation-container .swiper-wrapper{padding:8px 0}.button-tabs .snowflake-navigation-container .swiper-slide{margin:0 6px}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{padding:8px 24px;background-color:#f6f9fa;border-radius:48px;margin:0}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{text-transform:uppercase;font-family:Texta,sans-serif;font-weight:700}.button-tabs .border-top{border-top:1px solid #ccc}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active{background-color:var(--ui-01);box-shadow:0 2px 6px 0 rgb(152 162 179 / .25),0 10px 20px 0 rgb(152 162 179 / .1)}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active p{color:#fff}.button-tabs.has-icons .snowflake-navigation-container .snowflake-tabs-navigation-item p::before{content:\"\";display:inline-block;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-position:center center;margin-right:12px;vertical-align:middle;margin-top:-3px}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{width:220px;padding-bottom:50%;height:0;margin:0 8px!important;background-size:cover;background-repeat:no-repeat;opacity:.5;transition:opacity .3s}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item:hover{opacity:.75;transition:opacity .3s}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active{opacity:1;transition:opacity .3s}.dot-tabs .aem-container.cmp-tabs,.logo-tabs .aem-container.cmp-tabs{display:flex;flex-direction:column-reverse}.snowflake-icon.is-center{margin:0 auto;display:block}#industryPartnerSlider .snowflake-flexible-column-container-items,#partnerLogoSquare .snowflake-flexible-column-container-items{gap:24px}#techResourceOuter::after{content:\"\";display:block;position:absolute;top:0;left:0;width:100%;height:40%;background:#f6f9fa}#techResourceInner{z-index:1}.partner-tier-tag h6{display:inline-block!important;padding:2px 6px;border-radius:2px;color:#666}.partner-tier-tag.registered h6{background-color:#f6f9fa}.partner-tier-tag.elite h6{background-color:#11567f;color:#fff}.partner-tier-tag.premier h6{background-color:#b14c77;color:#fff}.partner-tier-tag.select h6{background-color:#5094a0;color:#fff}.partner-details\u003Espan{display:flex;gap:24px}.partner-details a{color:inherit!important;font-weight:400!important}.partner-details p::before{content:\"\";display:inline-block;vertical-align:middle;width:16px;height:16px;background-repeat:no-repeat;background-position:center;transform:translateY(-1px);background-size:auto 90%;margin-right:6px}.partner-details__location::before{background-image:url(\"data:image/svg+xml,%3Csvg width='13' height='18' viewBox='0 0 13 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M6.25 17.7531C6.4375 17.7531 6.6 17.6844 6.7375 17.5531C6.875 17.4219 6.95 17.2531 6.95 17.0531C6.95 16.8531 7.075 16.4281 7.3 15.7969C7.5875 15.0281 7.925 14.3156 8.30625 13.6406C8.8 12.7781 9.3125 12.1031 9.85 11.6094C10.75 10.7969 11.4125 9.96563 11.85 9.12188C12.2875 8.27813 12.5063 7.40313 12.5063 6.49063C12.5063 5.36563 12.2187 4.31563 11.6437 3.33438C11.0937 2.40313 10.3438 1.65938 9.4 1.10938C8.43125 .534376 7.375 .246876 6.24375 .246876C5.1125 .246876 4.06875 .534376 3.0875 1.10938C2.15625 1.65938 1.4125 2.40313 .862498 3.33438C.287498 4.31563 0 5.36563 0 6.49063C0 7.47188 .262499 8.42813 .787499 9.35938C1.14375 10.0031 1.65625 10.6656 2.3125 11.3344C2.75625 11.8031 3.24375 12.4781 3.78125 13.3656C4.225 14.0969 4.63125 14.8594 5 15.6656C5.35 16.3844 5.53125 16.8531 5.55625 17.0656C5.55625 17.2594 5.625 17.4156 5.7625 17.5531C5.9 17.6844 6.0625 17.7531 6.25 17.7531ZM6.16875 14.9156C5.775 14.0656 5.325 13.2469 4.825 12.4594C4.275 11.5594 3.7625 10.8719 3.28125 10.3969C2.625 9.71563 2.1375 9.05938 1.825 8.43438C1.5125 7.80313 1.35625 7.16563 1.35625 6.50313C1.35625 5.61563 1.575 4.80313 2.0125 4.05313C2.45 3.30313 3.04375 2.71563 3.7875 2.27813C4.5375 1.84063 5.35 1.62188 6.2375 1.62188C7.125 1.62188 7.9375 1.84063 8.6875 2.27813C9.4375 2.71563 10.0312 3.30313 10.475 4.04688C10.9187 4.80313 11.1375 5.62188 11.1375 6.50313C11.1375 7.90313 10.3937 9.26563 8.9125 10.5969C8.35 11.1094 7.8125 11.7906 7.3 12.6406C6.88125 13.3344 6.50625 14.0969 6.16875 14.9219V14.9156ZM6.26875 8.36563C6.65625 8.36563 7.01875 8.26563 7.35625 8.07188C7.69375 7.87813 7.95625 7.60938 8.14375 7.28438C8.3375 6.95313 8.43125 6.59063 8.43125 6.19688C8.43125 5.80313 8.33125 5.43438 8.1375 5.10313C7.9375 4.76563 7.675 4.50313 7.3375 4.31563C7 4.12813 6.6375 4.02813 6.24375 4.02813C5.85 4.02813 5.4875 4.12813 5.15625 4.32188C4.825 4.52188 4.56875 4.78438 4.375 5.12188C4.18125 5.45938 4.0875 5.82188 4.0875 6.20938C4.0875 6.59688 4.1875 6.95938 4.38125 7.29688C4.58125 7.63438 4.84375 7.89688 5.18125 8.08438C5.51875 8.27813 5.88125 8.37188 6.26875 8.37188V8.36563ZM6.24375 7.50313C5.8875 7.50313 5.575 7.37188 5.31875 7.11563C5.0625 6.85938 4.93125 6.55313 4.93125 6.19063C4.93125 5.82813 5.0625 5.52188 5.31875 5.26563C5.575 5.00938 5.88125 4.87813 6.24375 4.87813C6.60625 4.87813 6.9125 5.00938 7.16875 5.26563C7.425 5.52188 7.55625 5.82813 7.55625 6.19063C7.55625 6.55313 7.425 6.85938 7.16875 7.11563C6.9125 7.37188 6.60625 7.50313 6.24375 7.50313Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\")}.partner-details__website::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='16' viewBox='0 0 18 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.61587 2.96889C2.61587 2.75109 2.79633 2.57062 3.01413 2.57062C3.23192 2.57062 3.41238 2.75109 3.41238 2.96889C3.41238 3.18669 3.23192 3.36716 3.01413 3.36716C2.79633 3.36716 2.61587 3.18669 2.61587 2.96889ZM4.21512 2.96889C4.21512 2.75109 4.39558 2.57062 4.61338 2.57062C4.83117 2.57062 5.01163 2.75109 5.01163 2.96889C5.01163 3.18669 4.83117 3.36716 4.61338 3.36716C4.39558 3.36716 4.21512 3.18669 4.21512 2.96889ZM5.81438 2.96889C5.81438 2.75109 5.99484 2.57062 6.21264 2.57062C6.43043 2.57062 6.61089 2.75109 6.61089 2.96889C6.61089 3.18669 6.43043 3.36716 6.21264 3.36716C5.99484 3.36716 5.81438 3.18669 5.81438 2.96889ZM17.2518 .697559H1.19085C.811258 .697559 .506348 1.0025 .506348 1.38209V14.6179C.506348 14.9975 .811258 15.3024 1.19085 15.3024H17.2518C17.6314 15.3024 17.9363 14.9975 17.9363 14.6179V1.38209C17.9363 1.0025 17.6314 .697559 17.2518 .697559ZM16.5673 2.06035V3.90853H1.86914V2.06035H16.5673ZM1.86914 13.9334V4.78593H16.5673V13.9334H1.86914Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\")}#partnerSidebar{border-radius:4px;background-color:#fff;padding:24px 24px 32px;border-bottom:6px solid #29b5e8}#partnerSidebar h5,.newsletter-disclaimer p{font-size:14px!important}#partnerSidebar ul{margin-top:0;list-style-type:none;padding:0;display:flex;flex-wrap:wrap;gap:8px}#partnerSidebar li{border:1px solid;border-radius:2px;padding:0 4px!important;font-size:11px!important;letter-spacing:.25px;text-transform:uppercase}div.snowflake-partner-hero-card{width:100%;margin:0}.partner-details__logo{max-width:380px;margin:0 auto}@media screen and (max-width:767px){.left-alignment .hp-hero__subheadline{margin-left:auto;margin-right:auto}.left-alignment .hp-hero__headline .snowflake-title-v2-line,.left-alignment .hp-hero__subheadline .snowflake-title-v2-line{text-align:center}.hero--home__inner .snowflake-flexible-column-container-items-top-padding-large{padding-top:var(--spacing-02)}.section--logo-bar\u003E.snowflake-flexible-column-container-items{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:center;gap:8px}.section--logo-bar\u003E.snowflake-flexible-column-container-items\u003Ediv{width:calc(33.33% - 8px)}.partner-sidebar__mobile-expand{display:inline-block;color:#249edc;border-color:#249edc!important}#partnerSidebar li:nth-child(n+6),.summit-nav__links .snowflake-button-tertiary{display:none}.sc-body__sidebar{background-color:#f6f9fa;padding:24px}.sc-body__content{padding:0 24px 24px}.summit-speaker-card .snowflake-card-v2-advanced-content{padding:24px}}#partnerResources h6,.snowflake-tabs-navigation-item p.body-1{font-size:16px!important}#partnerResources .section--resource-hub{padding:0 16px}#partnerResources .section--resource-hub a,.bwalignl{text-align:left}@media screen and (max-width:1023px){.hero--workload .snowflake-hero-system-media-container{width:100%}}.section--timely-content .snowflake-content-chip,.snowflake-mega-nav-dropdown-footer-wrapper{align-items:center}.section--timely-content .snowflake-content-chip-image{max-width:94px}.section--timely-content .snowflake-content-chip-image__inner{line-height:0}.section--timely-content .snowflake-content-chip-image__image{aspect-ratio:1;height:auto}.section--workload-overview .workload-overview__headline{max-width:280px;margin:0 auto}#industryPartnerSlider .swiper-slide{margin-top:0!important;padding:0 12px}#industryPartnerSlider .snowflake-tabs-navigation-item{margin-left:0!important;margin-right:0!important}#industryPartnerSlider .snowflake-premium-content-banner-background-grad-white .snowflake-premium-content-banner{box-shadow:none}#industryPartnerSlider .logo-slider__slide .aem-container{display:flex;padding:0 8px!important;flex-wrap:wrap;gap:16px!important;justify-content:center}#industryPartnerSlider .logo-slider__slide .aem-container\u003Ediv{width:48%;max-width:200px}#useCaseTabs{padding-top:24px;padding-bottom:24px;padding-right:24px}#useCaseTabs .tab-content.is-active{display:block}#useCaseTabs .vert-tab{border-bottom:1px solid #a0bbcc;padding-bottom:16px}#useCaseTabs .vert-tab p{display:inline-block}#useCaseTabs .vert-tab p:hover{cursor:pointer}#useCaseTabs .vert-tab p,#useCaseTabs .vert-tab.is-active p.not-active{color:#249edc}#useCaseTabs .vert-tab p.is-active,#useCaseTabs .vert-tab.is-active p{color:#000}#industryPlatformSection{background-image:url(/adobe/dynamicmedia/deliver/dm-aid--db074ad5-7122-4c51-87a3-76c3aa466182/double-arrow-bg%403x.png);background-repeat:no-repeat}.snowflake-text p.featured-quote__source{font-weight:900!important;text-transform:uppercase;font-size:16px!important;margin-top:2rem!important}.snowflake-text p.featured-quote__title{margin-top:0!important;font-size:16px!important}.snowflake-case-study-card-logo img{width:auto!important;height:100px!important;transform:translateX(-15%)}.snowflake-quote-item-quote-text{font-weight:600!important}#customerStoryStatsInner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row}#customerStoryStat1,#customerStoryStat2{max-width:240px}#storyHighlights{border-radius:4px;padding:1rem}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line,.summit-pricing-block__tile .black-blue-text-color .snowflake-title-v2-line{color:#000!important}.snowflake-youtube-embedded-wrapper{border-radius:var(--small-border-radius)}#arcticNavItem::before,#offset::before,#open-source::before{color:var(--text-05);font-family:Texta,sans-serif!important}#offset,.sc-architecture-caption{margin-top:16px}.hero--press .snowflake-title-v2-line{text-transform:none!important}@media screen and (min-width:768px){.subpage-timely-content__inner\u003E.snowflake-flexible-column-container-items{box-shadow:0 10px 20px 0 rgb(152 162 179 / .1),0 2px 6px 0 rgb(152 162 179 / .25);padding:var(--spacing-04);border-radius:4px;overflow:hidden}#partnerLogoSquare{padding:0 0 0 48px}.hero--workload .snowflake-container{max-width:1440px;margin:0 auto!important;align-items:center}#industryPartnerSlider.snowflake-flexible-column-container-2-column-40-60\u003E.snowflake-flexible-column-container-items{grid-template-columns:minmax(40%,4fr) minmax(0,6fr)}#industryPartnerSlider .swiper-slide{padding:0 24px}.sc-body{padding:48px}.sc-body\u003E.snowflake-flexible-column-container-items{grid-template-columns:7fr 3fr;gap:124px}}.snowflake-button-container.has-icon{display:inline-flex;justify-content:center;align-items:center;text-align:left}.snowflake-button-container.has-icon::before{content:\"\";display:inline-block;width:20px;height:20px;margin-right:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.snowflake-button-container.is-video::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 1.28663C13.2523 1.28663 16.7134 4.74768 16.7134 9C16.7134 13.2523 13.2523 16.7134 9 16.7134C4.74768 16.7198 1.28663 13.2588 1.28663 9C1.28663 4.74124 4.74768 1.28663 9 1.28663ZM9 0C4.0336 0 0 4.0336 0 9C0 13.9664 4.0336 18 9 18C13.9728 18 18 13.9664 18 9C18 4.0336 13.9728 0 9 0Z' fill='white'/%3E%3Cpath d='M7.75106 6.18211C7.42941 6.16925 7.16565 6.42658 7.16565 6.74823V11.2772C7.16565 11.7082 7.65457 11.9848 8.02126 11.7597L11.7975 9.4952C12.1578 9.27647 12.1578 8.74252 11.7975 8.52379L8.02126 6.25931C7.93763 6.21428 7.84756 6.18211 7.75106 6.18211Z' fill='white'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-github::before{background-image:url(\"data:image/svg+xml,%3Csvg width='20' height='21' viewBox='0 0 20 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 .651794C4.475 .651794 0 5.12679 0 10.6518C0 15.0768 2.8625 18.8143 6.8375 20.1393C7.3375 20.2268 7.525 19.9268 7.525 19.6643C7.525 19.4268 7.5125 18.6393 7.5125 17.8018C5 18.2643 4.35 17.1893 4.15 16.6268C4.0375 16.3393 3.55 15.4518 3.125 15.2143C2.775 15.0268 2.275 14.5643 3.1125 14.5518C3.9 14.5393 4.4625 15.2768 4.65 15.5768C5.55 17.0893 6.9875 16.6643 7.5625 16.4018C7.65 15.7518 7.9125 15.3143 8.2 15.0643C5.975 14.8143 3.65 13.9518 3.65 10.1268C3.65 9.03929 4.0375 8.13929 4.675 7.43929C4.575 7.18929 4.225 6.16429 4.775 4.78929C4.775 4.78929 5.6125 4.52679 7.525 5.81429C8.325 5.58929 9.175 5.47679 10.025 5.47679C10.875 5.47679 11.725 5.58929 12.525 5.81429C14.4375 4.51429 15.275 4.78929 15.275 4.78929C15.825 6.16429 15.475 7.18929 15.375 7.43929C16.0125 8.13929 16.4 9.02679 16.4 10.1268C16.4 13.9643 14.0625 14.8143 11.8375 15.0643C12.2 15.3768 12.5125 15.9768 12.5125 16.9143C12.5125 18.2518 12.5 19.3268 12.5 19.6643C12.5 19.9268 12.6875 20.2393 13.1875 20.1393C17.1375 18.8143 20 15.0643 20 10.6518C20 5.12679 15.525 .651794 10 .651794Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-quickstart::before{background-image:url(\"data:image/svg+xml,%3Csvg width='15' height='21' viewBox='0 0 15 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8489 2.79368H11.6439V2.38493C11.6439 1.71368 11.1451 .967427 10.4251 .967427H8.94762C8.80887 .359927 8.37387 .299927 7.89762 .299927H7.23012C6.85512 .299927 6.26637 .299927 6.08637 .967427H4.68387C3.94887 .967427 3.35637 1.74368 3.35637 2.38493V2.79368H1.15137C.738867 2.79368 .401367 3.13118 .401367 3.54368V20.2537C.401367 20.6662 .738867 21.0037 1.15137 21.0037H13.8489C14.2614 21.0037 14.5989 20.6662 14.5989 20.2537V3.54368C14.5989 3.13118 14.2614 2.79368 13.8489 2.79368ZM4.29387 2.38493C4.29387 2.18243 4.54137 1.90493 4.68387 1.90493H6.50262C6.76137 1.90493 6.97137 1.69493 6.97137 1.43618C6.97137 1.33868 6.97887 1.27868 6.98637 1.24118C7.05012 1.23368 7.15512 1.23368 7.23387 1.23368H7.90137C7.95012 1.23368 8.00637 1.23368 8.05137 1.23368C8.05512 1.27868 8.05887 1.34243 8.05887 1.43243C8.05887 1.69118 8.26887 1.90118 8.52762 1.90118H10.4289C10.5301 1.90118 10.7101 2.14493 10.7101 2.38118V2.78993H4.29762V2.38118L4.29387 2.38493ZM13.0989 19.4999H1.90137V4.29368H13.0989V19.5037V19.4999Z' fill='%23249EDC'/%3E%3Cpath d='M3.82512 16.0424H11.1751C11.4339 16.0424 11.6439 15.8324 11.6439 15.5736V6.88486C11.6439 6.62611 11.4339 6.41611 11.1751 6.41611H3.82512C3.56637 6.41611 3.35637 6.62611 3.35637 6.88486V15.5736C3.35637 15.8324 3.56637 16.0424 3.82512 16.0424ZM4.29387 15.1049V13.3686H10.7064V15.1049H4.29387ZM10.7101 7.35361V12.4311H4.29762V7.35361H10.7101Z' fill='%23249EDC'/%3E%3Cpath d='M6.16512 9.35989H8.83887C9.09762 9.35989 9.30762 9.14989 9.30762 8.89114C9.30762 8.63239 9.09762 8.42239 8.83887 8.42239H6.16512C5.90637 8.42239 5.69637 8.63239 5.69637 8.89114C5.69637 9.14989 5.90637 9.35989 6.16512 9.35989Z' fill='%23249EDC'/%3E%3Cpath d='M6.16512 11.3624H8.83887C9.09762 11.3624 9.30762 11.1524 9.30762 10.8937C9.30762 10.6349 9.09762 10.4249 8.83887 10.4249H6.16512C5.90637 10.4249 5.69637 10.6349 5.69637 10.8937C5.69637 11.1524 5.90637 11.3624 6.16512 11.3624Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-download::before{background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='18' viewBox='0 0 16 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.2017 17.1637H.798265C.364425 17.1637 0 16.7993 0 16.3655V12.3568C0 11.923 .364425 11.5585 .798265 11.5585C1.2321 11.5585 1.59653 11.923 1.59653 12.3568V15.5498H14.4035V12.3568C14.4035 11.923 14.7679 11.5585 15.2017 11.5585C15.6356 11.5585 16 11.923 16 12.3568V16.3655C16 16.7993 15.6529 17.1637 15.2017 17.1637Z' fill='%23249EDC'/%3E%3Cpath d='M7.94793 12.9642C7.84381 12.9642 7.73969 12.9468 7.63557 12.8947C7.34056 12.7733 7.14967 12.4783 7.14967 12.1485L7.18437 .938127C7.18437 .504287 7.5488 .139862 7.98264 .139862C8.41648 .139862 8.7809 .504287 8.7809 .938127L8.7462 10.257L12.8416 6.33509C13.154 6.02273 13.6746 6.04008 13.9696 6.35244C14.282 6.66481 14.2646 7.18542 13.9523 7.48043L8.50325 12.7386C8.36442 12.8774 8.15617 12.9642 7.94793 12.9642Z' fill='%23249EDC'/%3E%3Cpath d='M7.94793 12.9642C7.73969 12.9642 7.54881 12.8947 7.39262 12.7386L2.03037 7.53249C1.718 7.22012 1.70065 6.71687 2.01301 6.40451C2.32538 6.09214 2.82863 6.07479 3.141 6.38715L8.50325 11.5932C8.81562 11.9056 8.83297 12.4088 8.52061 12.7212C8.36442 12.8774 8.15617 12.9642 7.94793 12.9642Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-expand::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64375 10.9125C6.9375 11.2062 6.93125 11.6812 6.64375 11.9687L2.57502 16H3.79375C4.20625 16 4.54376 16.3375 4.54376 16.75C4.54376 17.1625 4.20625 17.5 3.79375 17.5H.756264C.556264 17.5 .36876 17.4187 .22501 17.2812C.22501 17.2812 .206248 17.25 .193748 17.2375C.143748 17.1812 .100004 17.1125 .0625038 17.0437C.0375038 16.9687 .0187492 16.8937 .0187492 16.8187C.0187492 16.8 .0062561 16.7813 .0062561 16.7625V13.725C.0187561 13.3125 .356257 12.9875 .768757 12.9937C1.16876 13 1.48752 13.325 1.50002 13.725V14.9688L5.5875 10.9187C5.88125 10.6312 6.35 10.6312 6.64375 10.9187V10.9125ZM17.5063 .743732C17.5063 .543732 17.425 .356235 17.2875 .218735C17.2875 .218735 17.2562 .199998 17.2437 .193748C17.1875 .137498 17.1188 .0937347 17.0438 .0624847C16.9688 .0374847 16.8938 .0187492 16.8188 .0187492C16.8 .0187492 16.7813 .00623703 16.7625 .00623703H13.725C13.3125 .00623703 12.975 .343745 12.975 .756245C12.975 1.16874 13.3125 1.50623 13.725 1.50623H14.9688L11.1312 5.37498C10.8437 5.67498 10.8563 6.14999 11.1563 6.43124C11.45 6.71249 11.9063 6.70624 12.1938 6.43124L16.0125 2.575V3.79375C16.0125 4.20625 16.35 4.54372 16.7625 4.54372C17.175 4.54372 17.5125 4.20625 17.5125 3.79375V.756245L17.5063 .743732ZM16.7562 12.9688C16.3437 12.9688 16.0063 13.3063 16.0063 13.7188V14.8937L12.1938 10.925C11.9063 10.625 11.4375 10.6188 11.1375 10.9063C10.8375 11.1938 10.8313 11.6625 11.1188 11.9625L15 16.0062H13.7188C13.3063 16.0062 12.9688 16.3437 12.9688 16.7562C12.9688 17.1687 13.3063 17.5063 13.7188 17.5063H16.7562C16.85 17.5063 16.95 17.4875 17.0375 17.45C17.0875 17.425 17.1313 17.3937 17.175 17.3625C17.2063 17.3437 17.2438 17.325 17.275 17.3C17.3313 17.2375 17.375 17.1687 17.4125 17.1C17.4188 17.0875 17.4375 17.075 17.4438 17.0562C17.45 17.025 17.4563 16.9938 17.4625 16.9625C17.4813 16.9 17.5 16.8375 17.5 16.7687V13.725C17.5 13.3125 17.1687 12.975 16.7562 12.975V12.9688ZM.750008 4.53125C1.16251 4.53125 1.50002 4.19374 1.50002 3.78124V2.5L5.59376 6.43124C5.89376 6.71874 6.36251 6.70626 6.65001 6.41251C6.93751 6.11876 6.92501 5.64375 6.63126 5.35625L2.61251 1.49998H3.7875C4.2 1.49998 4.53751 1.16249 4.53751 .749989C4.53751 .337489 4.2 0 3.7875 0H.743752C.668752 0 .600004 .0187355 .531254 .0437355C.506254 .0499855 .481263 .0437477 .462513 .0562477C.443763 .0687477 .425015 .0812462 .406265 .0937462C.337515 .124996 .275004 .168741 .218754 .224991H.212498C.212498 .224991 .175 .28125 .15625 .3125C.11875 .3625 .0812477 .4125 .0562477 .46875C.0374977 .525 .0249992 .587499 .0187492 .643749C.0124992 .674999 0 .712482 0 .743732V3.78124C0 4.19374 .337508 4.53125 .750008 4.53125Z' fill='white'/%3E%3C/svg%3E%0A\")}@keyframes slow-scroll{100%{transform:translateY(-50%)}}.sc-hero{overflow:hidden;background-color:#212d35;background-repeat:repeat-y;background-image:url(\"data:image/svg+xml,%3Csvg width='389' height='17' viewBox='0 0 389 17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M.638672 7.80824L.638672 9.2566C.638672 9.52364 .85538 9.74024 1.12262 9.74024H2.57204C2.83928 9.74024 3.05598 9.52364 3.05598 9.2566V7.80824C3.05598 7.54119 2.83928 7.32472 2.57204 7.32472L1.12262 7.32472C.85538 7.32472 .638672 7.54119 .638672 7.80824Z' fill='url(%23paint0_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.9639 7.80824V9.2566C10.9639 9.52364 11.1806 9.74024 11.4478 9.74024L12.8972 9.74024C13.1645 9.74024 13.3812 9.52364 13.3812 9.2566V7.80824C13.3812 7.54119 13.1645 7.32471 12.8972 7.32471L11.4478 7.32471C11.1806 7.32471 10.9639 7.54119 10.9639 7.80824Z' fill='url(%23paint1_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M21.2891 7.80823V9.2566C21.2891 9.52364 21.5058 9.74024 21.773 9.74024L23.2224 9.74024C23.4897 9.74024 23.7064 9.52364 23.7064 9.2566V7.80823C23.7064 7.54119 23.4897 7.32471 23.2224 7.32471L21.773 7.32471C21.5058 7.32471 21.2891 7.54119 21.2891 7.80823Z' fill='url(%23paint2_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M31.6143 7.80823V9.2566C31.6143 9.52364 31.831 9.74024 32.0982 9.74024H33.5476C33.8149 9.74024 34.0316 9.52364 34.0316 9.2566V7.80823C34.0316 7.54119 33.8149 7.32471 33.5476 7.32471L32.0982 7.32471C31.831 7.32471 31.6143 7.54119 31.6143 7.80823Z' fill='url(%23paint3_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M41.9395 7.80823V9.2566C41.9395 9.52364 42.1562 9.74024 42.4234 9.74024H43.8728C44.1401 9.74024 44.3568 9.52364 44.3568 9.2566V7.80823C44.3568 7.54119 44.1401 7.32471 43.8728 7.32471L42.4234 7.32471C42.1562 7.32471 41.9395 7.54119 41.9395 7.80823Z' fill='url(%23paint4_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M52.5076 7.80823V9.2566C52.5076 9.52364 52.7243 9.74024 52.9916 9.74024H54.441C54.7082 9.74024 54.9249 9.52364 54.9249 9.2566V7.80823C54.9249 7.54119 54.7082 7.32471 54.441 7.32471L52.9916 7.32471C52.7243 7.32471 52.5076 7.54119 52.5076 7.80823Z' fill='url(%23paint5_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M62.8331 7.80823V9.2566C62.8331 9.52364 63.0493 9.74024 63.3165 9.74024H64.7664C65.0332 9.74024 65.2504 9.52364 65.2504 9.2566V7.80823C65.2504 7.54119 65.0332 7.32471 64.7664 7.32471L63.3165 7.32471C63.0493 7.32471 62.8331 7.54119 62.8331 7.80823Z' fill='url(%23paint6_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M73.1583 7.80823V9.2566C73.1583 9.52364 73.3745 9.74024 73.6417 9.74024H75.0916C75.3584 9.74024 75.5756 9.52364 75.5756 9.2566V7.80823C75.5756 7.54119 75.3584 7.32471 75.0916 7.32471L73.6417 7.32471C73.3745 7.32471 73.1583 7.54119 73.1583 7.80823Z' fill='url(%23paint7_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M83.4835 7.80823V9.2566C83.4835 9.52364 83.6997 9.74024 83.9669 9.74024H85.4168C85.6836 9.74024 85.9008 9.52364 85.9008 9.2566V7.80823C85.9008 7.54119 85.6836 7.32471 85.4168 7.32471L83.9669 7.32471C83.6997 7.32471 83.4835 7.54119 83.4835 7.80823Z' fill='url(%23paint8_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M93.8087 7.80823V9.2566C93.8087 9.52364 94.0249 9.74024 94.2921 9.74024H95.742C96.0088 9.74024 96.226 9.52364 96.226 9.2566V7.80823C96.226 7.54119 96.0088 7.32471 95.742 7.32471L94.2921 7.32471C94.0249 7.32471 93.8087 7.54119 93.8087 7.80823Z' fill='url(%23paint9_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M104.134 7.80823V9.2566C104.134 9.52364 104.35 9.74024 104.617 9.74024H106.067C106.334 9.74024 106.551 9.52364 106.551 9.2566V7.80823C106.551 7.54119 106.334 7.32471 106.067 7.32471L104.617 7.32471C104.35 7.32471 104.134 7.54119 104.134 7.80823Z' fill='url(%23paint10_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M114.702 7.80823V9.2566C114.702 9.52364 114.918 9.74024 115.185 9.74024L116.635 9.74024C116.902 9.74024 117.119 9.52364 117.119 9.25659V7.80823C117.119 7.54119 116.902 7.32471 116.635 7.32471L115.185 7.32471C114.918 7.32471 114.702 7.54119 114.702 7.80823Z' fill='url(%23paint11_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M125.027 7.80823V9.25659C125.027 9.52364 125.243 9.74024 125.511 9.74024L126.961 9.74024C127.227 9.74024 127.445 9.52364 127.445 9.25659V7.80823C127.445 7.54119 127.227 7.32471 126.961 7.32471L125.511 7.32471C125.243 7.32471 125.027 7.54119 125.027 7.80823Z' fill='url(%23paint12_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M135.352 7.80823V9.25659C135.352 9.52364 135.569 9.74024 135.836 9.74024H137.286C137.553 9.74024 137.77 9.52364 137.77 9.25659V7.80823C137.77 7.54119 137.553 7.32471 137.286 7.32471L135.836 7.32471C135.569 7.32471 135.352 7.54119 135.352 7.80823Z' fill='url(%23paint13_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M145.678 7.80823V9.25659C145.678 9.52364 145.894 9.74024 146.161 9.74024H147.611C147.878 9.74024 148.095 9.52364 148.095 9.25659V7.80823C148.095 7.54119 147.878 7.32471 147.611 7.32471L146.161 7.32471C145.894 7.32471 145.678 7.54119 145.678 7.80823Z' fill='url(%23paint14_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M156.003 7.80823V9.25659C156.003 9.52364 156.219 9.74024 156.486 9.74024H157.936C158.203 9.74024 158.42 9.52364 158.42 9.25659V7.80823C158.42 7.54119 158.203 7.32471 157.936 7.32471L156.486 7.32471C156.219 7.32471 156.003 7.54119 156.003 7.80823Z' fill='url(%23paint15_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M166.328 7.80823V9.25659C166.328 9.52363 166.544 9.74024 166.811 9.74024H168.261C168.528 9.74024 168.745 9.52363 168.745 9.25659V7.80823C168.745 7.54119 168.528 7.32471 168.261 7.32471L166.811 7.32471C166.544 7.32471 166.328 7.54119 166.328 7.80823Z' fill='url(%23paint16_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M176.896 7.80823V9.25659C176.896 9.52363 177.112 9.74023 177.38 9.74023H178.83C179.096 9.74023 179.313 9.52363 179.313 9.25659V7.80823C179.313 7.54119 179.096 7.32471 178.83 7.32471L177.38 7.32471C177.112 7.32471 176.896 7.54119 176.896 7.80823Z' fill='url(%23paint17_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M187.221 7.80823V9.25659C187.221 9.52363 187.438 9.74023 187.705 9.74023H189.155C189.421 9.74023 189.639 9.52363 189.639 9.25659V7.80823C189.639 7.54119 189.421 7.32471 189.155 7.32471L187.705 7.32471C187.438 7.32471 187.221 7.54119 187.221 7.80823Z' fill='url(%23paint18_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M199.639 7.80824V9.2566C199.639 9.52364 199.855 9.74024 200.123 9.74024H201.572C201.839 9.74024 202.056 9.52364 202.056 9.2566V7.80824C202.056 7.54119 201.839 7.32472 201.572 7.32472L200.123 7.32472C199.855 7.32472 199.639 7.54119 199.639 7.80824Z' fill='url(%23paint19_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M209.964 7.80824V9.2566C209.964 9.52364 210.181 9.74024 210.448 9.74024L211.897 9.74024C212.164 9.74024 212.381 9.52364 212.381 9.2566V7.80824C212.381 7.54119 212.164 7.32471 211.897 7.32471L210.448 7.32471C210.181 7.32471 209.964 7.54119 209.964 7.80824Z' fill='url(%23paint20_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M220.289 7.80823V9.2566C220.289 9.52364 220.506 9.74024 220.773 9.74024L222.222 9.74024C222.49 9.74024 222.706 9.52364 222.706 9.2566V7.80823C222.706 7.54119 222.49 7.32471 222.222 7.32471L220.773 7.32471C220.506 7.32471 220.289 7.54119 220.289 7.80823Z' fill='url(%23paint21_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M230.614 7.80823V9.2566C230.614 9.52364 230.831 9.74024 231.098 9.74024H232.548C232.815 9.74024 233.032 9.52364 233.032 9.2566V7.80823C233.032 7.54119 232.815 7.32471 232.548 7.32471L231.098 7.32471C230.831 7.32471 230.614 7.54119 230.614 7.80823Z' fill='url(%23paint22_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M240.939 7.80823V9.2566C240.939 9.52364 241.156 9.74024 241.423 9.74024H242.873C243.14 9.74024 243.357 9.52364 243.357 9.2566V7.80823C243.357 7.54119 243.14 7.32471 242.873 7.32471L241.423 7.32471C241.156 7.32471 240.939 7.54119 240.939 7.80823Z' fill='url(%23paint23_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M251.508 7.80823V9.2566C251.508 9.52364 251.724 9.74024 251.992 9.74024H253.441C253.708 9.74024 253.925 9.52364 253.925 9.2566V7.80823C253.925 7.54119 253.708 7.32471 253.441 7.32471L251.992 7.32471C251.724 7.32471 251.508 7.54119 251.508 7.80823Z' fill='url(%23paint24_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M261.833 7.80823V9.2566C261.833 9.52364 262.049 9.74024 262.317 9.74024H263.766C264.033 9.74024 264.25 9.52364 264.25 9.2566V7.80823C264.25 7.54119 264.033 7.32471 263.766 7.32471L262.317 7.32471C262.049 7.32471 261.833 7.54119 261.833 7.80823Z' fill='url(%23paint25_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M272.158 7.80823V9.2566C272.158 9.52364 272.374 9.74024 272.642 9.74024H274.092C274.358 9.74024 274.576 9.52364 274.576 9.2566L274.576 7.80823C274.576 7.54119 274.358 7.32471 274.092 7.32471L272.642 7.32471C272.374 7.32471 272.158 7.54119 272.158 7.80823Z' fill='url(%23paint26_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M282.483 7.80823V9.2566C282.483 9.52364 282.7 9.74024 282.967 9.74024H284.417C284.684 9.74024 284.901 9.52364 284.901 9.2566V7.80823C284.901 7.54119 284.684 7.32471 284.417 7.32471L282.967 7.32471C282.7 7.32471 282.483 7.54119 282.483 7.80823Z' fill='url(%23paint27_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M292.809 7.80823L292.809 9.2566C292.809 9.52364 293.025 9.74024 293.292 9.74024H294.742C295.009 9.74024 295.226 9.52364 295.226 9.2566V7.80823C295.226 7.54119 295.009 7.32471 294.742 7.32471L293.292 7.32471C293.025 7.32471 292.809 7.54119 292.809 7.80823Z' fill='url(%23paint28_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M303.134 7.80823L303.134 9.2566C303.134 9.52364 303.35 9.74024 303.617 9.74024H305.067C305.334 9.74024 305.551 9.52364 305.551 9.2566V7.80823C305.551 7.54119 305.334 7.32471 305.067 7.32471L303.617 7.32471C303.35 7.32471 303.134 7.54119 303.134 7.80823Z' fill='url(%23paint29_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M313.702 7.80823L313.702 9.2566C313.702 9.52364 313.918 9.74024 314.185 9.74024L315.635 9.74024C315.902 9.74024 316.119 9.52364 316.119 9.25659V7.80823C316.119 7.54119 315.902 7.32471 315.635 7.32471L314.185 7.32471C313.918 7.32471 313.702 7.54119 313.702 7.80823Z' fill='url(%23paint30_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M324.027 7.80823V9.25659C324.027 9.52364 324.243 9.74024 324.511 9.74024L325.961 9.74024C326.227 9.74024 326.445 9.52364 326.445 9.25659V7.80823C326.445 7.54119 326.227 7.32471 325.961 7.32471L324.511 7.32471C324.243 7.32471 324.027 7.54119 324.027 7.80823Z' fill='url(%23paint31_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M334.352 7.80823V9.25659C334.352 9.52364 334.569 9.74024 334.836 9.74024H336.286C336.553 9.74024 336.77 9.52364 336.77 9.25659L336.77 7.80823C336.77 7.54119 336.553 7.32471 336.286 7.32471L334.836 7.32471C334.569 7.32471 334.352 7.54119 334.352 7.80823Z' fill='url(%23paint32_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M344.678 7.80823V9.25659C344.678 9.52364 344.894 9.74024 345.161 9.74024H346.611C346.878 9.74024 347.095 9.52364 347.095 9.25659L347.095 7.80823C347.095 7.54119 346.878 7.32471 346.611 7.32471L345.161 7.32471C344.894 7.32471 344.678 7.54119 344.678 7.80823Z' fill='url(%23paint33_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M355.003 7.80823V9.25659C355.003 9.52364 355.219 9.74024 355.486 9.74024H356.936C357.203 9.74024 357.42 9.52364 357.42 9.25659L357.42 7.80823C357.42 7.54119 357.203 7.32471 356.936 7.32471L355.486 7.32471C355.219 7.32471 355.003 7.54119 355.003 7.80823Z' fill='url(%23paint34_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M365.328 7.80823V9.25659C365.328 9.52363 365.544 9.74024 365.811 9.74024H367.261C367.528 9.74024 367.745 9.52363 367.745 9.25659V7.80823C367.745 7.54119 367.528 7.32471 367.261 7.32471L365.811 7.32471C365.544 7.32471 365.328 7.54119 365.328 7.80823Z' fill='url(%23paint35_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M375.896 7.80823V9.25659C375.896 9.52363 376.112 9.74023 376.38 9.74023H377.83C378.096 9.74023 378.313 9.52363 378.313 9.25659V7.80823C378.313 7.54119 378.096 7.32471 377.829 7.32471L376.38 7.32471C376.112 7.32471 375.896 7.54119 375.896 7.80823Z' fill='url(%23paint36_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M386.221 7.80823V9.25659C386.221 9.52363 386.438 9.74023 386.705 9.74023H388.155C388.421 9.74023 388.639 9.52363 388.639 9.25659V7.80823C388.639 7.54119 388.421 7.32471 388.155 7.32471L386.705 7.32471C386.438 7.32471 386.221 7.54119 386.221 7.80823Z' fill='url(%23paint37_linear_8295_70635)'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint1_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint2_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint3_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint4_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint5_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint6_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint7_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint8_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint9_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint10_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint11_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint12_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint13_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint14_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint15_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint16_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint17_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint18_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint19_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint20_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint21_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint22_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint23_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint24_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint25_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint26_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint27_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint28_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint29_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint30_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint31_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint32_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint33_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint34_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint35_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint36_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint37_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E%0A\")}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:first-child{position:relative;z-index:3}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:absolute;height:100%;width:100%;top:0;left:-24px}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child::before{content:\"\";display:block;z-index:1;position:absolute;top:-64px;left:0;width:150%;height:calc(100% + 160px);background-color:rgb(32 44 53 / .9)}.sc-body__content .heading-3-v2,.sc-hero__headline .heading-1-v2{text-transform:none}.sc-body__content span.snowflake-image-caption{display:block!important;font-style:italic}.sc-body__content .snowflake-text p+ul{margin-top:24px!important;padding-left:16px!important}.white-blue-text-color .snowflake-title-v2.solution-center-hero__certification .snowflake-typographyv2\u003Espan.snowflake-title-v2-line{color:#e9eaeb!important;font-size:16px}.white-blue-text-color .snowflake-title-v2.solution-center-hero__certification.is-large .snowflake-typographyv2\u003Espan.snowflake-title-v2-line{color:#fff!important;font-size:18px}.solution-center-hero__certification\u003E.snowflake-title-v2-line\u003Espan:first-child{display:flex;justify-content:flex-start;align-items:center;gap:8px}.solution-center-hero__certification\u003E.snowflake-title-v2-line\u003Espan:first-child::before{content:\"\";display:inline-block;width:16px;height:16px;background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 0C3.58146 0 0 3.58146 0 8C0 12.4185 3.58146 16 8 16C12.4185 16 16 12.4185 16 8C16 3.58146 12.4185 0 8 0ZM12.7184 5.91984L7.33471 11.3026C7.31293 11.3244 7.31293 11.3454 7.29198 11.3454L7.20653 11.4308C6.94933 11.688 6.54132 11.7525 6.21962 11.6235C6.11238 11.5808 6.00514 11.5163 5.9197 11.4308L5.83425 11.3454C5.83425 11.3454 5.83425 11.3236 5.81246 11.3236L3.28149 8.79347C2.93799 8.44997 2.93799 7.87107 3.28149 7.50664L3.36694 7.42119C3.71044 7.07769 4.28934 7.07769 4.65377 7.42119L6.58401 9.35143L11.3877 4.5477C11.7312 4.2042 12.3101 4.2042 12.6746 4.5477L12.76 4.63315C13.0826 4.99758 13.0828 5.55541 12.7184 5.91984Z' fill='%230E8A16'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;background-color:#fff;border-radius:100%}.sc-hero__byline{padding-top:8px}.sc-hero__byline p{color:#e2e2e2;margin-top:0!important}.sc-hero pre[class*=language-]{overflow:visible}.snowflake-code-snippet,.snowflake-code-snippet code,.snowflake-code-snippet pre{font-size:16px}.sc-hero__code-snippet:not(pre)\u003Ecode[class*=language-],.sc-hero__code-snippet pre[class*=language-]{background:0 0}.sc-hero__code-snippet{opacity:.8;background-color:transparent!important;position:absolute;top:0;right:0;width:100%;animation:240s linear 1s forwards slow-scroll}.sc-hero__button-container .snowflake-flexible-column-container-items{padding:0 0 24px;margin-top:-8px;margin-left:24px}.sc-sidebar__partner-logo{width:100%;max-width:140px;margin-top:8px}.sc-sidebar__partner-logo .cmp-image__image{border-radius:0}.sc-tag-cluster.snowflake-text ul{list-style-type:none;padding:0;display:flex;flex-wrap:wrap;gap:8px;margin:0}.sc-tag-cluster.snowflake-text li{color:#373f41;border-radius:4px;display:inline-block;padding:6px;text-transform:uppercase;letter-spacing:1px;font-size:12px!important;line-height:12px!important;margin:0!important;background-color:#f3f3f3}.sc-body .share-icon svg{height:24px;cursor:pointer}.sc-body .share-icon svg:hover path{fill:var(--ui-02)}.sc-overview__webinar-promo-banner{align-items:center;border:1px solid #ccc;padding:var(--spacing-02)}.sc-overview__webinar-promo-banner .snowflake-content-chip-image{max-width:32px;margin-right:var(--spacing-02);line-height:0}.sc-overview__webinar-promo-banner .snowflake-content-chip-image__image,.summit-speaker-card .snowflake-card-v2-advanced-image__image{aspect-ratio:1}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .heading-5-v2{font-size:14px;font-family:Lato,sans-serif}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line:not(:first-child){font-weight:400}.sc-overview__webinar-promo-banner .snowflake-content-chip-button .snowflake-button-container{font-size:14px!important}.diagram-group__button{position:absolute;bottom:24px;right:24px;background-color:#212c35!important}.section--mountains-bottom,.summit-hp-hero{position:relative}.sc-cert-banner{background-color:#212d35;border-radius:8px;padding:24px;overflow:hidden}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;align-items:center}:root{--text-secondary:#706f6f;--summit-bg-ltblue:#eaf8fd;--summit-bg-blue:#249edc;--summit-border:#d2d1d4;--summit-border-radius:8px;--summit-card-padding:32px;--summit-card-padding-sm:28px}.section--mountains-bottom::after,.section--mountains-bottom::before{content:\"\";display:block;position:absolute;bottom:-1px;max-width:400px;background-size:100% auto;height:100%;width:30%;line-height:0;background-repeat:no-repeat}.button-group\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center;align-items:center}.button-group\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;margin:0 8px!important}.button-group .snowflake-button-container{font-family:Texta,sans-serif}.section--summit-bg-ltblue{background-color:var(--summit-bg-ltblue)}.section--summit-bg-blue,.summit-hero-secondary{background-color:var(--summit-bg-blue)}.section--mountains-bottom::before{left:0;background-image:url(\"data:image/svg+xml,%3Csvg width='402' height='309' viewBox='0 0 402 309' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M401.523 308.761H0V0L181.63 182.431L228.479 135.531L401.523 308.761Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-position:bottom left}.section--mountains-bottom::after{right:0;background-image:url(\"data:image/svg+xml,%3Csvg width='402' height='309' viewBox='0 0 402 309' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 308.761H401.523V0L219.893 182.431L173.044 135.531L0 308.761Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-position:bottom right}.summit-hp-hero{overflow:hidden}.summit-hero__bg-video{position:absolute;top:50%;left:50%;width:120%;height:100%;opacity:.3;transform:translate(-50%,-50%)}.summit-hero__bg-svg,.summit-prefooter__bg-image,.summit-secondary-hero__bg-image{position:absolute;bottom:0;left:0;width:100%}.summit-hp-promo-banner__headline .heading-4-v2{font-weight:900}.summit-hero-secondary .hero-lottie__left{position:absolute;bottom:0;left:0;width:30%;line-height:0}.summit-timeline__card::after,.summit-timeline__card::before{bottom:0;left:50%;position:absolute;display:block;background-color:var(--ui-01);content:\"\"}.summit-hero-secondary .snowflake-text p{font-size:24px!important;line-height:32px!important;max-width:720px;margin:0 auto}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:center}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;max-width:25%}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:1px solid #fff}.summit-timeline__card{border:1px solid var(--summit-border);border-radius:var(--summit-border-radius);padding:var(--summit-card-padding);position:relative;background-color:#fff}.summit-timeline__card::before{width:20px;height:20px;border-radius:100%;transform:translate(-50%,50%)}.summit-timeline__card::after{width:3px;height:50px;transform:translate(-50%,100%)}.summit-timeline-card__icon{width:48px;height:48px}.summit-timeline-card__headline .heading-3-v2{font-size:32px}.faq-group{border:1px solid var(--ui-12);border-radius:4px;background-color:#fff}.faq-group__question{padding:24px}.faq-group__question:hover{color:var(--ui-01);cursor:pointer}.faq-group__question .heading-4-v2,.faq-group__question .heading-5-v2{position:relative;padding-right:64px}.faq-group__question .heading-4-v2::after,.faq-group__question .heading-5-v2::after{content:\"\";display:block;width:32px;height:32px;background-image:url(\"data:image/svg+xml,%3Csvg width='29' height='16' viewBox='0 0 29 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M14.16 14.6807C14.2537 14.7957 14.3719 14.8884 14.506 14.952C14.64 15.0157 14.7866 15.0487 14.935 15.0487C15.0834 15.0487 15.2299 15.0157 15.3639 14.952C15.498 14.8884 15.6162 14.7957 15.71 14.6807V14.6807L28.51 2.00068C29.07 1.43068 29.07 .92068 28.51 .44068C27.95 -.0393204 27.43 -.11932 26.96 .44068L14.94 12.0007L2.99996 .45068C2.90725 .322624 2.7855 .218374 2.6447 .146483C2.50389 .0745926 2.34805 .0371094 2.18996 .0371094C2.03187 .0371094 1.87603 .0745926 1.73522 .146483C1.59442 .218374 1.47267 .322624 1.37996 .45068C.819961 .93068 .819961 1.45068 1.37996 2.01068L14.16 14.6807Z' fill='black'/%3E%3C/svg%3E%0A\");background-size:80% auto;background-repeat:no-repeat;background-position:center;position:absolute;top:-2px;right:0;transition:.3s 150ms}.faq-group__question .heading-5-v2::after{top:-4px}.faq-group__answer{max-height:0;overflow:hidden;width:95%;padding:0 24px;transition:.5s}.faq-group__answer\u003Espan{display:block;padding-bottom:24px}.is-open .faq-group__answer{max-height:600px;transition:1s}.is-open .faq-group__question .heading-4-v2::after,.is-open .faq-group__question .heading-5-v2::after{transform:rotate(180deg);transition:.3s}.summit-agenda{box-shadow:2px 4px 10px 0 rgb(156 156 156 / .52);border-radius:8px;background-color:#fff;max-width:980px;margin-left:auto;margin-right:auto;padding:40px;width:90%}.agenda-item{border-radius:8px;background-color:#d4f0fa;padding:16px;border-left:4px solid var(--ui-01);position:relative}.summit-pricing-block__tile.is-past,.summit-pricing-block__tile.is-upcoming{pointer-events:none;border-color:#d2d1d4}p.agenda-item__time{width:25%;font-family:Texta!important;font-size:32px!important;font-weight:900!important;text-transform:uppercase!important;max-width:140px}@media screen and (max-width:991px){#partnerResources .section--resource-hub .snowflake-button-link .snowflake-button-container{font-size:14px!important;line-height:20px!important;margin-top:4px}#industryPartnerSlider\u003E.snowflake-flexible-column-container-items{display:flex;flex-direction:column}#industryPartnerSlider\u003E.snowflake-flexible-column-container-items\u003Ediv{width:100%}.sc-cert-banner__left{text-align:center}.sc-cert-banner__left .solution-center-hero__certification .snowflake-title-v2-line{justify-content:center}.summit-hero__bg-video{width:200%}.summit-leadership-grid .snowflake-flexible-column-container-items{grid-template-columns:repeat(2,1fr)}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:50%!important;max-width:50%!important}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:none!important}.summit-agenda{padding:24px}p.agenda-item__time{font-size:24px!important;width:auto;white-space:nowrap;padding-right:24px}}.agenda-item\u003Espan{display:flex;align-items:center}.summit-add-on-block,.summit-pricing-block{border:1px solid #d2d1d4;border-radius:8px;overflow:hidden;box-shadow:2px 4px 10px 0 rgb(156 156 156 / .52);background-color:#fff}.summit-add-on-block__content,.summit-pricing-block__content{padding:0 20px 20px}.summit-pricing-block__tile{padding:24px 20px;border-radius:4px;background:#fff;border:1px solid var(--ui-01);position:relative;transition:background-color .3s}.summit-pricing-block__tile:hover{background-color:var(--ui-01);transition:background-color .3s}.summit-pricing-block__tile.is-past{background-color:#d4f0fa}.summit-pricing-block__tile:hover .black-blue-text-color .snowflake-title-v2-line{color:#fff!important;transition:color .3s}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container::after,.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container::before,.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container::after,.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container::before,.summit-pricing-block__tile.is-past .snowflake-content-chip-button,.summit-pricing-block__tile.is-upcoming .snowflake-content-chip-button,.summit-speaker-card .snowflake-card-v2-advanced-tag-indicator{display:none}.summit-pricing-block__tile.is-past .black-blue-text-color .snowflake-title-v2-line{color:#7cc7eb!important}.summit-pricing-block__tile.is-upcoming .black-blue-text-color .snowflake-title-v2-line{color:#8c8c8c!important}.summit-pricing-block__aside{background-color:#d4f0fa;border:1px solid #d2d1d4;border-radius:8px;padding:24px;width:100%}.summit-pricing-block__aside li::marker{color:var(--ui-01)}.summit-pricing-block__aside-headline .heading-5-v2{font-weight:900;margin-bottom:12px}.summit-pricing-block__header{background:#000;padding:24px 40px}.summit-pricing-block__header .heading-4-v2{font-weight:900;letter-spacing:.5px}.bwwidth100,.snowflake-mega-nav-dropdown-footer-content,.summit-pricing-block__tile .black-blue-text-color{width:100%}.summit-pricing-block__tile .heading-5-v2{position:static}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:first-child{text-transform:uppercase;font-weight:900!important;letter-spacing:.25px;font-size:24px!important}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:nth-child(2){margin-top:8px;font-family:Lato,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:16px}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:last-child{font-weight:900!important;font-size:40px!important}.snowflake-mega-nav-nav-item\u003Ea:hover .snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title,.summit-pricing-block__tile:not(.is-upcoming):not(.is-past) .heading-5-v2 span.snowflake-title-v2-line:last-child{color:var(--ui-01)!important}.summit-pricing-block__tile:hover:not(.is-upcoming):not(.is-past) .heading-5-v2 span.snowflake-title-v2-line:last-child{color:#fff!important}.summit-pricing-block__tile.is-past .heading-5-v2 span.snowflake-title-v2-line:last-child{text-decoration:line-through}.summit-pricing-block__tile .snowflake-content-chip-button{margin-top:0;white-space:nowrap;display:none}.snowflake-card-v2-advanced.no-link{pointer-events:none!important}.snowpro-card{border:1px solid var(--summit-border);border-radius:var(--summit-border-radius);padding:var(--summit-card-padding-sm);display:flex;height:100%}.snowpro-card__headline{margin:24px 0 12px}.snowpro-card__pricing{margin-top:48px}.snowpro-card .snowflake-text .snowpro-card__price{color:var(--ui-01);font-weight:900;font-size:40px!important;font-family:Texta,sans-serif}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;flex-wrap:wrap}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:1px solid var(--summit-border)}.summit-stat-card{padding:0 40px}.summit-stat .heading-2-v2 .snowflake-title-v2-line:first-child{font-size:64px;line-height:52px;margin-bottom:8px}.summit-stat .heading-2-v2 .snowflake-title-v2-line:last-child{font-size:32px;line-height:30px;margin-bottom:16px}.summit-speaker-card .snowflake-card-v2-advanced-title{margin-bottom:var(--spacing-01)}.summit-add-on-card{padding:24px;border:1px solid #d2d1d4;border-radius:8px}.summit-add-on__subhead{padding-left:40px;padding-right:40px}.partner-card__logo-grid,.partner-card__logo-single{padding:40px}.partner-card__logo-grid .snowflake-image-container .cmp-image__image,.partner-card__logo-single .snowflake-image-container .cmp-image__image{border-radius:0;max-width:240px;margin:0 auto}.partner-card\u003E.container,.partner-card\u003E.container\u003E.aem-container,.partner-card\u003E.container\u003E.cmp-container{height:100%}.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;gap:24px;align-items:stretch}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:40px 24px;justify-content:center;align-items:center}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.3333% - 24px);margin:0!important}.partner-card{border-radius:8px;border:1px solid #d2d1d4;overflow:hidden;height:100%;background-color:#fff}.partner-card__header{padding:16px 24px;border-bottom:1px solid #d2d1d4}.partner-card__header.is-purple{background-color:#7d44cf}.partner-card__header h4{display:flex;flex-direction:row!important;align-items:center;gap:12px}.partner-card__header h4::before{vertical-align:middle;content:\"\";display:inline-block;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='23' viewBox='0 0 21 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20.0375 12.8374C20.1644 12.439 20.2172 12.0289 20.2077 11.6237C20.193 11.3305 20.1548 11.0373 20.0712 10.7441C19.8196 9.83306 19.223 9.01989 18.3294 8.50724L5.61817 1.2017C3.82388 .173815 1.53618 .784335 .506483 2.56804C-.533615 4.34915 .0797871 6.62351 1.87408 7.65398L8.97715 11.7427L1.87408 15.8201C.0797871 16.8527 -.531016 19.1271 .506483 20.9156C1.53618 22.6941 3.82388 23.302 5.61817 22.2746L18.3294 14.9643C19.1871 14.4728 19.7693 13.7027 20.0375 12.8374Z' fill='black'/%3E%3C/svg%3E%0A\")}.partner-card__header.is-purple h4::before{background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='23' viewBox='0 0 21 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20.0375 12.8374C20.1644 12.439 20.2172 12.0289 20.2077 11.6237C20.193 11.3305 20.1548 11.0373 20.0712 10.7441C19.8196 9.83306 19.223 9.01989 18.3294 8.50724L5.61817 1.2017C3.82388 .173815 1.53618 .784335 .506483 2.56804C-.533615 4.34915 .0797871 6.62351 1.87408 7.65398L8.97715 11.7427L1.87408 15.8201C.0797871 16.8527 -.531016 19.1271 .506483 20.9156C1.53618 22.6941 3.82388 23.302 5.61817 22.2746L18.3294 14.9643C19.1871 14.4728 19.7693 13.7027 20.0375 12.8374Z' fill='white'/%3E%3C/svg%3E%0A\")}.sf-blue-mountains{background-size:90% auto;background-repeat:no-repeat;background-position:center bottom;background-image:url(\"data:image/svg+xml,%3Csvg width='1361' height='410' viewBox='0 0 1361 410' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1360.25 410L1065.53 114.309L976.256 203.875L773.049 0L364.393 410H1360.25Z' fill='%233AA8DF'/%3E%3Cpath d='M274.778 410L137.467 272.238L.15625 410H274.778Z' fill='%233AA8DF'/%3E%3C/svg%3E%0A\")}.bwalignr,.main-pr-body .bwalignr{text-align:right}.bwblockalignl{margin-left:0;margin-right:auto}.bwcellpmargin{margin-top:0;margin-bottom:0}.bwlistdisc{list-style-type:disc}.bwpadb3{padding-bottom:4px}.bwpadb4{padding-bottom:5px}.bwpadl0{padding-left:0}.bwpadl3{padding-left:15px}.bwpadl6{padding-left:30px}.bwpadl9{padding-left:45px}.bwpadl12{padding-left:60px}.bwpadr0{padding-right:0}.bwtablemarginb{margin-bottom:10px}.bwvertalignb{vertical-align:bottom}.bwvertalignt{vertical-align:top}.bwsinglebottom{border-bottom:1pt solid #000}.bwdoublebottom{border-bottom:2.25pt double #000}.bwwidth1{width:1%}.bwwidth2{width:2%}.bwwidth6{width:6%}.bwwidth7{width:7%}.bwwidth8{width:8%}.bwwidth10{width:10%}.bwwidth12{width:12%}.bwwidth32{width:32%}.bwwidth44{width:44%}.bwwidth72{width:72%}.bwwidth97{width:97%}.main-pr-body{font-size:18px;line-height:26px}.main-pr-body img{display:block;width:100%;height:auto!important;border-radius:var(--small-border-radius)}.main-pr-body table{width:100%;display:block}.main-pr-body tbody{background-color:#f7f7f7}.main-pr-body .bwsinglebottom{border-bottom:1pt solid #000!important}.main-pr-body td.bwwidth44{padding-right:40px}.main-pr-body .bw-release-story{font-family:Lato,sans-serif}.main-pr-body .bw-release-story sup,.snowflake-mega-nav-dropdown-header-content-right a{white-space:nowrap}.main-pr-body .bw-release-story\u003E*,.main-pr-body\u003Espan\u003E*{margin-bottom:2rem!important}.snowflake-text.main-pr-body tbody,.snowflake-text.main-pr-body tbody p{font-size:14px!important;line-height:20px!important;width:100%;display:block}.press-body .snowflake-flexible-column-container-items{gap:var(--spacing-08)}.about-snowflake{border:1px solid #ccc;background-color:var(--ui-background-05);padding:24px;border-radius:8px;margin-top:0}.about-snowflake__logo{max-width:140px;margin-top:16px}.hero--press .snowflake-hero-system-inner{max-width:1408px;margin:0 auto!important}#arcticNavItem{flex-direction:column}#arcticNavItem::before{content:\"Featured Open Source Technologies\";display:block;margin-top:48px;margin-bottom:24px;font-size:16px!important;line-height:16px!important;font-weight:800!important;text-transform:uppercase}@media screen and (min-width:768px){.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:relative;height:100%;top:auto;left:auto;width:auto}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child::before{background:linear-gradient(180deg,#202c35 -7.5%,#fff0 51.25%,#202c35 107.69%)}.sc-hero__byline\u003Espan{display:flex;flex-wrap:wrap}.sc-hero__byline p:not(:last-child)::after{content:\"|\";margin:0 12px;opacity:.5}.sc-hero__button-container .snowflake-flexible-column-container-items{position:absolute;bottom:0;padding:0;margin:0 24px 0 0}.sc-hero__button-container .hero-watch-the-demo{padding:12px 16px!important;float:right;margin-bottom:48px;background-color:rgb(35 45 54 / .8)}.summit-overview-stat{padding:0 40px}.summit-timeline{border-bottom:3px solid var(--ui-01);margin-bottom:64px}.summit-add-on-block__content,.summit-pricing-block__content{padding:0 40px 40px}#arcticNavItem::before{font-size:12px!important;margin-bottom:8px;margin-top:16px}.snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title{line-height:20px!important}.snowflake-card .heading-2.snowflake-title-line{font-size:24px!important;line-height:28px!important}}@media screen and (min-width:992px){.hp-hero__eyebrow a{gap:12px;margin-left:0;margin-right:0}.hp-hero__eyebrow a::after{content:\"\";background-image:url(\"data:image/svg+xml,%3Csvg width='6' height='11' viewBox='0 0 6 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M5.49134 5.79438C5.53447 5.75922 5.56923 5.71489 5.5931 5.66463C5.61697 5.61436 5.62935 5.55941 5.62935 5.50376C5.62935 5.44811 5.61697 5.39316 5.5931 5.34289C5.56923 5.29263 5.53447 5.2483 5.49134 5.21314L.736339 .413136C.522589 .203135 .331339 .203135 .151339 .413136C-.0286612 .623135 -.0586612 .818135 .151339 .994386L4.48634 5.50188L.155089 9.97938C.107068 10.0142 .0679743 10.0598 .0410153 10.1126C.0140562 10.1654 0 10.2238 0 10.2831C0 10.3424 .0140562 10.4009 .0410153 10.4537C.0679743 10.5065 .107068 10.5521 .155089 10.5869C.335089 10.7969 .530089 10.7969 .740089 10.5869L5.49134 5.79438Z' fill='black'/%3E%3C/svg%3E%0A\");display:inline-block;width:12px;height:12px;background-repeat:no-repeat;background-size:auto 100%;background-position:left center}.promo-banner--homepage{padding-top:32px}.homepage-banner-offset-container::after{height:50%}#storyHighlights{padding:2rem}.body-display-v2.snowflake-quote-item-quote-text{line-height:28px!important}.snowflake-hero-system-headline .heading-1-v2{line-height:48px;font-size:54px!important}.sc-overview__webinar-promo-banner .snowflake-content-chip-content{flex-direction:row;justify-content:space-between;align-items:center;width:100%}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .heading-5-v2{flex-direction:row}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line:not(:first-child)::before{content:\"|\";margin:0 6px}.sc-cert-banner{padding:40px}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{margin:0!important;width:50%}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;padding-right:24px}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{max-width:240px}.summit-pricing-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{width:70%;padding-left:40px}.summit-pricing-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{width:30%}.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.3333% - 24px);margin:0!important;display:flex}.summit-pricing-block__tile .snowflake-content-chip-content{display:flex;flex-direction:row;align-items:center;width:calc(100% - 200px)}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:last-child{position:absolute;top:50%;transform:translate(0,-50%);right:40px}.press-body\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:sticky;top:120px}.snowflake-mega-nav-navigation-title:hover{color:var(--ui-01)}}@media screen and (min-width:1024px){.about-snowflake{padding:28px}.about-snowflake__logo{max-width:none;padding:0 0 0 48px;margin-bottom:0}.hero--press .snowflake-hero-system-layout-70-30 .snowflake-hero-system-content-container{width:85%}.snowflake-hero-system{padding-bottom:var(--spacing-04);padding-top:var(--spacing-07)}.hero--press .display-2-v2{font-size:64px;line-height:56px}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container{flex-direction:row;flex-wrap:nowrap;align-items:center}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{max-width:280px}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;margin-bottom:0!important}#polarisNavItem{margin-top:40px}.snowflake-mega-nav-nav-item-description{line-height:18px!important}.snowflake-mega-nav-column-items{gap:var(--spacing-01);grid-gap:var(--spacing-01)}.snowflake-mega-nav-navigation-title{text-transform:none}}div[id*=blueIcon] .snowflake-mega-nav-nav-item-icon__inner{background:var(--ui-01);padding:8px}div[id*=blueIcon]:hover .snowflake-mega-nav-nav-item-icon__inner{background:var(--ui-01)!important}.snowflake-mega-nav-nav-item-icon__inner{border-radius:4px;background:var(--ui-background-05);padding:6px}.snowflake-mega-nav-nav-item:hover .snowflake-mega-nav-nav-item-icon__inner{background:#fff!important}.snowflake-mega-nav-nav-item-icon.snowflake-image-container{height:40px;width:40px}.snowflake-mega-nav-dropdown-footer-links\u003E.snowflake-button-link\u003E.snowflake-button-container{font-size:16px!important;font-family:Texta!important;font-weight:800!important}.snowflake-mega-nav-dropdown-footer-icon.snowflake-image-container{margin-right:8px;width:40px!important;height:40px!important}#viewAllCapabilities a:hover{background:0 0!important}#platformFooter .snowflake-title-v2 .snowflake-title-v2-line:last-child{font-family:Lato;font-size:14px;font-weight:500}#platformFooter .snowflake-mega-nav-dropdown-footer-links{flex-grow:1;justify-content:flex-end;align-items:center}#platformFooter .snowflake-mega-nav-dropdown-footer-content{flex-direction:row}#offset,#open-source{flex-direction:column;border-top:1px solid #ccc}#offset::before,#open-source::before{content:\" \";display:block;width:100%;font-weight:800!important;font-size:12px!important;line-height:14px;text-transform:uppercase;white-space:nowrap;margin-top:16px;margin-bottom:8px}#open-source::before{content:\"Open Source Technologies\"}.snowflake-mega-nav-dropdown-menu-close-button{margin:var(--spacing-04) 0 var(--spacing-03)}.snowflake-mega-nav-column{gap:var(--spacing-02)!important}.snowflake-mega-nav-nav-item\u003Ea{width:100%;margin-left:-8px;padding:8px;border-radius:4px}.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:var(--ui-background-05)}.snowflake-mega-nav-nav-item-description{margin-top:2px;display:block}#promobanner_overflowBottomDarkBlue::before{content:'';display:block;position:absolute;bottom:0;left:0;width:100%;height:50%;background:#212d35}#promobanner_overflowTopDarkBlue::before{content:'';display:block;position:absolute;top:0;left:0;width:100%;height:50%;background:#212d35}.overview-card\u003Ediv{box-shadow:0 0 14px 0 rgba(0,0,0,.10);background-color:#fff;border-radius:16px;overflow:hidden}.overview-card-text{padding:40px}.overview-card-image img{border-radius:0 !important}.overview-card-text h3,.overview-card-text .heading-3-v2{font-size:18px;line-height:1.1;margin-top:0}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"mega_header":{"additionalClasses":"heap-nav-header","layout":"SIMPLE","id":"container-faf4f47ae4","appliedCssClassNames":"snowflake-header-container white",":items":{"nav_mega":{"activeItem":"item_1719963657751_c_663444255","id":"tabs-e1e2e8c48a",":type":"snowflake-site/components/nav/nav-mega",":items":{"item_1719963657751_c_663444255":{"id":"nav-dropdown-menu-834ed96303","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-928a66b8cd",":items":{"nav_column":{"additionalClasses":"nav-platform-sidebar","numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-db762892b1",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-f94e2ff222","additionalClasses":"nav-item__platform-parent is-platform","linkDescription":"Develop AI products, apps and more on a fully managed platform that securely connects businesses globally — across any type or scale of data.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/platform/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"The Snowflake Platform"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-5961d5e989","additionalClasses":"nav-item nav-item--si is-si","linkDescription":"All your knowledge. One trusted enterprise agent.","flag":"NOW GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/snowflake-cowork/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake CoWork"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2_836345186":{"id":"nav-item-96be7fde71","additionalClasses":"blue-icon is-analytics","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/analytics/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Analytics"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2":{"id":"nav-item-9260fc5557","additionalClasses":"blue-icon is-ai","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/ai/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2_1314771042":{"id":"nav-item-a38cd22648","additionalClasses":"blue-icon is-data-eng","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/data-engineering/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Data Engineering"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634":{"id":"nav-item-1d6ca499e0","additionalClasses":"blue-icon is-apps-collab","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/applications-and-collaboration/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Applications & Collaboration"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_2013333117":{"id":"nav-item-204daedb50","additionalClasses":"blue-icon is-transactions","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/transactions/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Transactions"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_copy_2_793631646","nav_item","nav_item_copy_copy_2_836345186","nav_item_copy_copy_2","nav_item_copy_copy_2_1314771042","nav_item_copy_144634","nav_item_copy_144634_2013333117"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","navColumnTitle":"Featured Capabilities","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-7e03d3be81",":items":{"nav_item_copy_212715":{"id":"nav-item-7ca98d94de","additionalClasses":"is-cortex-code","linkDescription":"Snowflake-native AI coding agent ","flag":"New","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/snowflake-coco/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake CoCo"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-9b7d075868","additionalClasses":"is-cortex-ai","linkDescription":"Instant access to industry-leading LLMs","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/cortex/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Cortex AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590635":{"id":"nav-item-8ca31b7115","additionalClasses":"is-marketplace","linkDescription":"Third-party data sources connected within minutes","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/marketplace/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Marketplace"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590":{"id":"nav-item-eb9078f991","additionalClasses":"is-snowpark","linkDescription":"Libraries and code execution environments that run Python and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/snowpark/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Snowpark"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_983061516":{"id":"nav-item-f38df2e9fa","additionalClasses":"is-streamlit","linkDescription":"Framework for transforming Python scripts into web apps","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/streamlit-in-snowflake/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Streamlit"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_212715","nav_item","nav_item_copy_660590635","nav_item_copy_660590","nav_item_copy_660590_983061516"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_692142673":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-646930f255",":items":{"nav_item_copy_660590_1739526127":{"id":"nav-item-6b12c88b86","additionalClasses":"is-postgres","linkDescription":"Fully compatible open source Postgres running on Snowflake","flag":"Now GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/postgres/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Postgres"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-4ccc08fb4e","additionalClasses":"is-dcr","linkDescription":"Streamlined model development and MLOps from a centralized UI","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/end-to-end-ml-workflows/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake ML"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_212715":{"id":"nav-item-f8b0ee3c58","additionalClasses":"is-openflow","linkDescription":"Effortless data movement for integrations","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/openflow/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Openflow"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590":{"id":"nav-item-06904d2d53","additionalClasses":"is-notebooks","linkDescription":"Interactive dev environment for data and AI teams","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/notebooks/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Notebooks"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-8d6b5c14b9","propertiesId":"workload-nav-1","additionalClasses":"is-native-apps","linkDescription":"End-to-end, Snowflake-native app creation and distribution","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/native-apps/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Native Apps"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_660590_1739526127","nav_item_copy_185565","nav_item_copy_212715","nav_item_copy_660590","nav_item_258535199"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_782221091":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-af150f5348",":items":{"nav_item_copy":{"id":"nav-item-522d8ca9f3","additionalClasses":"is-light-gray-icon is-horizon-catalog","linkDescription":"Universal AI catalog","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/horizon/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Horizon Catalog"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_1293798742":{"id":"nav-item-7ba77ef4e9","additionalClasses":"is-snowflake-ml","linkDescription":"Governed context layer that keeps AI, BI and data apps working from one truth","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/horizon-context/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Horizon Context"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c":{"id":"nav-item-563f4376da","additionalClasses":"is-unistore","linkDescription":"Unify transactional and analytical workloads in Snowflake for enhanced simplicity","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/unistore/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Unistore"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c_1443811525":{"id":"nav-item-44985afaed","additionalClasses":"is-observe","linkDescription":"AI-powered observability for faster production troubleshooting","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/observe/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Observe"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c_1006104884":{"id":"nav-item-33fb29de70","additionalClasses":"is-observe","linkDescription":"Use any engine on a single governed data copy","flag":"Now GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/use-cases/interoperable-lakehouse/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Interoperable Lakehouse"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy","nav_item_copy_660590_1293798742","nav_item_511717659_c","nav_item_511717659_c_1443811525","nav_item_511717659_c_1006104884"],":type":"snowflake-site/components/nav/nav-column"}},":itemsOrder":["nav_column","nav_column_copy_copy","nav_column_692142673","nav_column_782221091"],":type":"snowflake-site/components/nav/nav-column/nav-column-container"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Product"},"nav_dropdown_menu_2":{"id":"nav-dropdown-menu-59d8573217","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-7b160f75f1",":items":{"nav_column":{"navColumnTitle":"INDUSTRIES","numberOfSubColumns":"one-column","minWidth":"280","layout":"SIMPLE","id":"container-d013b0f722","appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small",":items":{"nav_item_copy_361384_2056203141":{"id":"nav-item-6e92591ed8","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"All Industries"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-cc86a3a875","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/advertising-media-entertainment/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Advertising, Media & Entertainment"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-65f545bb91","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/financial-services/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Financial Services"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-6cd2f1f011","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/healthcare-and-life-sciences/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Healthcare & Life Sciences"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1533429516":{"id":"nav-item-d0025ff224","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/manufacturing/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Manufacturing"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1444458226":{"id":"nav-item-cbae172395","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/public-sector/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Public Sector"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1149488919":{"id":"nav-item-f8ac850ead","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/retail-consumer-goods/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Retail & Consumer Goods"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_57417040":{"id":"nav-item-7366837b05","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/technology/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Technology"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384674":{"id":"nav-item-cf1ecc238a","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/telecom/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Telecom"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384":{"id":"nav-item-b7b995df95","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/travel-hospitality/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Travel & Hospitality"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_361384_2056203141","nav_item","nav_item_copy","nav_item_copy_1970515619","nav_item_copy_1533429516","nav_item_copy_1444458226","nav_item_copy_1149488919","nav_item_copy_57417040","nav_item_copy_361384674","nav_item_copy_361384"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_copy":{"navColumnTitle":"DEPARTMENTS","numberOfSubColumns":"one-column","minWidth":"160","layout":"SIMPLE","id":"container-86a79c42ab",":items":{"nav_item":{"id":"nav-item-8626cfed38","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/finance/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Finance"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-86f42a8bcd","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/information-technology/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"IT"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-40d6fa7649","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/marketing/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Marketing"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_833417450":{"navColumnTitle":"Enablement Solutions","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-a1f2f48464",":items":{"nav_item_copy_107772":{"id":"nav-item-b5f9260edc","linkDescription":"Confident migration to a unified platform","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/migrate-to-the-cloud/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Migrate to the AI Data Cloud"},"icon":{"id":"icon","alt":"Cloud icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_833417450/nav_item_copy_107772/icon.coreimg.svg/1723828484100/nav-icon-cloud.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-48cb74cbad","linkDescription":"Snowflake experts to help you accelerate and achieve business goals","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/services-delivery/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Services Delivery"},"icon":{"id":"icon","alt":"Migrate icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_833417450/nav_item_copy_copy/icon.coreimg.svg/1768354429188/nav-icon--migrate.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_107772","nav_item_copy_copy"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_copy_copy":{"navColumnTitle":"PARTNER SOLUTIONS","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-3e0c13debb",":items":{"nav_item":{"id":"nav-item-2abcfd8f19","linkDescription":"Programs with product, solutions and cloud partners","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake Partner Network"},"icon":{"id":"icon","alt":"Partner Network icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1723828498700/nav-icon--partner-network.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-63cd4d5966","linkDescription":"Partners, apps and solutions for enhanced deployment","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/all-partners/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Partner Finder"},"icon":{"id":"icon","alt":"Partner Finder icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1726173927645/nav-icon--partner-finder.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-49921d2f8d","linkDescription":"Live and virtual events","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/event-partnership-opportunities/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Event Partnership Opportunities"},"icon":{"id":"icon","alt":"Calendar icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item_copy_1970515619/icon.coreimg.svg/1726173935655/nav-icon--events.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"],":type":"snowflake-site/components/nav/nav-column"}},":itemsOrder":["nav_column","nav_column_copy","nav_column_833417450","nav_column_copy_copy"],":type":"snowflake-site/components/nav/nav-column/nav-column-container"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Solutions"},"item_1719963657751_c":{"id":"nav-dropdown-menu-ca19c3dadc","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-0e4fc95035",":items":{"nav_column":{"numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-15473e2156",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-4de8b6c202","additionalClasses":"nav-item__platform-parent-why-sf","linkDescription":"Collaborate locally and globally to reveal new insights, create previously unforeseen business opportunities, and identify your customers with seamless experiences.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Why Snowflake"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_copy_2_793631646"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","numberOfSubColumns":"two-columns","maxWidth":"1200","layout":"SIMPLE","id":"container-09fe3941dd",":items":{"nav_item":{"id":"nav-item-55fefe6501","propertiesId":"testID","linkDescription":"Case studies and videos showcasing how global organizations use Snowflake","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/customers/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Customers"},"icon":{"id":"icon","alt":"Customer icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1739839279367/nav-icon--partner-network.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-e42de4b894","propertiesId":"workload-nav-1","linkDescription":"Learn how to connect, share and integrate the data and apps on the AI Data Cloud","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/what-is-data-cloud/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"The AI Data Cloud Explained"},"icon":{"id":"icon","alt":"Cloud icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_258535199/icon.coreimg.svg/1739840490955/nav-icon-cloud.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-5a7f6c7e9e","linkDescription":"Comprehensive security through built-in features, robust cloud infrastructure protection, and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/snowflake-security-hub/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Security Hub"},"icon":{"id":"icon","alt":"User with security lock icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy_185565/icon.coreimg.svg/1758909528089/user-security-admins-ciso-icon.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-82fd525014","additionalClasses":"is-light-gray-icon","linkDescription":"Maximize economic value through minimizing TCO and continuously optimizing price for performance","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/pricing-options/cost-and-performance-optimization/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Cost and Performance Optimization"},"icon":{"id":"icon","alt":"Cost Optimization icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1758909542267/nav-icon-cost-optimization-performance.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565_903555964":{"id":"nav-item-9ecd860297","linkDescription":"Startups building applications in the AI Data Cloud","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/startup-program/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake for Startups"},"icon":{"id":"icon","alt":"Launch","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy_185565_903555964/icon.coreimg.svg/1758732224323/launch.svg","lazyEnabled":true,"height":"64","width":"65",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_258535199","nav_item_copy_185565","nav_item_copy","nav_item_copy_185565_903555964"],":type":"snowflake-site/components/nav/nav-column"}},":itemsOrder":["nav_column","nav_column_copy_copy"],":type":"snowflake-site/components/nav/nav-column/nav-column-container"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Why Snowflake"},"item_1719961362824":{"id":"nav-dropdown-menu-aa3580027f","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-53b3a2d32d",":items":{"nav_column_copy":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","minWidth":"124","layout":"SIMPLE","id":"container-49faf0589d",":items":{"nav_item":{"id":"nav-item-26249a5200","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Blog"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_180298689":{"id":"nav-item-f3744fd96e","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/events/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Events"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_1639361946":{"id":"nav-item-69f4d64421","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/support/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Support"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_680912746":{"id":"nav-item-7d1c870d71","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/contact/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Contact us"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_180298689","nav_item_1639361946","nav_item_680912746"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_44600420__826130542":{"navColumnTitle":"Learn","numberOfSubColumns":"two-columns","layout":"SIMPLE","id":"container-f607467198",":items":{"nav_item_copy":{"id":"nav-item-53f8140939","linkDescription":"Ebooks, videos, white papers and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Resource Library"},"icon":{"id":"icon","alt":"Notebooks icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy/icon.coreimg.svg/1736877128196/nav-icon--notebooks.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-0443a13896","linkDescription":"Overview of Snowflake's educational offerings","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/learn/training/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Training"},"icon":{"id":"icon","alt":"Training icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item/icon.coreimg.svg/1722385094416/nav-icon--training.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_1984107859":{"id":"nav-item-cd32befdcb","linkDescription":"Expert-led discussions and demos across industries and use cases","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Webinars"},"icon":{"id":"icon","alt":"Webinars icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_144634_1984107859/icon.coreimg.svg/1759424691990/nav-icon--webinars.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1438098918":{"id":"nav-item-863149d8a0","linkDescription":"Snowflake's technical industry professional certifications","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/learn/certifications/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Certifications"},"icon":{"id":"icon","alt":"Certification icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_1438098918/icon.coreimg.svg/1722382780833/nav-icon--cert.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_143809":{"id":"nav-item-9f4f08e65a","linkDescription":"Weekly product demos showcasing key features and live Q&A ","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/demo/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Live Demos"},"icon":{"id":"icon","alt":"Live Demo icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_143809/icon.coreimg.svg/1759424359543/nav-icon--live-demo.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890638":{"id":"nav-item-9fdf3d29ca","linkDescription":"Training courses for all levels, on-demand or instructor-led","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://learn.snowflake.com/en/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Snowflake University"},"icon":{"id":"icon","alt":"Education icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890638/icon.coreimg.svg/1722382769808/nav-icon--education.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945":{"id":"nav-item-d279598906","linkDescription":"Instructor-led virtual workshops for exploring key Snowflake features","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/virtual-hands-on-lab/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Hands-On Labs"},"icon":{"id":"icon","alt":"Hands-on Labs icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_189945/icon.coreimg.svg/1759388182903/nav-icon--labs.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890":{"id":"nav-item-401407f947","linkDescription":"Academic papers written by Snowflake researchers","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/publications/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake Research Publications"},"icon":{"id":"icon","alt":"Copy","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890/icon.coreimg.svg/1756326371387/copy.svg","lazyEnabled":true,"height":"64","width":"65",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890_930852828":{"id":"nav-item-ba2b6a78f1","linkDescription":"Informative articles about AI and data topics","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/fundamentals/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Fundamentals"},"icon":{"id":"icon","alt":"Document with list","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890_930852828/icon.coreimg.svg/1756853637155/data-sheet.svg","lazyEnabled":true,"height":"64","width":"65",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy","nav_item","nav_item_copy_144634_1984107859","nav_item_copy_1438098918","nav_item_copy_143809","nav_item_copy_333890638","nav_item_copy_189945","nav_item_copy_333890","nav_item_copy_333890_930852828"],":type":"snowflake-site/components/nav/nav-column"}},":itemsOrder":["nav_column_copy","nav_column_44600420__826130542"],":type":"snowflake-site/components/nav/nav-column/nav-column-container"},"nav_promo_section":{"id":"nav-promo-section-8f541bca29","experience_fragment_1":{"id":"experiencefragment-72380aa985","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master1/jcr:content","configured":true,":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-2224ff77ec",":items":{"nav_promo_card":{"id":"nav-promo-card-93621b8195","openInNewWindow":true,"layout":"horizontal","headline":"Dev Day Virtual - June 25","description":"Don’t just hear about AI — build it. Luminary talks and hands-on labs","linkTitle":"Learn more","linkUrl":"/en/dev-day/americas-virtual/","image":{"id":"image","alt":"dev day","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--de231e36-6645-4550-abd9-0f8de758ac66/web-dev-day-26-960x540-1x.png?preferwebp=true&quality=85","lazyEnabled":true,"height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"],":type":"snowflake-site/components/container"},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],":type":"snowflake-site/components/experiencefragment","classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-d7646135b1","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-2/jcr:content","configured":true,":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-bae80dbf34",":items":{"nav_promo_card":{"id":"nav-promo-card-db1f3e4c58","openInNewWindow":true,"layout":"horizontal","headline":"The ROI of Gen AI and Agents 2026","description":"Discover how 92% of early adopters are achieving positive ROI with gen AI.","linkTitle":"Learn More","linkUrl":"/en/lp/radical-roi-generative-ai/","image":{"id":"image","alt":"roi of gen ai and agents","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--0c15edae-1a97-4739-8b16-c7f3941a6d9e/web-roi-of-gen-ai-and-agents-2026-r02-960x540.png?preferwebp=true&quality=85","lazyEnabled":true,"height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"],":type":"snowflake-site/components/container"},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],":type":"snowflake-site/components/experiencefragment","classNames":"aem-xf"},"experience_fragment_3":{"id":"experiencefragment-b3ec50603a","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-3/jcr:content","configured":true,":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-0259bdb9ba",":items":{"nav_promo_card":{"id":"nav-promo-card-d7d3913718","openInNewWindow":true,"layout":"horizontal","headline":"Startup 2026: AI Agents Mean Business","description":"Venture leaders weigh in on agentic AI. ","linkTitle":"Learn more","linkUrl":"/en/lp/building-startup-ai-age/","image":{"id":"image","alt":"alt","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--a320b404-dca1-4477-b033-c79708538657/web-startup-2026-960x540.png?preferwebp=true&quality=85","lazyEnabled":true,"height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"],":type":"snowflake-site/components/container"},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],":type":"snowflake-site/components/experiencefragment","classNames":"aem-xf"},":type":"snowflake-site/components/nav/nav-promo-section"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Resources"},"item_1719963657751":{"id":"nav-dropdown-menu-4a5a1996b6","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-8ed64dc6f7",":items":{"nav_column_copy_copy":{"navColumnTitle":"Build","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-20673bae65",":items":{"nav_item":{"id":"nav-item-6744d84dae","propertiesId":"testID","linkDescription":"Overview of the dev resources you need to build and scale","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake for Developers"},"icon":{"id":"icon","alt":"Developers icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1731362494574/nav-icon--devs.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-44c83d53ba","linkDescription":"Reference architectures, use cases and best practices","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/guides/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Developer Guides"},"icon":{"id":"icon","alt":"Solution Center icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item_copy_1855651246/icon.coreimg.svg/1761677891705/nav-icon--solution-center.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-8698be8438","additionalClasses":"is-light-gray-icon","linkDescription":"The latest software versions, drivers, libraries and relevant docs","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/downloads/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Downloads"},"icon":{"id":"icon","alt":"Download icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1731362660050/nav-icon-download.svg","lazyEnabled":true,"height":"28","width":"28",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246","nav_item_copy"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_copy_copy_1367930678":{"navColumnTitle":"Learn","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-f0b910df5d",":items":{"nav_item":{"id":"nav-item-369ec28fa8","propertiesId":"testID","linkDescription":"Reference docs, guides, tutorials and announcements","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://docs.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Documentation"},"icon":{"id":"icon","alt":"Docs icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item/icon.coreimg.svg/1731361950527/nav-icon--docs.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-b252e4600a","additionalClasses":"is-light-gray-icon","linkDescription":"Key projects Snowflake engineers maintain and support","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/open-source/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Open Source"},"icon":{"id":"icon","alt":"Open Source icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item_copy/icon.coreimg.svg/1731365437016/nav-icon-open-source.svg","lazyEnabled":true,"height":"32","width":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-6eee31ae0f","additionalClasses":"is-light-gray-icon","linkDescription":"Online and in-person classes and workshops to upskill on Snowflake","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/northstar/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Builder Education"},"icon":{"id":"icon","alt":"Northstar logo","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item_copy_copy/icon.coreimg.svg/1731362475640/nav-icon--northstar.svg","lazyEnabled":true,"height":"32","width":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_copy"],":type":"snowflake-site/components/nav/nav-column"},"nav_column_copy_copy_1101894776":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-f0ed47bad8",":items":{"nav_item":{"id":"nav-item-bd5cd0038c","propertiesId":"testID","linkDescription":"Snowflake’s technical leaders on what, why and how they build features","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/engineering-blog/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Engineering Blog"},"icon":{"id":"icon","alt":"Developers icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1101894776/nav_item/icon.coreimg.svg/1757101368571/nav-icon--developer-center.svg","lazyEnabled":true,"height":"32","width":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-b925826a85","linkDescription":"Tips, tricks and discussion with fellow Snowflake developers","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://community.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Community"},"icon":{"id":"icon","alt":"Partner Network icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1101894776/nav_item_copy_1855651246/icon.coreimg.svg/1731362644348/nav-icon--partner-network.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246"],":type":"snowflake-site/components/nav/nav-column"}},":itemsOrder":["nav_column_copy_copy","nav_column_copy_copy_1367930678","nav_column_copy_copy_1101894776"],":type":"snowflake-site/components/nav/nav-column/nav-column-container"},"nav_promo_section":{"id":"nav-promo-section-46f90ca6ee","experience_fragment_1":{"id":"experiencefragment-36508a62a9","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-5/jcr:content","configured":true,":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-5ca536da71",":items":{"nav_promo_card":{"id":"nav-promo-card-3ff53a6519","openInNewWindow":false,"layout":"horizontal","headline":"Get started with your first Snowflake Notebook","description":"Write and execute code, visualize results, and tell the story of your analysis all in one place.","linkTitle":"Learn More","linkUrl":"/en/developers/solutions-center/getting-started-with-your-first-snowflake-notebook-project/","image":{"id":"image","alt":"alt","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--dc7e334a-c38b-4283-b1de-fcf829952eef/nav-promo-first-notebook.jpg?preferwebp=true&quality=85","lazyEnabled":true,"height":"210","width":"415",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"],":type":"snowflake-site/components/container"},"cq:LiveSyncConfig":{"cq:isDeep":true,"cq:rolloutConfigs":[],"cq:master":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4",":type":"cq:LiveCopy"}},":itemsOrder":["root","cq:LiveSyncConfig"],":type":"snowflake-site/components/experiencefragment","classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-c353552508","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4/jcr:content","configured":true,":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-8f66ee19b6",":items":{"nav_promo_card":{"id":"nav-promo-card-3090039aeb","openInNewWindow":true,"layout":"horizontal","headline":"Northstar Builder Workshops","description":"Join other developers as you roll up your sleeves and explore the possibilities of Snowflake.","linkTitle":"Learn More","linkUrl":"/en/nav-promos/northstar-builders-workshop/","image":{"id":"image","alt":"Snowflake Northstar logo","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--14341ced-bc5e-4a29-9762-b7857f6cadfc/nav-promo-northstar.jpg?preferwebp=true&quality=85","lazyEnabled":true,"height":"700","width":"1440",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"],":type":"snowflake-site/components/container"},"cq:LiveSyncConfig":{"cq:isDeep":true,"cq:rolloutConfigs":[],"cq:master":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master",":type":"cq:LiveCopy"}},":itemsOrder":["root","cq:LiveSyncConfig"],":type":"snowflake-site/components/experiencefragment","classNames":"aem-xf"},":type":"snowflake-site/components/nav/nav-promo-section"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Developers"},"item_1718247180324":{"id":"nav-dropdown-menu-3a48101600","enableDropdown":false,"link_url":"/en/pricing-options/",":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Pricing"}},":itemsOrder":["item_1719963657751_c_663444255","nav_dropdown_menu_2","item_1719963657751_c","item_1719961362824","item_1719963657751","item_1718247180324"]},"languagenavigation":{"id":"language-navigation-2a061f8c96","languageNavItems":[{"title":"English","path":"/en/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/","locale":"en","active":true},{"title":"日本語","path":"/ja/","locale":"ja","active":false},{"title":"한국어","path":"/ko/","locale":"ko","active":false},{"title":"中文（简体）","path":"/zh_cn/","locale":"zh-cn","active":false},{"title":"Português","path":"/pt_br/","locale":"pt-br","active":false},{"title":"Deutsch","path":"/de/","locale":"de","active":false},{"title":"Français","path":"/fr/","locale":"fr","active":false},{"title":"Español","path":"/es/","locale":"es","active":false},{"title":"Italiano","path":"/it/","locale":"it","active":false}],":type":"snowflake-site/components/nav/language-navigation"},"button_1177328691":{"id":"button-4f979b171b","heapButtonClasses":["mega-nav__sign-in"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://app.snowflake.com/"},"linkTargetContentType":"GENERIC","appliedCssClassNames":"snowflake-button-link snowflake-button-black snowflake-button-compact","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Sign in"},"button":{"id":"button-70d2e698f4","heapButtonClasses":["contact_nav","heap-nav-contact"],"showOutboundIcon":true,"buttonLink":{"valid":true,"url":"/en/contact-sales/"},"linkTargetContentType":"GENERIC","appliedCssClassNames":"snowflake-button-secondary snowflake-button-blue snowflake-button-compact","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"CONTACT SALES"},"button_288358396":{"id":"button-b5f1b5e59f","heapButtonClasses":["start_for_free_nav","heap-nav-start-for-free"],"showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://signup.snowflake.com/"},"linkTargetContentType":"GENERIC","appliedCssClassNames":"snowflake-button-primary snowflake-button-blue snowflake-button-compact","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"start for free"}},":itemsOrder":["nav_mega","languagenavigation","button_1177328691","button","button_288358396"],":type":"snowflake-site/components/mega-header"}},":itemsOrder":["markup_editor","mega_header"],":type":"snowflake-site/components/container"},"image":{":type":"nt:unstructured"},"cq:targetMetadata":{"cq:targetStatus":"OUT_OF_SYNC","cq:exportTime":1781280015540,"cq:targetOfferId":860250,":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:targetMetadata"],":type":"snowflake-site/components/experiencefragment","classNames":"aem-xf"},"markup_editor_1950346551":{"id":"markup-editor-613ec944c5","title":" ","cssContent":".snowflake-markdown-table code[class*=language-],.snowflake-markdown-table code[class*=language-],.snowflake-markdown .snowflake-text code[class*=language-],.snowflake-markdown .snowflake-text pre[class*=language-]{background-color:rgba(var(--ui-12-rgb),.5);color:var(--text-01);text-shadow:none;padding:var(--spacing-00);border-radius:var(--spacing-00);font-size:smaller}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"responsivegrid":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"quickstart_hero":"aem-GridColumn aem-GridColumn--default--12","flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"columnCount":12,":items":{"quickstart_hero":{"id":"quickstart-hero-3a67ff3d20","quickstartHeroFirstCertifiedTag":{"tagText":"Quickstart","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/solution-center/certification/quickstart","tagIcon":""},"fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python",":type":"snowflake-site/components/quickstart/quickstart-hero","isDeveloperGuidesPage":false,"quickstartHeroTitle":{"lines":["Leverage dbt Cloud to Generate ML ready pipelines using Snowpark python"],"type":"heading2",":type":"snowflake-site/components/title-v2"},"quickstartHeroAuthor":"hope-wat","quickstartHeroForkRepoLink":{"id":"button-a64654fdfa","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://github.com/Snowflake-Labs/sfquickstarts/tree/master/site/sfguides/src/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Fork Repo"},"quickstartHeroBreadcrumbs":[{"title":"Leverage dbt Cloud to Generate ML ready pipelines using Snowpark python","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python","currentPage":true},{"title":"Guides","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides","currentPage":false},{"title":"Snowflake for Developers","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers","currentPage":false}]},"flexible_column_cont":{"id":"flexible-column-container-9011edce90","propertiesId":"quickstart-template-main-flexible-container","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-21714c26bb",":items":{"contentfragment":{"id":"contentfragment-be492a6e40","description":"This is a sample Snowflake Guide","paragraphs":["&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EOverview\u003C/h2\u003E\n","\u003Cp\u003EThe focus of this workshop will be to demonstrate how we can use both \u003Cem\u003ESQL and python together\u003C/em\u003E in the same workflow to run \u003Cem\u003Eboth analytics and machine learning models\u003C/em\u003E on dbt Cloud.\u003C/p\u003E\n","\u003Cp\u003EThe code complete repository for this quickstart can be found on \u003Ca href=\"https://github.com/dbt-labs/python-snowpark-formula1/tree/main\"\u003EGitHub\u003C/a\u003E.\u003C/p\u003E\n","\u003Ch3\u003EWhat you'll need to setup for the lab\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EA \u003Ca href=\"https://trial.snowflake.com/\"\u003ESnowflake account\u003C/a\u003E with ACCOUNTADMIN access\u003C/li\u003E\u003Cli\u003EA \u003Ca href=\"https://github.com/\"\u003EGitHub\u003C/a\u003E Account\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EWhat you will learn\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EHow to use dbt with Snowflake to build scalable transformations using SQL and Python\u003C/li\u003E\u003Cli\u003EHow to use dbt SQL to prepare your data from sources to encoding\u003C/li\u003E\u003Cli\u003EHow to train a model in dbt python and use it for future prediction\u003C/li\u003E\u003Cli\u003EHow to deploy your full project\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EWhat you need to know\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EBasic to intermediate SQL and python.\u003C/li\u003E\u003Cli\u003EBasic understanding of dbt fundamentals. We recommend the \u003Ca href=\"https://courses.getdbt.com/courses/fundamentals\"\u003Edbt Fundamentals course\u003C/a\u003E if you're interested.\u003C/li\u003E\u003Cli\u003EHigh level understanding of machine learning processes (encoding, training, testing).\u003C/li\u003E\u003Cli\u003ESimple ML algorithms &mdash; we will use logistic regression to keep the focus on the \u003Cem\u003Eworkflow\u003C/em\u003E, not algorithms!\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EWhat you'll build\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EA set of data analytics and prediction pipelines using Formula 1 data leveraging dbt and Snowflake, making use of best practices and code promotion between environments.\u003C/li\u003E\u003Cli\u003EWe will create insights for:\n\u003Col\u003E\u003Cli\u003EFinding the lap time average and rolling average through the years\u003C/li\u003E\u003Cli\u003EPredicting the position of each driver based on a decade of data\u003C/li\u003E\u003C/ol\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EWhat you'll need\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EAs inputs, we are going to leverage Formula 1 dataset hosted on a dbt Labs public S3 bucket.\n\u003Cul\u003E\u003Cli\u003EWe will create a Snowflake Stage for our CSV files then use Snowflake&rsquo;s \u003Ccode\u003ECOPY INTO\u003C/code\u003E function to copy the data in from our CSV files into tables.\u003C/li\u003E\u003Cli\u003EThe Formula 1 dataset is available on \u003Ca href=\"https://www.kaggle.com/datasets/rohanrao/formula-1-world-championship-1950-2020\"\u003EKaggle\u003C/a\u003E.\u003C/li\u003E\u003Cli\u003EThe data is originally compiled from the \u003Ca href=\"http://ergast.com/mrd/\"\u003EErgast Developer API\u003C/a\u003E.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EWe will not be building the full pipeline as part of this workshop.\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EInstead we will leverage an existing repo, fork it, and focus on our machine learning pipeline.\u003C/strong\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EArchitecture and use case overview\u003C/h2\u003E\n","\u003Cp\u003EIn this lab we'll be transforming raw Formula 1 data into a consumable form for both analytics and machine learning pipelines. To understand how our data are related, we've included an entity relationship diagram (ERD) of the tables we'll be using today.\u003C/p\u003E\n","\u003Cp\u003EOur data rarely ever looks the way we need it in its raw form: we need to join, filter, aggregate, etc. dbt is designed to transform your data and keep your pipeline organized and reliable along the way. We can see from our Formula1 ERD that if we have a major table called \u003Ccode\u003Eresults\u003C/code\u003E with other tables such as \u003Ccode\u003Edrivers\u003C/code\u003E, \u003Ccode\u003Eraces\u003C/code\u003E, and \u003Ccode\u003Ecircuits\u003C/code\u003E tables that provide meaningful context to the \u003Ccode\u003Eresults\u003C/code\u003E table.\u003C/p\u003E\n","\u003Cp\u003EYou might also see that \u003Ccode\u003Ecircuits\u003C/code\u003E cannot be directly joined to \u003Ccode\u003Eresults\u003C/code\u003E since there is no key. This is a typical data model structure we see in the wild: we'll need to first join \u003Ccode\u003Eresults\u003C/code\u003E and \u003Ccode\u003Eraces\u003C/code\u003E together, then we can join to \u003Ccode\u003Ecircuits\u003C/code\u003E. By bringing all this information together we'll be able to gain insights about lap time trends through the years.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFormula 1 ERD:\u003C/strong\u003E &lt;br&gt;\nERD can also be downloaded for interactive view from \u003Ca href=\"https://formula1-dbt-cloud-python-demo.s3.amazonaws.com/Formula1_ERD.svg\"\u003ES3\u003C/a\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/architecture-use-case/Formula1_ERD.svg\" alt=\"assets/architecture-use-case/Formula1_ERD.svg\"\u003E\u003C/p\u003E\n","\u003Cp\u003EHere's a visual for the data pipeline that we'll be building using dbt!\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/architecture-use-case/project_DAG.png\" alt=\"project_DAG\"\u003E\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EGetting started with Snowflake\u003C/h2\u003E\n","\u003Ch3\u003ESetup Snowflake trial and email alias\u003C/h3\u003E\n","\u003Cp\u003EIn this section we&rsquo;re going to sign up for a Snowflake trial account and enable Anaconda-provided Python packages.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://signup.snowflake.com/?utm_source=snowflake-devrel&amp;utm_medium=developer-guides&amp;utm_cta=developer-guides\"\u003ESign up for a Snowflake Trial Account using this form\u003C/a\u003E. Ensure that your account is set up using \u003Cstrong\u003EAWS\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAfter creating your account and verifying it from your sign-up email, Snowflake will direct you back to the UI called Snowsight.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ETo ensure we are working with a clean slate and create a fresh dbt Cloud instance when launching partner connect we will be using email aliasing. What this will look like is &lt;your_email&gt;+&lt;alias_addition&gt;@&lt;your_domain&gt;.com.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENavigate to your left panel menu \u003Cstrong\u003E&or;\u003C/strong\u003E and select \u003Cstrong\u003EProfile\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/1-snowflake_account_profile_menu.png\" alt=\"assets/configure-snowflake/alias-account-email/1-snowflake_account_profile_menu.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EYou will see your unaliased email you used to sign up for your snowflake trial (screenshot is redacted for privacy).\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/2-unaliased_email_profile.png\" alt=\"assets/configure-snowflake/alias-account-email/2-unaliased_email_profile.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EEdit the email field to include the alias using the notation &lt;your_email&gt;+dbtsnowpark@&lt;your_domain&gt;.com. Ensure you \u003Cstrong\u003ESave\u003C/strong\u003E your updated aliased email.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/3-alias_email_update_profile_save.png\" alt=\"assets/configure-snowflake/alias-account-email/3-alias_email_update_profile_save.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EThis should automatically send a re-verification email. In your email simply click the email link to verify your new aliased email, and then you're good to go. If for any reason you did the email was not generated you can navigate back to your \u003Cstrong\u003EProfile\u003C/strong\u003E and click the link to manually \u003Cstrong\u003EResend verification email\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/4-manually_resend_verification_email.png\" alt=\"assets/configure-snowflake/alias-account-email/4-manually_resend_verification_email.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EYour verification email will look like the image below. Select \u003Cstrong\u003EValidate your email\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/5-verification_email.png\" alt=\"assets/configure-snowflake/alias-account-email/5-verification_email.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAfter you validate your email your screen should look as follows:\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/6-verification_confirmation_page.png\" alt=\"assets/configure-snowflake/alias-account-email/6-verification_confirmation_page.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ERe-login or refresh your browser window.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003ETo recap, we created this email alias to ensure that later when we launch Partner Connect to spin up a dbt Cloud account that there are no previously existing dbt Cloud accounts and projects that cause issues and complications in setup.\u003C/p\u003E\n","\u003Ch3\u003EEnable Anaconda Python packages and open new SQL worksheet\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EEnsure you are still logged in as the ACCOUNTADMIN.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/enable-anaconda/2-new-snowflake-account.png\" alt=\"new_snowflake_account\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENavigate to \u003Cstrong\u003EAdmin &gt; Billing &amp; Terms\u003C/strong\u003E. Click \u003Cstrong\u003EEnable &gt; Acknowledge &amp; Continue\u003C/strong\u003E to enable Anaconda Python packages to run in Snowflake.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/enable-anaconda/4-enable-anaconda.jpeg\" alt=\"enable-anaconda\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/enable-anaconda/3-accept-anaconda-terms.jpeg\" alt=\"accept-anaconda-terms\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFinally, navigate back to \u003Cstrong\u003EWorksheets\u003C/strong\u003E to create a new SQL Worksheet by selecting \u003Cstrong\u003E+\u003C/strong\u003E then \u003Cstrong\u003ESQL Worksheet\u003C/strong\u003E in the upper right corner.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ELoad data into Snowflake\u003C/h2\u003E\n","\u003Cp\u003EWe need to obtain our data source by copying our Formula 1 data into Snowflake tables from a public S3 bucket that dbt Labs hosts.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EYour new Snowflake account has a preconfigured warehouse named \u003Ccode\u003ECOMPUTE_WH\u003C/code\u003E. You can check by going under \u003Cstrong\u003EAdmin &gt; Warehouses\u003C/strong\u003E. If for some reason you don&rsquo;t have this warehouse, we can create a warehouse using the following script:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Ecreate or replace warehouse COMPUTE_WH with warehouse_size=XSMALL\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ERename the SQL worksheet by clicking the worksheet name (this is automatically set to the current timestamp) using the 3 dots \u003Ccode\u003E...\u003C/code\u003E option, then click  \u003Cstrong\u003ERename\u003C/strong\u003E. Rename the file to \u003Ccode\u003Edata setup script\u003C/code\u003E since we will be placing code in this worksheet to ingest the Formula 1 data. Set the context of the worksheet by setting your role as the \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E and warehouse as \u003Cstrong\u003ECOMPUTE_WH\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/1-rename-worksheet-and-select-warehouse.png\" alt=\"rename-worksheet-and-select-warehouse\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ECopy the following code into the main body of the Snowflake SQL worksheet. You can also find this setup script under the \u003Ccode\u003Esetup\u003C/code\u003E folder in the \u003Ca href=\"https://raw.githubusercontent.com/dbt-labs/python-snowpark-formula1/main/setup/setup_script_s3_to_snowflake.sql\"\u003EGit repository\u003C/a\u003E. The script is long since it's bringing in all of the data we'll need today! We recommend copying this straight from the github file linked rather than from this workshop UI so you don't miss anything (use Ctrl+A or Cmd+A).\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EGenerally during this lab we'll be explaining and breaking down the queries. We won't be going line by line, but we will point out important information related to our learning objectives!\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E   /*\n   This is our setup script to create a new database for the Formula1 data in Snowflake.\n   We are copying data from a public s3 bucket into snowflake by defining our csv format and snowflake stage. \n   */\n   -- create and define our formula1 database\n   create or replace database formula1;\n   use database formula1; \n   create or replace schema raw; \n   use schema raw; \n\n   --define our file format for reading in the csvs \n   create or replace file format csvformat\n   type = csv\n   field_delimiter =','\n   field_optionally_enclosed_by = '&quot;', \n   skip_header=1; \n\n   --\n   create or replace stage formula1_stage\n   file_format = csvformat \n   url = 's3://formula1-dbt-cloud-python-demo/formula1-kaggle-data/';\n\n   -- load in the 8 tables we need for our demo \n   -- we are first creating the table then copying our data in from s3\n   -- think of this as an empty container or shell that we are then filling\n\n   --CIRCUITS\n   create or replace table formula1.raw.circuits (\n       CIRCUIT_ID NUMBER(38,0),\n       CIRCUIT_REF VARCHAR(16777216),\n       NAME VARCHAR(16777216),\n       LOCATION VARCHAR(16777216),\n       COUNTRY VARCHAR(16777216),\n       LAT FLOAT,\n       LNG FLOAT,\n       ALT NUMBER(38,0),\n       URL VARCHAR(16777216)\n   );\n   -- copy our data from public s3 bucket into our tables \n   copy into circuits \n   from @formula1_stage/circuits.csv\n   on_error='continue';\n\n   --CONSTRUCTOR RESULTS \n   create or replace table formula1.raw.constructor_results (\n       CONSTRUCTOR_RESULTS_ID NUMBER(38,0),\n       RACE_ID NUMBER(38,0),\n       CONSTRUCTOR_ID NUMBER(38,0),\n       POINTS NUMBER(38,0),\n       STATUS VARCHAR(16777216)\n   );\n   copy into constructor_results\n   from @formula1_stage/constructor_results.csv\n   on_error='continue';\n\n   --CONSTRUCTOR STANDINGS\n   create or replace table formula1.raw.constructor_standings (\n       CONSTRUCTOR_STANDINGS_ID NUMBER(38,0),\n       RACE_ID NUMBER(38,0),\n       CONSTRUCTOR_ID NUMBER(38,0),\n       POINTS NUMBER(38,0),\n       POSITION FLOAT,\n       POSITION_TEXT VARCHAR(16777216),\n       WINS NUMBER(38,0)\n   );\n   copy into constructor_standings\n   from @formula1_stage/constructor_standings.csv\n   on_error='continue';\n\n   --CONSTRUCTORS\n   create or replace table formula1.raw.constructors (\n       CONSTRUCTOR_ID NUMBER(38,0),\n       CONSTRUCTOR_REF VARCHAR(16777216),\n       NAME VARCHAR(16777216),\n       NATIONALITY VARCHAR(16777216),\n       URL VARCHAR(16777216)\n   );\n   copy into constructors \n   from @formula1_stage/constructors.csv\n   on_error='continue';\n\n   --DRIVER STANDINGS\n   create or replace table formula1.raw.driver_standings (\n       DRIVER_STANDINGS_ID NUMBER(38,0),\n       RACE_ID NUMBER(38,0),\n       DRIVER_ID NUMBER(38,0),\n       POINTS NUMBER(38,0),\n       POSITION FLOAT,\n       POSITION_TEXT VARCHAR(16777216),\n       WINS NUMBER(38,0)\n\n   );\n   copy into driver_standings \n   from @formula1_stage/driver_standings.csv\n   on_error='continue';\n\n   --DRIVERS\n   create or replace table formula1.raw.drivers (\n       DRIVER_ID NUMBER(38,0),\n       DRIVER_REF VARCHAR(16777216),\n       NUMBER VARCHAR(16777216),\n       CODE VARCHAR(16777216),\n       FORENAME VARCHAR(16777216),\n       SURNAME VARCHAR(16777216),\n       DOB DATE,\n       NATIONALITY VARCHAR(16777216),\n       URL VARCHAR(16777216)\n   );\n   copy into drivers \n   from @formula1_stage/drivers.csv\n   on_error='continue';\n\n   --LAP TIMES\n   create or replace table formula1.raw.lap_times (\n       RACE_ID NUMBER(38,0),\n       DRIVER_ID NUMBER(38,0),\n       LAP NUMBER(38,0),\n       POSITION FLOAT,\n       TIME VARCHAR(16777216),\n       MILLISECONDS NUMBER(38,0)\n   );\n   copy into lap_times \n   from @formula1_stage/lap_times.csv\n   on_error='continue';\n\n   --PIT STOPS \n   create or replace table formula1.raw.pit_stops (\n       RACE_ID NUMBER(38,0),\n       DRIVER_ID NUMBER(38,0),\n       STOP NUMBER(38,0),\n       LAP NUMBER(38,0),\n       TIME VARCHAR(16777216),\n       DURATION VARCHAR(16777216),\n       MILLISECONDS NUMBER(38,0)\n   );\n   copy into pit_stops \n   from @formula1_stage/pit_stops.csv\n   on_error='continue';\n\n   --QUALIFYING\n   create or replace table formula1.raw.qualifying (\n       QUALIFYING_ID NUMBER(38,0),\n       RACE_ID NUMBER(38,0),\n       DRIVER_ID NUMBER(38,0),\n       CONSTRUCTOR_ID NUMBER(38,0),\n       NUMBER NUMBER(38,0),\n       POSITION FLOAT,\n       Q1 VARCHAR(16777216),\n       Q2 VARCHAR(16777216),\n       Q3 VARCHAR(16777216)\n   );\n   copy into qualifying \n   from @formula1_stage/qualifying.csv\n   on_error='continue';\n\n   --RACES \n   create or replace table formula1.raw.races (\n       RACE_ID NUMBER(38,0),\n       YEAR NUMBER(38,0),\n       ROUND NUMBER(38,0),\n       CIRCUIT_ID NUMBER(38,0),\n       NAME VARCHAR(16777216),\n       DATE DATE,\n       TIME VARCHAR(16777216),\n       URL VARCHAR(16777216),\n       FP1_DATE VARCHAR(16777216),\n       FP1_TIME VARCHAR(16777216),\n       FP2_DATE VARCHAR(16777216),\n       FP2_TIME VARCHAR(16777216),\n       FP3_DATE VARCHAR(16777216),\n       FP3_TIME VARCHAR(16777216),\n       QUALI_DATE VARCHAR(16777216),\n       QUALI_TIME VARCHAR(16777216),\n       SPRINT_DATE VARCHAR(16777216),\n       SPRINT_TIME VARCHAR(16777216)\n   );\n   copy into races \n   from @formula1_stage/races.csv\n   on_error='continue';\n\n   --RESULTS\n   create or replace table formula1.raw.results (\n       RESULT_ID NUMBER(38,0),\n       RACE_ID NUMBER(38,0),\n       DRIVER_ID NUMBER(38,0),\n       CONSTRUCTOR_ID NUMBER(38,0),\n       NUMBER NUMBER(38,0),\n       GRID NUMBER(38,0),\n       POSITION FLOAT,\n       POSITION_TEXT VARCHAR(16777216),\n       POSITION_ORDER NUMBER(38,0),\n       POINTS NUMBER(38,0),\n       LAPS NUMBER(38,0),\n       TIME VARCHAR(16777216),\n       MILLISECONDS NUMBER(38,0),\n       FASTEST_LAP NUMBER(38,0),\n       RANK NUMBER(38,0),\n       FASTEST_LAP_TIME VARCHAR(16777216),\n       FASTEST_LAP_SPEED FLOAT,\n       STATUS_ID NUMBER(38,0)\n   );\n   copy into results \n   from @formula1_stage/results.csv\n   on_error='continue';\n\n   --SEASONS\n   create or replace table formula1.raw.seasons (\n       YEAR NUMBER(38,0),\n       URL VARCHAR(16777216)\n   );\n   copy into seasons \n   from @formula1_stage/seasons.csv\n   on_error='continue';\n\n   --SPRINT RESULTS\n   create or replace table formula1.raw.sprint_results (\n       RESULT_ID NUMBER(38,0),\n       RACE_ID NUMBER(38,0),\n       DRIVER_ID NUMBER(38,0),\n       CONSTRUCTOR_ID NUMBER(38,0),\n       NUMBER NUMBER(38,0),\n       GRID NUMBER(38,0),\n       POSITION FLOAT,\n       POSITION_TEXT VARCHAR(16777216),\n       POSITION_ORDER NUMBER(38,0),\n       POINTS NUMBER(38,0), \n       LAPS NUMBER(38,0),\n       TIME VARCHAR(16777216),\n       MILLISECONDS NUMBER(38,0),\n       FASTEST_LAP VARCHAR(16777216),\n       FASTEST_LAP_TIME VARCHAR(16777216),\n       STATUS_ID NUMBER(38,0)\n       );\n   copy into sprint_results \n   from @formula1_stage/sprint_results.csv\n   on_error='continue';\n\n   --STATUS\n   create or replace table formula1.raw.status (\n       STATUS_ID NUMBER(38,0),\n       STATUS VARCHAR(16777216)\n   );\n   copy into status \n   from @formula1_stage/status.csv\n   on_error='continue';\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003EEnsure all the commands are selected before running the query &mdash; an easy way to do this is to use Ctrl-A to highlight all of the code in the worksheet. Select \u003Cstrong\u003Erun\u003C/strong\u003E (blue triangle icon). Notice how the dot next to your \u003Cstrong\u003ECOMPUTE_WH\u003C/strong\u003E turns from gray to green as you run the query. The \u003Cstrong\u003Estatus\u003C/strong\u003E table is the final table of all 14 tables loaded in.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/2-load-data-from-s3.png\" alt=\"load-data-from-s3\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ELet&rsquo;s unpack that pretty long query we ran into component parts. We ran this query to load in our 14 Formula 1 tables from a public S3 bucket. To do this, we:\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003ECreated a new database called \u003Ccode\u003Eformula1\u003C/code\u003E and a schema called \u003Ccode\u003Eraw\u003C/code\u003E to place our raw (untransformed) data into.\u003C/li\u003E\u003Cli\u003ECreated a stage to locate our data we are going to load in. Snowflake Stages are locations where data files are stored. Stages are used to both load and unload data to and from Snowflake locations. Here we are using an external stage, by referencing an S3 bucket.\u003C/li\u003E\u003Cli\u003ECreated our tables for our data to be copied into. These are empty tables with the column name and data type. Think of this as creating an empty container that the data will then fill into.\u003C/li\u003E\u003Cli\u003EUsed the \u003Ccode\u003Ecopy into\u003C/code\u003E statement for each of our tables. We reference our staged location we created and upon loading errors continue to load in the rest of the data. You should not have data loading errors but if you do, those rows will be skipped and Snowflake will tell you which rows caused errors.\u003C/li\u003E\u003C/ul\u003E\n\u003Col start=\"6\"\u003E\u003Cli\u003E\n","\u003Cp\u003EOnce the script completes, browse to the left navigation menu. Click on \u003Cstrong\u003E...\u003C/strong\u003E button to bring up \u003Cstrong\u003ERefresh\u003C/strong\u003E button. Click \u003Cstrong\u003ERefresh\u003C/strong\u003E and you will see the newly created \u003Ccode\u003EFORMULA1\u003C/code\u003E database show up. Expand the database and explore the different tables you just created and loaded data into in the RAW schema.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/3a-refresh-database-objects.png\" alt=\"create-new-worksheet-to-query-data\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENow let's take a look at some of our cool Formula 1 data we just loaded up!\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003ECreate a SQL worksheet by selecting the \u003Cstrong\u003E+\u003C/strong\u003E then \u003Cstrong\u003ESQL Worksheet\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/3b-create-new-worksheet-to-query-data.png\" alt=\"create-new-worksheet-to-query-data\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENavigate to \u003Cstrong\u003EDatabase &gt; Formula1 &gt; RAW &gt; Tables\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EQuery the data using the following code. There are only 77 rows in the circuits table, so we don&rsquo;t need to worry about limiting the amount of data we query.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Eselect * from formula1.raw.circuits\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ERun the query. From here on out, we&rsquo;ll use the keyboard shortcuts Command-Enter or Control-Enter to run queries and won&rsquo;t explicitly call out this step.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EReview the query results, you should see information about Formula 1 circuits, starting with Albert Park in Australia!\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EEnsure you have all 14 tables starting with \u003Ccode\u003ECIRCUITS\u003C/code\u003E and ending with \u003Ccode\u003ESTATUS\u003C/code\u003E. Now we are ready to connect into dbt Cloud!\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/4-query-circuits-data.png\" alt=\"query-circuits-data\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EWe're ready to setup our dbt account!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ELaunching dbt cloud through partner connect\u003C/h2\u003E\n","\u003Cp\u003EWe are going to be using \u003Ca href=\"https://docs.snowflake.com/en/user-guide/ecosystem-partner-connect.html\"\u003ESnowflake Partner Connect\u003C/a\u003E to set up a dbt Cloud account. Using this method will allow you to spin up a fully fledged dbt account with your \u003Ca href=\"https://docs.getdbt.com/docs/cloud/connect-data-platform/connect-snowflake\"\u003ESnowflake connection\u003C/a\u003E and environments already established.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003ENavigate out of your SQL worksheet back by selecting \u003Cstrong\u003Ehome\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EIn Snowsight, confirm that you are using the \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E role.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EConfirm that your email address contains an email alias.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENavigate to the \u003Cstrong\u003EAdmin\u003C/strong\u003E \u003Cstrong\u003E&gt; Partner Connect\u003C/strong\u003E. Find \u003Cstrong\u003Edbt\u003C/strong\u003E either by using the search bar or navigating the \u003Cstrong\u003EData Integration\u003C/strong\u003E. Select the \u003Cstrong\u003Edbt\u003C/strong\u003E tile.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/1-open-partner-connect.png\" alt=\"assets/launching-dbt-cloud-through-partner-connect/1-open-partner-connect.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EYou should now see a new window that says \u003Cstrong\u003EConnect to dbt\u003C/strong\u003E. Select \u003Cstrong\u003EOptional Grant\u003C/strong\u003E and add the \u003Ccode\u003EFORMULA1\u003C/code\u003E database. This will grant access for your new dbt user role to the FORMULA1 database.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/2-partner-connect-optional-grant.png\" alt=\"assets/launching-dbt-cloud-through-partner-connect/2-partner-connect-optional-grant.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EEnsure the \u003Ccode\u003EFORMULA1\u003C/code\u003E is present in your optional grant before clicking \u003Cstrong\u003EConnect\u003C/strong\u003E.&nbsp; This will create a dedicated dbt user, database, warehouse, and role for your dbt Cloud trial.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/3a-connect-to-dbt.png\" alt=\"assets/launching-dbt-cloud-through-partner-connect/3a-connect-to-dbt.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EIf you forgot to add the optional grant to the Formula1 database in the previous screenshot, please run these commands:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E\ngrant usage on database FORMULA1 to role PC_DBT_ROLE;\ngrant usage on schema FORMULA1.RAW to role PC_DBT_ROLE;\ngrant select on all tables in schema FORMULA1.RAW to role PC_DBT_ROLE;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"6\"\u003E\u003Cli\u003E\n","\u003Cp\u003EWhen you see the \u003Cstrong\u003EYour partner account has been created\u003C/strong\u003E window, click \u003Cstrong\u003EActivate\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/3b-activate-partner-connect.png\" alt=\"assets/launching-dbt-cloud-through-partner-connect/3b-activate-partner-connect.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EYou should be redirected to a dbt Cloud registration page. Fill out the form using whatever account name you'd like. Make sure to save the password somewhere for login in the future.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/4-dbt-cloud-sign-up.png\" alt=\"assets/launching-dbt-cloud-through-partner-connect/4-dbt-cloud-sign-up.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect \u003Cstrong\u003EComplete Registration\u003C/strong\u003E. You should now be redirected to your dbt Cloud account, complete with a connection to your Snowflake account, a deployment and a development environment, and a sample job.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EInstead of building an entire version controlled data project from scratch, we'll be \u003Cstrong\u003Eforking and connecting to an existing workshop github repository\u003C/strong\u003E in the next step. dbt Cloud's git integration creates easy to use git guardrails. You won't need to know much Git for this workshop. In the future, if you&rsquo;re developing your own proof of value project from scratch, \u003Ca href=\"https://docs.getdbt.com/docs/collaborate/git/managed-repository\"\u003Efeel free to use dbt's managed  repository\u003C/a\u003E that is spun up during partner connect.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EForking repository into dbt Cloud\u003C/h2\u003E\n","\u003Cp\u003ETo keep the focus on dbt python and deployment today, we only want to build a subset of models that would be in an entire data project. To achieve this we need to fork an existing repository into our personal github, copy our forked repo name into dbt cloud, and add the dbt deploy key to our github account. Viola! There will be some back and forth between dbt cloud and GitHub as part of this process, so keep your tabs open, and let's get the setup out of the way!\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EOpen a new browser tab and navigate to our demo repo by \u003Ca href=\"https://github.com/dbt-labs/dbt-python-hands-on-lab-snowpark\"\u003Eclicking here\u003C/a\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFork\u003C/strong\u003E your own copy of the lab repo.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/5_fork_exisiting_formula1_repo.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/5_fork_exisiting_formula1_repo.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAdd a description if you'd like such as: &quot;learning about dbt Cloud is cool&quot; and \u003Cstrong\u003ECreate fork\u003C/strong\u003E.\u003Cbr\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/6_create_new_fork.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/6_create_new_fork.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect the \u003Cstrong\u003ECode\u003C/strong\u003E button. Choose the SSH option and use the \u003Cstrong\u003Ecopy\u003C/strong\u003E button shortcut for our repo. We'll be using this copied path in step 11 in this section.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/7_copy_repo_ssh_github.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/7_copy_repo_ssh_github.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EHead back over to your dbt Cloud browser tab so we can connect our new forked repository into our dbt Cloud project.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EWe'll need to delete the existing connection to the managed repository spun up during Partner Connect before we input our new one. To do this navigate to \u003Cstrong\u003ESettings &gt; Account Settings &gt; Partner Connect Trial\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EThis will open the \u003Cstrong\u003EProject Details\u003C/strong\u003E. Navigate to \u003Cstrong\u003ERepository\u003C/strong\u003E and click the existing managed repository GitHub connection setup during partner connect.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/1-select-partner-connect-repo.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/1-select-partner-connect-repo.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EIn the \u003Cstrong\u003ERepository Details\u003C/strong\u003E select \u003Cstrong\u003EEdit\u003C/strong\u003E in the lower right corner. The option to \u003Cstrong\u003EDisconnect\u003C/strong\u003E will appear, select it.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/2_repository_details_disconnect.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/2_repository_details_disconnect.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConfirm disconnect\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/3_confirm_disconnect_from_managed_repo.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/3_confirm_disconnect_from_managed_repo.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EWithin your \u003Cstrong\u003EProject Details\u003C/strong\u003E you should have the option to \u003Cstrong\u003EConfigure Repository\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/4_configure_repository.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/4_configure_repository.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAfter deleting our partner connect managed repository, we should see \u003Cstrong\u003ENew Repository\u003C/strong\u003E. Select \u003Cstrong\u003EGit Clone\u003C/strong\u003E. Input the repository by pasting what you copied from GitHub in step 4 above into the \u003Cstrong\u003ERepository\u003C/strong\u003E parameter and clicking \u003Cstrong\u003EImport\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/8_git_clone_copy_repo_from_github.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/8_git_clone_copy_repo_from_github.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EWe can see we successfully made the connection to our forked GitHub repo. \u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/9_update_dbt_cloud_repo_connection_with_forked_repo.png\" alt=\"assets/development-schema-and-forking-repo/forking-repo/9_update_dbt_cloud_repo_connection_with_forked_repo.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EIf you tried to start developing onto of this repo right now, we'd get permissions errors. So we need to give dbt Cloud write access.\u003C/p\u003E\n","\u003Ch2\u003EGiving dbt cloud repo write access using github deploy keys\u003C/h2\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EClick on your git cloned repository link. dbt Cloud generated a deploy key to link the development we do in dbt cloud back to our GitHub repo. \u003Cstrong\u003ECopy\u003C/strong\u003E the deploy key starting with \u003Cstrong\u003Essh-rsa\u003C/strong\u003E followed by a long hash key (full key hidden for privacy).\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/copy_deploy_key_from_dbt_cloud.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/copy_deploy_key_from_dbt_cloud.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EPhew almost there! Navigate \u003Cstrong\u003Eback to GitHub\u003C/strong\u003E again.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EEnsure you're in your forked repo. Navigate to your repo \u003Cstrong\u003ESettings\u003C/strong\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/git_repo_settings.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/git_repo_settings.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EGo to \u003Cstrong\u003EDeploy keys\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/deploy_keys_github.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/deploy_keys_github.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect \u003Cstrong\u003EAdd deploy key\u003C/strong\u003E. \u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/new_deploy_key_button.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/new_deploy_key_button.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EGive your deploy key a title such as \u003Ccode\u003Edbt Cloud python snowpark\u003C/code\u003E. Paste the ssh-rsa deploy key we copied from dbt Cloud into the \u003Cstrong\u003EKey\u003C/strong\u003E box. Be sure to enable \u003Cstrong\u003EAllow write access\u003C/strong\u003E. Finally, \u003Cstrong\u003EAdd key\u003C/strong\u003E. Your deploy key has been created. We won't have to come back to again GitHub until the end of our workshop.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/add_new_deploy_key.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/add_new_deploy_key.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/deploy_key_created.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/deploy_key_created.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EHead back over to dbt cloud. Navigate to \u003Cstrong\u003EDevelop\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/develop_panel_dbt_cloud.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/develop_panel_dbt_cloud.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERun &quot;dbt deps&quot;\u003C/strong\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/run_dep_deps_after_importing_forked_repo.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/run_dep_deps_after_importing_forked_repo.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESince we're bringing in an existing project, your root folder should now say \u003Ccode\u003Edbt-python-hands-on-lab-snowpark\u003C/code\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/file_tree_of_forked_repo.png\" alt=\"assets/development-schema-and-forking-repo/github-deploy-keys/file_tree_of_forked_repo.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EAlas, now that our setup work is complete, time get a look at our production data pipeline code!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EIDE overview and building our dbt project\u003C/h2\u003E\n","\u003Cp\u003Edbt Cloud's IDE will be our development space for this workshop, so let's get familiar with it. Once we've done that we'll run the pipeline we imported from our forked repo.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EThere are a couple of key features to point out about the IDE before we get to work. It is a text editor, an SQL and Python runner, and a CLI with Git version control all baked into one package! This allows you to focus on editing your SQL and Python files, previewing the results with the SQL runner (it even runs Jinja!), and building models at the command line without having to move between different applications. The Git workflow in dbt Cloud allows both Git beginners and experts alike to be able to easily version control all of their work with a couple clicks.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/1-ide-overview.png\" alt=\"assets/ide-overview-building-project/1-ide-overview.png\"\u003E\u003C/li\u003E\u003C/ol\u003E\n&lt;!-- TODO UPDATE IDE SCREENSHOT AND MENTION NEW FEATURES SUCH AS LINTING --&gt;\n\u003Col start=\"2\"\u003E\u003Cli\u003E\n","\u003Cp\u003EIn the file tree, click on the magnifying glass icon next to the File Explorer on the left sidebar and type in \u003Cstrong\u003Ehold_out_dataset_for_prediction.py\u003C/strong\u003E. Click the \u003Cstrong\u003ELineage\u003C/strong\u003E tab. To make it full screen click the viewfinder icon. Play around with the nodes being shown by removing the 2 in front or behind of \u003Ccode\u003E2+hold_out_dataset_for_prediction+2\u003C/code\u003Eand updating the graph.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/2_lineage_viewfinder.png\" alt=\"assets/ide-overview-building-project/2_lineage_viewfinder.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EExplore the DAG for a few minutes to understand everything we've done to our pipeline along the way. This includes: cleaning up and joining our data, machine learning data prep, variable encoding, and splitting the datasets. We'll go more in-depth in next steps about how we brought in raw data and then transformed it, but for now get an overall familiarization.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/3_lineage_fullview.png\" alt=\"assets/ide-overview-building-project/3_lineage_fullview.png\"\u003E You can view the code in each node of the DAG by selecting it and navigating out of the full screen. You can read the code on the scratchpad.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ELet's run the pipeline we imported from our forked repo. Type \u003Ccode\u003Edbt build\u003C/code\u003E into the command line and select \u003Cstrong\u003EEnter\u003C/strong\u003E on your keyboard. When the run bar expands you'll be able to see the results of the run, where you should see the run complete successfully.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/4_dbt_build_initial_pipeline_ml.png\" alt=\"assets/ide-overview-building-project/4_dbt_build_initial_pipeline_ml.png\"\u003E\nTo understand more about what the \u003Ca href=\"https://docs.getdbt.com/reference/commands/build\"\u003Edbt build\u003C/a\u003E syntax is running check out the documentation.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EYou can look at the run results of each model to see the code that dbt compiles and sends to Snowflake for execution. Select the arrow beside a model \u003Cstrong\u003E&gt;\u003C/strong\u003E. Click \u003Cstrong\u003EDetails\u003C/strong\u003E and view the ouput. We can see that dbt automatically generates the DDL statement and is creating our models in our development schema (i.e. \u003Ccode\u003Edbt_hwatson\u003C/code\u003E).\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/5_model_details_ddl.png\" alt=\"assets/ide-overview-building-project/5_model_details_ddl.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENow let's switch over to a new browser tab \u003Cstrong\u003Eon Snowflake\u003C/strong\u003E to confirm that the objects were actually created. Click on the three dots \u003Cstrong\u003E&hellip;\u003C/strong\u003E above your database objects and then \u003Cstrong\u003ERefresh\u003C/strong\u003E. Expand the \u003Cstrong\u003EPC_DBT_DB\u003C/strong\u003E database and you should see your development schema. Select the schema, then \u003Cstrong\u003ETables\u003C/strong\u003E &nbsp;and \u003Cstrong\u003EViews\u003C/strong\u003E. Now you should be able to see many models we created from our forked repo.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/6_confirm_pipeline_build_in_snowflake.png\" alt=\"assets/ide-overview-building-project/6_confirm_pipeline_build_in_snowflake.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EWe did a lot upstream in our forked repo and we'll explore it at a high level of how we did that before moving on to machine learning model training and prediction in dbt cloud.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EUnderstanding our existing pipeline\u003C/h2\u003E\n","\u003Cp\u003EWe brought a good chunk of our data pipeline in through our forked repo to lay a foundation for machine learning.\nIn the next couple steps we are taking time to review how this was done. That way when you have your own dbt project you'll be familiar with the setup! We'll start with the dbt_project.yml, sources, and staging.\u003C/p\u003E\n","\u003Ch3\u003Edbt_project.yml\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect the \u003Ccode\u003Edbt_project.yml\u003C/code\u003E file in the root directory the file explorer to open it. What are we looking at here? Every dbt project requires a \u003Ccode\u003Edbt_project.yml\u003C/code\u003E file &mdash; this is how dbt knows a directory is a dbt project. The \u003Ca href=\"https://docs.getdbt.com/reference/dbt_project.yml\"\u003Edbt_project.yml\u003C/a\u003E file also contains important information that tells dbt how to operate on your project.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EYour code should as follows:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-yaml\"\u003Ename: 'snowflake_python_workshop'\nversion: '1.5.0'\nrequire-dbt-version: '&gt;=1.3.0'\nconfig-version: 2\n\n# This setting configures which &quot;profile&quot; dbt uses for this project.\nprofile: 'default'\n\n# These configurations specify where dbt should look for different types of files.\n# The `source-paths` config, for example, states that models in this project can be\n# found in the &quot;models/&quot; directory. You probably won't need to change these!\nmodel-paths: [&quot;models&quot;]\nanalysis-paths: [&quot;analyses&quot;]\ntest-paths: [&quot;tests&quot;]\nseed-paths: [&quot;seeds&quot;]\nmacro-paths: [&quot;macros&quot;]\nsnapshot-paths: [&quot;snapshots&quot;]\n\ntarget-path: &quot;target&quot;  # directory which will store compiled SQL files\nclean-targets:         # directories to be removed by `dbt clean`\n    - &quot;target&quot;\n    - &quot;dbt_packages&quot;\n\nmodels:\n    snowflake_python_workshop:\n    staging:\n        +docs:\n        node_color: &quot;CadetBlue&quot;\n\n    marts:\n        +materialized: table\n        aggregates:\n        +docs:\n            node_color: &quot;Maroon&quot;\n        +tags: &quot;bi&quot;\n\n    core:\n        +materialized: table\n        +docs:\n        node_color: &quot;#800080&quot;\n\n    ml:\n        +materialized: table\n        prep_encoding_splitting:\n        +docs:\n            node_color: &quot;Indigo&quot;\n        training_and_prediction:\n        +docs:\n            node_color: &quot;Black&quot;\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EThe key configurations to point out in the file with relation to the work that we're going to do are in the \u003Ccode\u003Emodels\u003C/code\u003E section.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003Erequire-dbt-version\u003C/code\u003E &mdash; Tells dbt which version of dbt to use for your project. We are requiring 1.3.0 and any newer version to run python models and node colors.\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Ematerialized\u003C/code\u003E &mdash; Tells dbt how to materialize models when compiling the code before it pushes it down to Snowflake. All models in the \u003Ccode\u003Emarts\u003C/code\u003E folder will be built as tables.\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Etags\u003C/code\u003E &mdash; Applies tags at a directory level to all models. All models in the \u003Ccode\u003Eaggregates\u003C/code\u003E folder will be tagged as \u003Ccode\u003Ebi\u003C/code\u003E (abbreviation for business intelligence).\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.getdbt.com/docs/build/materializations\"\u003EMaterializations\u003C/a\u003E are strategies for persisting dbt models in a warehouse, with \u003Ccode\u003Etables\u003C/code\u003E and \u003Ccode\u003Eviews\u003C/code\u003E being the most commonly utilized types. By default, all dbt models are materialized as views and other materialization types can be configured in the \u003Ccode\u003Edbt_project.yml\u003C/code\u003E file or in a model itself. It&rsquo;s very important to note \u003Cem\u003EPython models can only be materialized as tables or incremental models.\u003C/em\u003E Since all our Python models exist under \u003Ccode\u003Emarts\u003C/code\u003E, the following portion of our \u003Ccode\u003Edbt_project.yml\u003C/code\u003E ensures no errors will occur when we run our Python models. Starting with \u003Ca href=\"https://docs.getdbt.com/guides/migration/versions/upgrading-to-v1.4#updates-to-python-models\"\u003Edbt version 1.4\u003C/a\u003E, Python files will automatically get materialized as tables even if not explicitly specified.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-yaml\"\u003Emarts: &nbsp; &nbsp; \n  +materialized: table\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003ECool, now that dbt knows we have a dbt project we can view the folder structure and data modeling.\u003C/p\u003E\n","\u003Ch3\u003EFolder structure\u003C/h3\u003E\n","\u003Cp\u003Edbt Labs has developed a \u003Ca href=\"https://docs.getdbt.com/guides/best-practices/how-we-structure/1-guide-overview\"\u003Eproject structure guide\u003C/a\u003E that contains a number of recommendations for how to build the folder structure for your project. These apply to our entire project except the machine learning portion - this is still relatively new use case in dbt without the same established best practices.\u003C/p\u003E\n","\u003Cp\u003EDo check out that guide if you want to learn more. Right now we are going to organize our project using the following structure:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003Esources &mdash; This is our Formula 1 dataset and it will be defined in a source YAML file. Nested under our Staging folder.\u003C/li\u003E\u003Cli\u003Estaging models &mdash; These models have a 1:1 with their source table and are for light transformation (renaming columns, recasting data types, etc.).\u003C/li\u003E\u003Cli\u003Ecore models &mdash; Fact and dimension tables available for end user analysis. Since the Formula 1 is pretty clean demo data these look similar to our staging models.\u003C/li\u003E\u003Cli\u003Emarts models &mdash; Here is where we perform our major transformations. It contains the subfolder:\n\u003Cul\u003E\u003Cli\u003Eaggregates\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003Eml :\n\u003Cul\u003E\u003Cli\u003Eprep_encoding_splitting\u003C/li\u003E\u003Cli\u003Etraining_and_prediction (we'll be creating this folder later &mdash; it doesn't exist yet )\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EYour folder structure should look like (make sure to expand some folders if necessary):\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/understanding-our-existing-pipeline/folder_structure.png\" alt=\"assets/understanding-our-existing-pipeline/folder_structure.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003ERemember you can always reference the entire project in \u003Ca href=\"https://github.com/dbt-labs/python-snowpark-formula1\"\u003EGitHub\u003C/a\u003E to view the complete folder and file strucutre.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EData modeling: review sources and staging\u003C/h2\u003E\n","\u003Cp\u003EIn any data project we follow the process of starting with raw data, cleaning and transforming it, and then gaining insights. In this step we'll be showing you how to bring raw data into dbt and create staging models. The steps of setting up sources and staging models were completed when we forked our repo, so we'll only need to preview these files (instead of build them).\u003C/p\u003E\n","\u003Cp\u003ESources allow us to create a dependency between our source database object and our staging models which will help us when we look at \u003Ca href=\"https://docs.getdbt.com/terms/data-lineage\"\u003Edata-lineage\u003C/a\u003E later. Also, if your source changes database or schema, you only have to update it in your \u003Ccode\u003Ef1_sources.yml\u003C/code\u003E file rather than updating all of the models it might be used in.\u003C/p\u003E\n","\u003Cp\u003EStaging models are the base of our project, where we bring all the individual components we're going to use to build our more complex and useful models into the project. Staging models have a 1:1 relationship with their source table and are for light transformation steps such as renaming columns, type casting, basic computations, and categorizing data.\u003C/p\u003E\n","\u003Cp\u003ESince we want to focus on dbt and Python in this workshop, check out our \u003Ca href=\"https://docs.getdbt.com/docs/build/sources\"\u003Esources\u003C/a\u003E and \u003Ca href=\"https://docs.getdbt.com/guides/best-practices/how-we-structure/2-staging\"\u003Estaging\u003C/a\u003E docs if you want to learn more (or take our \u003Ca href=\"https://courses.getdbt.com/collections\"\u003Edbt Fundamentals\u003C/a\u003E course which covers all of our core functionality).\u003C/p\u003E\n","\u003Ch3\u003ECreating Sources\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EOpen the file called \u003Ccode\u003Ef1_sources.yml\u003C/code\u003E with the following file path: \u003Ccode\u003Emodels/staging/formula1/f1_sources.yml\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EYou should see the following code that creates our 14 source tables in our dbt project from Snowflake:\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/data-modeling-sources-and-staging/sources_f1.png\" alt=\"assets/data-modeling-sources-and-staging/sources_f1.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003Edbt makes it really easy to:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003Edeclare \u003Ca href=\"https://docs.getdbt.com/docs/build/sources\"\u003Esources\u003C/a\u003E\u003C/li\u003E\u003Cli\u003Eprovide \u003Ca href=\"https://docs.getdbt.com/docs/build/tests\"\u003Etesting\u003C/a\u003E for data quality and integrity with support for both generic and singular tests\u003C/li\u003E\u003Cli\u003Ecreate \u003Ca href=\"https://docs.getdbt.com/docs/collaborate/documentation\"\u003Edocumentation\u003C/a\u003E using descriptions where you write code\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003ENow that we are connected into our raw data let's do some light transformations in staging.\u003C/p\u003E\n","\u003Ch3\u003EStaging\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003ELet's view two staging models that we'll be using to understand lap time trends through the years.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EOpen \u003Ccode\u003Estg_lap_times\u003C/code\u003E.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Ewith\n\nlap_times as (select * from {{ source('formula1', 'lap_times') }}),\n\nrenamed as (\n    select\n        race_id as race_id,\n        driver_id as driver_id,\n        lap,\n        &quot;POSITION&quot; as driver_position,\n        &quot;TIME&quot; as lap_time_formatted,\n        {{ convert_laptime(&quot;lap_time_formatted&quot;) }} as official_laptime,\n        milliseconds as lap_time_milliseconds\n    from lap_times\n)\nselect\n    {{ dbt_utils.generate_surrogate_key([&quot;race_id&quot;, &quot;driver_id&quot;, &quot;lap&quot;]) }}\n    as lap_times_id,\n    *\nfrom renamed\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EReview the SQL code. We see renaming columns using the alias in addition to reformatting using a jinja code in our project referencing a macro. At a high level a macro is a reusable piece of code and jinja is the way we can bring that code into our SQL model. Datetimes column formatting is usually tricky and repetitive. By using a macro we introduce a way to systematic format times and reduce redunant code in our Formula 1 project. Select \u003Cstrong\u003E&lt;/&gt; Compile\u003C/strong\u003E once its finished view the \u003Cstrong\u003ECompiled Code tab\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/data-modeling-sources-and-staging/compiled_jinja_lap_times.png\" alt=\"assets/data-modeling-sources-and-staging/compiled_jinja_lap_times.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENow click \u003Cstrong\u003EPreview\u003C/strong\u003E &mdash; look how pretty and human readable our \u003Ccode\u003Eofficial_laptime\u003C/code\u003E column is!\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFeel free to view our project macros under the root folder \u003Ccode\u003Emacros\u003C/code\u003E and look at the code for our convert_laptime macro in the \u003Ccode\u003Econvert_laptim.sql\u003C/code\u003E file.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EWe can see the reusable logic we have for splitting apart different components of our lap times from hours to nanoseconds. If you want to learn more about leveraging macros within dbt SQL, check out our \u003Ca href=\"https://docs.getdbt.com/docs/build/jinja-macros\"\u003Emacros documentation\u003C/a\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n&lt;!-- 7. TODO talk about surrogate_key and dbt_utils --&gt;\n","\u003Cp\u003EYou can see for every source table, we have a staging table. Now that we're done staging our data it's time for transformation.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESQL Transformations\u003C/h2\u003E\n","\u003Cp\u003Edbt got it's start in being a powerful tool to enhance the way data transformations are done in SQL. Before we jump into python, let's pay homage to SQL. &lt;br&gt;\nSQL is so performant at data cleaning and transformation, that many data science projects &quot;use SQL for everything you can, then hand off to python&quot; and that's exactly what we're going to do.\u003C/p\u003E\n","\u003Ch3\u003EFact and dimension tables\u003C/h3\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.getdbt.com/terms/dimensional-modeling\"\u003EDimensional modeling\u003C/a\u003E is an important data modeling concept where we break up data into &quot;facts&quot; and &quot;dimensions&quot; to organize and describe data. We won't go into depth here, but think of facts as &quot;skinny and long&quot; transactional tables and dimensions as &quot;wide&quot; referential tables. We'll preview one dimension table and be building one fact table.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003ECreate a new branch so we can build new models (our main branch is protected as read-only in dbt Cloud). Name your branch \u003Ccode\u003Esnowpark-python-workshop\u003C/code\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/create_branch_dbt_cloud.png\" alt=\"assets/sql-transformations/create_branch_dbt_cloud.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/name_branch_dbt_cloud.png\" alt=\"assets/sql-transformations/name_branch_dbt_cloud.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENavigate in the file tree to \u003Cstrong\u003Emodels &gt; marts &gt; core &gt; dim_races\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPreview\u003C/strong\u003E the data. We can see we have the \u003Ccode\u003ERACE_YEAR\u003C/code\u003E in this table. That's important since we want to understand the changes in lap times over years. So we now know \u003Ccode\u003Edim_races\u003C/code\u003E contains the time column we need to make those calculations.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n&lt;!-- TODO SCREENSHOT OF PREVIEWED DATA  --&gt;\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003ECreate a new file within the \u003Cstrong\u003Ecore\u003C/strong\u003E directory \u003Cstrong\u003Ecore &gt; ... &gt; Create file\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/create_fct_file.png\" alt=\"assets/sql-transformations/create_fct_file.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EName the file \u003Ccode\u003Efct_lap_times.sql\u003C/code\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/fct_lap_times.png\" alt=\"assets/sql-transformations/fct_lap_times.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ECopy in the following code and save the file (\u003Cstrong\u003ESave\u003C/strong\u003E or Ctrl+S):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Ewith lap_times as (\n    select \n        {{ dbt_utils.generate_surrogate_key(['race_id', 'driver_id', 'lap']) }} as lap_times_id,\n        race_id                                                                 as race_id,\n        driver_id                                                               as driver_id,\n        lap                                                                     as lap,\n        driver_position                                                         as driver_position,\n        lap_time_formatted                                                      as lap_time_formatted,\n        official_laptime                                                        as official_laptime,\n        lap_time_milliseconds                                                   as lap_time_milliseconds\n    from {{ ref('stg_lap_times') }}\n)\nselect * from lap_times\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EOur \u003Ccode\u003Efct_lap_times\u003C/code\u003E is very similar to our staging file since this is clean demo data. In your real world data project your data will probably be messier and require extra filtering and aggregation prior to becoming a fact table exposed to your business users for utilizing.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EUse the UI \u003Cstrong\u003EBuild\u003C/strong\u003E (buttom with hammer icon) to create the \u003Ccode\u003Efct_lap_times\u003C/code\u003E model.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/dbt_build_fct_lap_times.png\" alt=\"assets/sql-transformations/dbt_build_fct_lap_times.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003ENow we have both \u003Ccode\u003Edim_races\u003C/code\u003E and \u003Ccode\u003Efct_lap_times\u003C/code\u003E separately. Next we'll to join these to create lap trend analysis through the years.\u003C/p\u003E\n","\u003Ch3\u003EMarts tables\u003C/h3\u003E\n","\u003Cp\u003EMarts tables are where everything comes together to create our business-defined entities that have an identity and purpose.\nWe'll be joining our \u003Ccode\u003Edim_races\u003C/code\u003E and \u003Ccode\u003Efct_lap_times\u003C/code\u003E together.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003ECreate a new file under your \u003Cstrong\u003Emarts\u003C/strong\u003E folder called \u003Ccode\u003Emrt_lap_times_years.sql\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ECopy and \u003Cstrong\u003ESave\u003C/strong\u003E the following code:\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Ewith lap_times as (\nselect * from {{ ref('fct_lap_times') }}\n    ),\n    races as (\n    select * from {{ ref('dim_races') }}\n    ),\n    expanded_lap_times_by_year as (\n        select \n            lap_times.race_id, \n            driver_id, \n            race_year,\n            lap,\n            lap_time_milliseconds \n        from lap_times\n        left join races\n            on lap_times.race_id = races.race_id\n        where lap_time_milliseconds is not null \n    )\n    select * from expanded_lap_times_by_year\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003C/ol\u003E\n&lt;!-- TODO ADD SCREENSHOT OF MART  --&gt;\n\u003Col start=\"3\"\u003E\u003Cli\u003EOur dataset contains races going back to 1950, but the measurement of lap times begins in 1996. Here we join our datasets together use our \u003Ccode\u003Ewhere\u003C/code\u003E clause to filter our races prior to 1996, so they have lap times.\u003C/li\u003E\u003Cli\u003EExecute the model using \u003Cstrong\u003EBuild\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EPreview\u003C/strong\u003E your new model. We have race years and lap times together in one joined table so we are ready to create our trend analysis.\u003C/li\u003E\u003Cli\u003EIt's a good time to commit the 2 new models we created in our repository. Click \u003Cstrong\u003ECommit and sync\u003C/strong\u003E and add a commit message.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/commit_and_sync_fct_mrt.png\" alt=\"assets/sql-transformations/commit_and_sync_fct_mrt.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/commit_message_fct_mrt.png\" alt=\"assets/sql-transformations/commit_message_fct_mrt.png\"\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003ENow that we've joined and denormalized our data we're ready to use it in python development.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EPython development in snowflake python worksheets\u003C/h2\u003E\n","\u003Cp\u003EThis step is optional for this quickstart to give a better feel for working with python directly in Snowflake. To see how to implement this in dbt Cloud, you may skip to the next section.\u003C/p\u003E\n","\u003Cp\u003ENow that we've transformed data using SQL let's write our first python code and get insights about lap time trends.\nSnowflake python worksheets are excellent for developing your python code before bringing it into a dbt python model.\nThen once we are settled on the code we want, we can drop it into our dbt project.\u003C/p\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowpark/python/python-worksheets\"\u003EPython worksheets\u003C/a\u003E in Snowflake are a dynamic and interactive environment for executing Python code directly within Snowflake's cloud data platform. They provide a seamless integration between Snowflake's powerful data processing capabilities and the versatility of Python as a programming language. With Python worksheets, users can easily perform data transformations, analytics, and visualization tasks using familiar Python libraries and syntax, all within the Snowflake ecosystem. These worksheets enable data scientists, analysts, and developers to streamline their workflows, explore data in real-time, and derive valuable insights from their Snowflake data.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EHead back over \u003Cstrong\u003Eto Snowflake\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EOpen up a \u003Cstrong\u003EPython Worksheet\u003C/strong\u003E. The boilerplate example code when you first create a Python worksheet is fetching \u003Ccode\u003Einformation_schema.packages\u003C/code\u003E available, filtering on column \u003Ccode\u003Elanguage = &lsquo;python&rsquo;\u003C/code\u003E, and returning that as dataframe, which is what gets shown in result (next step).\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/create_python_worksheet.png\" alt=\"assets/python-development/create_python_worksheet.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/new_python_worksheet_boilerplate_example_code.png\" alt=\"assets/python-development/new_python_worksheet_boilerplate_example_code.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EEnsure you are in your development database and schema (i.e. \u003Cstrong\u003EPC_DBT_DB\u003C/strong\u003E and \u003Cstrong\u003EDBT_HWATSON\u003C/strong\u003E) and run the Python worksheet (Ctrl+A and \u003Cstrong\u003ERun\u003C/strong\u003E).\nThe query results represent the many (about 5,400) packages snowpark for python supports that you can leverage!\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/python_worksheet_db_schema.png\" alt=\"assets/python-development/python_worksheet_db_schema.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/results_of_new_python_worksheet_boilerplate_example_code.png\" alt=\"assets/python-development/results_of_new_python_worksheet_boilerplate_example_code.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EDelete the sample boilerplate code in the new python worksheet. Copy the following code into the python worksheet to get a 5 year moving average of Formula 1 laps:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E# The Snowpark package is required for Python Worksheets. \n# You can add more packages by selecting them using the Packages control and then importing them.\n\nimport snowflake.snowpark as snowpark\nimport pandas as pd \n\ndef main(session: snowpark.Session): \n    # Your code goes here, inside the &quot;main&quot; handler.\n    tableName = 'MRT_LAP_TIMES_YEARS'\n    dataframe = session.table(tableName)\n    lap_times = dataframe.to_pandas()\n\n    # print table\n    print(lap_times)\n\n    # describe the data\n    lap_times[&quot;LAP_TIME_SECONDS&quot;] = lap_times[&quot;LAP_TIME_MILLISECONDS&quot;]/1000\n    lap_time_trends = lap_times.groupby(by=&quot;RACE_YEAR&quot;)[&quot;LAP_TIME_SECONDS&quot;].mean().to_frame()\n    lap_time_trends.reset_index(inplace=True)\n    lap_time_trends[&quot;LAP_MOVING_AVG_5_YEARS&quot;] = lap_time_trends[&quot;LAP_TIME_SECONDS&quot;].rolling(5).mean()\n    lap_time_trends.columns = lap_time_trends.columns.str.upper()\n\n    final_df = session.create_dataframe(lap_time_trends)\n    # Return value will appear in the Results tab.\n    return final_df\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EIf you have workloads that have large memory requirements such as deep learning models consider using \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes\"\u003ESnowpark dataframes\u003C/a\u003E and \u003Ca href=\"https://docs.snowflake.com/en/user-guide/warehouses-snowpark-optimized\"\u003ESnowpark-optimized warehouses\u003C/a\u003E that are specifically engineered to handle these types of compute intensive workloads!\u003C/p\u003E\n\u003Col start=\"5\"\u003E\u003Cli\u003EYour result should have three columns: \u003Ccode\u003Erace_year\u003C/code\u003E, \u003Ccode\u003Elap_time_seconds\u003C/code\u003E, and \u003Ccode\u003Elap_moving_avg_5_years\u003C/code\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/chart_5yr_lap_time_avg.png\" alt=\"assets/python-development/chart_5yr_lap_time_avg.png\"\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EWe were able to quickly calculate a 5 year moving average using python instead of having to sort our data and worry about lead and lag SQL commands. Clicking on the \u003Cstrong\u003EChart\u003C/strong\u003E button next to \u003Cstrong\u003EResults\u003C/strong\u003E, we can see that lap times seem to be trending down with small fluctuations until 2010 and 2011 which coincides with drastic Formula 1 \u003Ca href=\"https://en.wikipedia.org/wiki/History_of_Formula_One_regulations\"\u003Eregulation changes\u003C/a\u003E including cost-cutting measures and in-race refueling bans. So we can safely ascertain lap times are not consistently decreasing.\u003C/p\u003E\n","\u003Cp\u003ENow that we've created this dataframe and lap time trend insight, what do we do when we want to scale it? In the next section we'll be learning how to do this by leveraging python transformations in dbt Cloud.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EPython transformations in dbt Cloud\u003C/h2\u003E\n","\u003Ch3\u003EOur first dbt python model for lap time trends\u003C/h3\u003E\n","\u003Cp\u003ELet's get our lap time trends in our data pipeline so we have this data frame to leverage as new data comes in. The syntax of of a dbt python model is a variation of our development code in the python worksheet so we'll be explaining the code and concepts more.\u003C/p\u003E\n","\u003Cp\u003EYou might be wondering: How does this work? &lt;br&gt;\nOr more specifically: How is dbt able to send a python command over to a Snowflake runtime executing python? &lt;br&gt;\u003C/p\u003E\n","\u003Cp\u003EAt a high level, dbt executes python models as stored procedures in Snowflake, via Snowpark for python.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESnowpark for python and dbt python architecture:\u003C/strong\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/architecture-use-case/Snowpark_for_python_and_dbt_architecture.svg\" alt=\"architecture_diagram\"\u003E\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EOpen your dbt Cloud browser tab.\u003C/li\u003E\u003Cli\u003ECreate a new file under the \u003Cstrong\u003Emodels &gt; marts &gt; aggregates\u003C/strong\u003E directory called \u003Ccode\u003Eagg_lap_times_moving_avg.py\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ECopy the following code in and \u003Cstrong\u003ESave\u003C/strong\u003E the file:\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Eimport pandas as pd\n\ndef model(dbt, session):\n    # dbt configuration\n    dbt.config(packages=[&quot;pandas&quot;])\n\n    # get upstream data\n    lap_times = dbt.ref(&quot;mrt_lap_times_years&quot;).to_pandas()\n\n    # describe the data\n    lap_times[&quot;LAP_TIME_SECONDS&quot;] = lap_times[&quot;LAP_TIME_MILLISECONDS&quot;]/1000\n    lap_time_trends = lap_times.groupby(by=&quot;RACE_YEAR&quot;)[&quot;LAP_TIME_SECONDS&quot;].mean().to_frame()\n    lap_time_trends.reset_index(inplace=True)\n    lap_time_trends[&quot;LAP_MOVING_AVG_5_YEARS&quot;] = lap_time_trends[&quot;LAP_TIME_SECONDS&quot;].rolling(5).mean()\n    lap_time_trends.columns = lap_time_trends.columns.str.upper()\n\n    return lap_time_trends.round(1)\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003ELet&rsquo;s break down what this code is doing:\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003EFirst, we are importing the Python libraries that we are using. This is similar to a dbt \u003Cem\u003Epackage\u003C/em\u003E, but our Python libraries do \u003Cem\u003Enot\u003C/em\u003E persist across the entire project.\u003C/li\u003E\u003Cli\u003EDefining a function called \u003Ccode\u003Emodel\u003C/code\u003E with the parameter \u003Ccode\u003Edbt\u003C/code\u003E and \u003Ccode\u003Esession\u003C/code\u003E. We'll define these more in depth later in this section. You can see that all the data transformation happening is within the body of the \u003Ccode\u003Emodel\u003C/code\u003E function that the \u003Ccode\u003Ereturn\u003C/code\u003E statement is tied to.\u003C/li\u003E\u003Cli\u003EThen, within the context of our dbt model library, we are passing in a configuration of which packages we need using \u003Ccode\u003Edbt.config(packages=[&quot;pandas&quot;])\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003EUse the \u003Ccode\u003E.ref()\u003C/code\u003E function to retrieve the upstream data frame \u003Ccode\u003Emrt_lap_times_years\u003C/code\u003E that we created in our last step using SQL. We cast this to a pandas dataframe (by default it's a Snowpark Dataframe).\u003C/li\u003E\u003Cli\u003EFrom there we are using python to transform our dataframe to give us a rolling average by using \u003Ccode\u003Erolling()\u003C/code\u003E over \u003Ccode\u003ERACE_YEAR\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003EConvert our Python column names to all uppercase using \u003Ccode\u003E.upper()\u003C/code\u003E, so Snowflake recognizes them. \u003Cstrong\u003EThis has been a frequent &quot;gotcha&quot; for folks using dbt python so we call it out here.\u003C/strong\u003E\nWe won&rsquo;t go as in depth for our subsequent scripts, but will continue to explain at a high level what new libraries, functions, and methods are doing.\u003C/li\u003E\u003C/ul\u003E\n\u003Col start=\"5\"\u003E\u003Cli\u003E\n","\u003Cp\u003ECreate the model in our warehouse by clicking \u003Cstrong\u003EBuild\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EWe can't preview Python models directly, so let&rsquo;s open a new file using the \u003Cstrong\u003E+\u003C/strong\u003E button or the Control-N shortcut to create a new scratchpad:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Eselect * from {{ ref('agg_lap_times_moving_avg') }}\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPreview\u003C/strong\u003E the output. It should look the same as our snowflake python worksheet:\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-transformations-dbt-cloud/preview_agg_lap_times_scratchpad.png\" alt=\"assets/python-transformations-dbt-cloud/preview_agg_lap_times_scratchpad.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EWe can see we have the same results from our python worksheet development as we have in our codified dbt python project.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003EThe dbt model, .source(), .ref() and .config() functions\u003C/h3\u003E\n","\u003Cp\u003ELet&rsquo;s take a step back before starting machine learning to both review and go more in-depth at the methods that make running dbt python models possible. If you want to know more outside of this lab&rsquo;s explanation read the documentation on Python models \u003Ca href=\"https://docs.getdbt.com/docs/building-a-dbt-project/building-models/python-models\"\u003Ehere\u003C/a\u003E.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003Edef model(dbt, session). For starters, each Python model lives in a .py file in your models/ folder. It defines a function named \u003Ccode\u003Emodel()\u003C/code\u003E, which takes two parameters:\n\u003Cul\u003E\u003Cli\u003Edbt &mdash; A class compiled by dbt Core, unique to each model, enables you to run your Python code in the context of your dbt project and DAG.\u003C/li\u003E\u003Cli\u003Esession &mdash; A class representing your data platform&rsquo;s connection to the Python backend. The session is needed to read in tables as DataFrames and to write DataFrames back to tables. In PySpark, by convention, the SparkSession is named spark, and available globally. For consistency across platforms, we always pass it into the model function as an explicit argument called session.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EThe \u003Ccode\u003Emodel()\u003C/code\u003E function must return a single DataFrame. On Snowpark (Snowflake), this can be a Snowpark or pandas DataFrame.\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003E.source()\u003C/code\u003E and \u003Ccode\u003E.ref()\u003C/code\u003E functions. Python models participate fully in dbt's directed acyclic graph (DAG) of transformations. If you want to read directly from a raw source table, use \u003Ccode\u003Edbt.source()\u003C/code\u003E. We saw this in our earlier section using SQL with the source function. These functions have the same execution, but with different syntax. Use the \u003Ccode\u003Edbt.ref()\u003C/code\u003E method within a Python model to read data from other models (SQL or Python). These methods return DataFrames pointing to the upstream source, model, seed, or snapshot.\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003E.config()\u003C/code\u003E. Just like SQL models, there are three ways to configure Python models:\n\u003Cul\u003E\u003Cli\u003EIn a dedicated \u003Ccode\u003E.yml\u003C/code\u003E file, within the \u003Ccode\u003Emodels/\u003C/code\u003E directory\u003C/li\u003E\u003Cli\u003EWithin the model's \u003Ccode\u003E.py\u003C/code\u003E file, using the \u003Ccode\u003Edbt.config()\u003C/code\u003E method\u003C/li\u003E\u003Cli\u003ECalling the \u003Ccode\u003Edbt.config()\u003C/code\u003E method will set configurations for your model within your \u003Ccode\u003E.py\u003C/code\u003E file, similar to the \u003Ccode\u003E{{ config() }} macro\u003C/code\u003E in \u003Ccode\u003E.sql\u003C/code\u003E model files. There's a limit to how complex you can get with the \u003Ccode\u003Edbt.config()\u003C/code\u003E method. It accepts only literal values (strings, booleans, and numeric types). Passing another function or a more complex data structure is not possible. The reason is that dbt statically analyzes the arguments to \u003Ccode\u003E.config()\u003C/code\u003E while parsing your model without executing your Python code. If you need to set a more complex configuration, we recommend you define it using the config property in a \u003Ca href=\"https://docs.getdbt.com/reference/resource-properties/config\"\u003EYAML file\u003C/a\u003E. Learn more about configurations \u003Ca href=\"https://docs.getdbt.com/reference/model-configs\"\u003Ehere\u003C/a\u003E.\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Edef model(dbt, session):\n\n# setting configuration\ndbt.config(materialized=&quot;table&quot;)\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003Col start=\"9\"\u003E\u003Cli\u003E\u003Cstrong\u003ECommit and sync\u003C/strong\u003E so our project contains our \u003Ccode\u003Eagg_lap_times_moving_avg.py\u003C/code\u003E model, add a commit message and \u003Cstrong\u003ECommit changes\u003C/strong\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003ENow that we understand how to create python transformations we can use them to prepare train machine learning models and generate predictions!\u003C/p\u003E\n","\u003Ch2\u003EMachine Learning: training and prediction\u003C/h2\u003E\n","\u003Cp\u003EIn upstream parts of our data lineage we had dedicated steps and data models to cleaning, encoding, and splitting out the data into training and testing datasets. We do these steps to ensure:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EWe have features for prediction and the predictions aren't erroneous (we filtered our drivers that weren't active drivers present at 2020) &mdash; review \u003Ccode\u003Eml_data_prep.py\u003C/code\u003E\u003C/li\u003E\u003Cli\u003ERepresenting (encoding) non-numerical data such as categorical and text variables as numbers &mdash; review \u003Ccode\u003Ecovariate_encoding.py\u003C/code\u003E\u003C/li\u003E\u003Cli\u003ESplitting our data into a training and testing set and a hold out set &mdash; review \u003Ccode\u003Etraining_testing_dataset.py\u003C/code\u003E and \u003Ccode\u003Ehold_out_dataset_for_prediction.py\u003C/code\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThere are 3 areas to break down as we go since we are working at the intersection all within one model file:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EMachine Learning\u003C/li\u003E\u003Cli\u003ESnowflake and Snowpark\u003C/li\u003E\u003Cli\u003Edbt Python models\u003C/li\u003E\u003C/ol\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch3\u003ETraining and saving a machine learning model\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EProject organization remains key, under the \u003Ccode\u003Eml\u003C/code\u003E folder make a new subfolder called \u003Ccode\u003Etraining_and_prediction\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENow create a new file called \u003Ccode\u003Etrain_model_to_predict_position.py\u003C/code\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/create_train_model_file.png\" alt=\"assets/machine-learning-training-prediction/create_train_model_file.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ECopy and save the following code (make sure copy all the way to the right). You can also copy it from our demo repo by \u003Ca href=\"https://raw.githubusercontent.com/dbt-labs/python-snowpark-formula1/main/models/ml/training_and_prediction/train_model_to_predict_position.py\"\u003Eclicking on this link\u003C/a\u003E and using Ctrl/Cmd+A.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Eimport snowflake.snowpark.functions as F\nfrom sklearn.model_selection import train_test_split\nimport pandas as pd\nfrom sklearn.metrics import confusion_matrix, balanced_accuracy_score\nimport io\nfrom sklearn.linear_model import LogisticRegression\nfrom joblib import dump, load\nimport joblib\nimport logging\nimport sys\nfrom joblib import dump, load\n\nlogger = logging.getLogger(&quot;mylog&quot;)\n\ndef save_file(session, model, path, dest_filename):\n    input_stream = io.BytesIO()\n    joblib.dump(model, input_stream)\n    session._conn.upload_stream(input_stream, path, dest_filename)\n    return &quot;successfully created file: &quot; + path\n\ndef model(dbt, session):\n    dbt.config(\n        packages = ['numpy','scikit-learn','pandas','numpy','joblib','cachetools'],\n        materialized = &quot;table&quot;,\n        tags = &quot;train&quot;\n    )\n    # Create a stage in Snowflake to save our model file\n    session.sql('create or replace stage MODELSTAGE').collect()\n\n    #session._use_scoped_temp_objects = False\n    version = &quot;1.0&quot;\n    logger.info('Model training version: ' + version)\n\n    # read in our training and testing upstream dataset\n    test_train_df = dbt.ref(&quot;training_testing_dataset&quot;)\n\n    #  cast snowpark df to pandas df\n    test_train_pd_df = test_train_df.to_pandas()\n    target_col = &quot;POSITION_LABEL&quot;\n\n    # split out covariate predictors, x, from our target column position_label, y.\n    split_X = test_train_pd_df.drop([target_col], axis=1)\n    split_y = test_train_pd_df[target_col]\n\n    # Split out our training and test data into proportions\n    X_train, X_test, y_train, y_test  = train_test_split(split_X, split_y, train_size=0.7, random_state=42)\n    train = [X_train, y_train]\n    test = [X_test, y_test]\n        # now we are only training our one model to deploy\n    # we are keeping the focus on the workflows and not algorithms for this lab!\n    model = LogisticRegression()\n\n    # fit the preprocessing pipeline and the model together \n    model.fit(X_train, y_train)   \n    y_pred = model.predict_proba(X_test)[:,1]\n    predictions = [round(value) for value in y_pred]\n    balanced_accuracy =  balanced_accuracy_score(y_test, predictions)\n\n    # Save the model to a stage\n    save_file(session, model, &quot;@MODELSTAGE/driver_position_&quot;+version, &quot;driver_position_&quot;+version+&quot;.joblib&quot; )\n    logger.info('Model artifact:' + &quot;@MODELSTAGE/driver_position_&quot;+version+&quot;.joblib&quot;)\n\n    # Take our pandas training and testing dataframes and put them back into snowpark dataframes\n    snowpark_train_df = session.write_pandas(pd.concat(train, axis=1, join='inner'), &quot;train_table&quot;, auto_create_table=True, create_temp_table=True)\n    snowpark_test_df = session.write_pandas(pd.concat(test, axis=1, join='inner'), &quot;test_table&quot;, auto_create_table=True, create_temp_table=True)\n\n    # Union our training and testing data together and add a column indicating train vs test rows\n    return  snowpark_train_df.with_column(&quot;DATASET_TYPE&quot;, F.lit(&quot;train&quot;)).union(snowpark_test_df.with_column(&quot;DATASET_TYPE&quot;, F.lit(&quot;test&quot;)))\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EUse the UI \u003Cstrong\u003EBuild\u003C/strong\u003E our \u003Ccode\u003Etrain_model_to_predict_position\u003C/code\u003E model.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EBreaking down our Python script:\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003EWe&rsquo;re importing some helpful libraries.\n\u003Cul\u003E\u003Cli\u003EDefining a function called \u003Ccode\u003Esave_file()\u003C/code\u003E that takes four parameters: \u003Ccode\u003Esession\u003C/code\u003E, \u003Ccode\u003Emodel\u003C/code\u003E, \u003Ccode\u003Epath\u003C/code\u003E and \u003Ccode\u003Edest_filename\u003C/code\u003E that will save our logistic regression model file.\n\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003Esession\u003C/code\u003E &mdash; an object representing a connection to Snowflake.\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Emodel\u003C/code\u003E &mdash; when models are trained they are saved in memory, we will be using the model name to save our in-memory model into a joblib file to retrieve to call new predictions later.\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Epath\u003C/code\u003E &mdash; a string representing the directory or bucket location where the file should be saved.\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Edest_filename\u003C/code\u003E &mdash; a string representing the desired name of the file.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003ECreating our dbt model\n\u003Cul\u003E\u003Cli\u003EWithin this model we are creating a stage called \u003Ccode\u003EMODELSTAGE\u003C/code\u003E to place our logistic regression \u003Ccode\u003Ejoblib\u003C/code\u003E model file. This is really important since we need a place to keep our model to reuse and want to ensure it's there. When using Snowpark commands, it's common to see the \u003Ccode\u003E.collect()\u003C/code\u003E method to ensure the action is performed. Think of the session as our &ldquo;start&rdquo; and collect as our &ldquo;end&rdquo; when \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes.html\"\u003Eworking with Snowpark\u003C/a\u003E (you can use other ending methods other than collect).\u003C/li\u003E\u003Cli\u003EUsing \u003Ccode\u003E.ref()\u003C/code\u003E to connect into our \u003Ccode\u003Etraining_and_test_dataset\u003C/code\u003E model.\u003C/li\u003E\u003Cli\u003ENow we see the machine learning part of our analysis:\n\u003Cul\u003E\u003Cli\u003ECreate new dataframes for our prediction features from our target variable \u003Ccode\u003Eposition_label\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ESplit our dataset into 70% training (and 30% testing), train_size=0.7 with a \u003Ccode\u003Erandom_state\u003C/code\u003E specified to have repeatable results.\u003C/li\u003E\u003Cli\u003ESpecify our model is a logistic regression.\u003C/li\u003E\u003Cli\u003EFit our model. In a logistic regression this means finding the coefficients that will give the least classification error.\u003C/li\u003E\u003Cli\u003ERound our predictions to the nearest integer since logistic regression creates a probability between for each class and calculate a balanced accuracy to account for imbalances in the target variable.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003ERight now our model is only in memory, so we need to use our nifty function \u003Ccode\u003Esave_file\u003C/code\u003E to save our model file to our Snowflake stage. We save our model as a joblib file so Snowpark can easily call this model object back to create predictions. We really don&rsquo;t need to know much else as a data practitioner unless we want to. It&rsquo;s worth noting that joblib files aren&rsquo;t able to be queried directly by SQL. To do this, we would need to transform the joblib file to an SQL queryable format such as JSON or CSV (out of scope for this workshop).\u003C/li\u003E\u003Cli\u003EFinally we want to return our dataframe, but create a new column indicating what rows were used for training and those for training.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003Col start=\"6\"\u003E\u003Cli\u003E\n","\u003Cp\u003EViewing our output of this model:\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/1-preview-train-test-position.png\" alt=\"assets/machine-learning-training-prediction/1-preview-train-test-position.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ELet&rsquo;s pop back over to Snowflake. To check that our logistic regression model has been stored in our \u003Ccode\u003EMODELSTAGE\u003C/code\u003E open a \u003Cstrong\u003ESQL Worksheet\u003C/strong\u003E and use the query below to list objects in your modelstage. Make sure you are in the correct database and development schema to view your stage (this should be \u003Ccode\u003EPC_DBT_DB\u003C/code\u003E and your dev schema - for example \u003Ccode\u003Edbt_hwatson\u003C/code\u003E).\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Elist @modelstage\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/2-list-snowflake-stage.png\" alt=\"assets/machine-learning-training-prediction/2-list-snowflake-stage.png\"\u003E\u003C/p\u003E\n\u003Col start=\"8\"\u003E\u003Cli\u003ETo investigate the commands run as part of \u003Ccode\u003Etrain_model_to_predict_position.py\u003C/code\u003E script, navigate to Snowflake query history to view it \u003Cstrong\u003EHome button &gt; Activity &gt; Query History\u003C/strong\u003E. We can view the portions of query that we wrote such as \u003Ccode\u003Ecreate or replace stage MODELSTAGE\u003C/code\u003E, but we also see additional queries that Snowflake uses to interpret python code.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/3-view-snowflake-query-history.png\" alt=\"assets/machine-learning-training-prediction/3-view-snowflake-query-history.png\"\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003ELet's use our new trained model to create predictions!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch3\u003EPredicting on new data\u003C/h3\u003E\n","\u003Cp\u003EIt's time to use that 2020 data we held out to make predictions on!\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003ECreate a new file under \u003Ccode\u003Eml/training_and_prediction\u003C/code\u003E called \u003Ccode\u003Eapply_prediction_to_position.py\u003C/code\u003E and copy and save the following code (You can also copy it from our demo repo by \u003Ca href=\"https://raw.githubusercontent.com/dbt-labs/python-snowpark-formula1/main/models/ml/training_and_prediction/apply_prediction_to_position.py\"\u003Eclicking on this link\u003C/a\u003E and using Ctrl/Cmd+A.):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Eimport logging\nimport joblib\nimport pandas as pd\nimport os\nfrom snowflake.snowpark import types as T\n\nDB_STAGE = 'MODELSTAGE'\nversion = '1.0'\n# The name of the model file\nmodel_file_path = 'driver_position_'+version\nmodel_file_packaged = 'driver_position_'+version+'.joblib'\n\n# This is a local directory, used for storing the various artifacts locally\nLOCAL_TEMP_DIR = f'/tmp/driver_position'\nDOWNLOAD_DIR = os.path.join(LOCAL_TEMP_DIR, 'download')\nTARGET_MODEL_DIR_PATH = os.path.join(LOCAL_TEMP_DIR, 'ml_model')\nTARGET_LIB_PATH = os.path.join(LOCAL_TEMP_DIR, 'lib')\n\n# The feature columns that were used during model training\n# and that will be used during prediction\nFEATURE_COLS = [\n        &quot;RACE_YEAR&quot;\n        ,&quot;RACE_NAME&quot;\n        ,&quot;GRID&quot;\n        ,&quot;CONSTRUCTOR_NAME&quot;\n        ,&quot;DRIVER&quot;\n        ,&quot;DRIVERS_AGE_YEARS&quot;\n        ,&quot;DRIVER_CONFIDENCE&quot;\n        ,&quot;CONSTRUCTOR_RELAIBLITY&quot;\n        ,&quot;TOTAL_PIT_STOPS_PER_RACE&quot;]\n\ndef register_udf_for_prediction(p_predictor ,p_session ,p_dbt):\n\n    # The prediction udf\n\n    def predict_position(p_df: T.PandasDataFrame[int, int, int, int,\n                                        int, int, int, int, int]) -&gt; T.PandasSeries[int]:\n        # Snowpark currently does not set the column name in the input dataframe\n        # The default col names are like 0,1,2,... Hence we need to reset the column\n        # names to the features that we initially used for training.\n        p_df.columns = [*FEATURE_COLS]\n\n        # Perform prediction. this returns an array object\n        pred_array = p_predictor.predict(p_df)\n        # Convert to series\n        df_predicted = pd.Series(pred_array)\n        return df_predicted\n\n    # The list of packages that will be used by UDF\n    udf_packages = p_dbt.config.get('packages')\n\n    predict_position_udf = p_session.udf.register(\n        predict_position\n        ,name=f'predict_position'\n        ,packages = udf_packages\n    )\n    return predict_position_udf\n\ndef download_models_and_libs_from_stage(p_session):\n    p_session.file.get(f'@{DB_STAGE}/{model_file_path}/{model_file_packaged}', DOWNLOAD_DIR)\n\ndef load_model(p_session):\n    # Load the model and initialize the predictor\n    model_fl_path = os.path.join(DOWNLOAD_DIR, model_file_packaged)\n    predictor = joblib.load(model_fl_path)\n    return predictor\n\n# -------------------------------\ndef model(dbt, session):\n    dbt.config(\n        packages = ['snowflake-snowpark-python' ,'scipy','scikit-learn' ,'pandas' ,'numpy'],\n        materialized = &quot;table&quot;,\n        tags = &quot;predict&quot;\n    )\n    session._use_scoped_temp_objects = False\n    download_models_and_libs_from_stage(session)\n    predictor = load_model(session)\n    predict_position_udf = register_udf_for_prediction(predictor, session ,dbt)\n\n    # Retrieve the data, and perform the prediction\n    hold_out_df = (dbt.ref(&quot;hold_out_dataset_for_prediction&quot;)\n        .select(*FEATURE_COLS)\n    )\n    trained_model_file = dbt.ref(&quot;train_model_to_predict_position&quot;)\n\n    # Perform prediction.\n    new_predictions_df = hold_out_df.withColumn(&quot;position_predicted&quot;\n        ,predict_position_udf(*FEATURE_COLS)\n    )\n\n    return new_predictions_df\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EUse the UI Build our \u003Ccode\u003Eapply_prediction_to_position\u003C/code\u003E model.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECommit and sync\u003C/strong\u003E our changes to keep saving our work as we go using the commit message \u003Ccode\u003Elogistic regression model training and application\u003C/code\u003E before moving on.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/commit_training_and_prediction.png\" alt=\"assets/machine-learning-training-prediction/commit_training_and_prediction.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/commit_message_training_and_prediction.png\" alt=\"assets/machine-learning-training-prediction/commit_message_training_and_prediction.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAt a high level in this script, we are:\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003ERetrieving our staged logistic regression model\u003C/li\u003E\u003Cli\u003ELoading the model in\u003C/li\u003E\u003Cli\u003EPlacing the model within a user defined function (UDF) to call in line predictions on our driver&rsquo;s position\u003C/li\u003E\u003C/ul\u003E\n\u003Col start=\"5\"\u003E\u003Cli\u003EAt a more detailed level:\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003EImport our libraries.\u003C/li\u003E\u003Cli\u003ECreate variables to reference back to the \u003Ccode\u003EMODELSTAGE\u003C/code\u003E we just created and stored our model to.\u003C/li\u003E\u003Cli\u003EThe temporary file paths we created might look intimidating, but all we&rsquo;re doing here is programmatically using an initial file path and adding to it to create the following directories:\n\u003Cul\u003E\u003Cli\u003ELOCAL_TEMP_DIR ➡️ /tmp/driver_position\u003C/li\u003E\u003Cli\u003EDOWNLOAD_DIR ➡️ /tmp/driver_position/download\u003C/li\u003E\u003Cli\u003ETARGET_MODEL_DIR_PATH ➡️ /tmp/driver_position/ml_model\u003C/li\u003E\u003Cli\u003ETARGET_LIB_PATH ➡️ /tmp/driver_position/lib\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EProvide a list of our feature columns that we used for model training and will now be used on new data for prediction.\u003C/li\u003E\u003Cli\u003ENext, we are creating our main function \u003Ccode\u003Eregister_udf_for_prediction(p_predictor ,p_session ,p_dbt):\u003C/code\u003E. This function is used to register a user-defined function (UDF) that performs the machine learning prediction. It takes three parameters: \u003Ccode\u003Ep_predictor\u003C/code\u003E is an instance of the machine learning model, \u003Ccode\u003Ep_session\u003C/code\u003E is an instance of the Snowflake session, and \u003Ccode\u003Ep_dbt\u003C/code\u003E is an instance of the dbt library. The function creates a UDF named \u003Ccode\u003Epredict_position\u003C/code\u003E which takes a pandas dataframe with the input features and returns a pandas series with the predictions.\u003C/li\u003E\u003Cli\u003E⚠️ Pay close attention to the whitespace here. We are using a function within a function for this script.\u003C/li\u003E\u003Cli\u003EWe have 2 simple functions that are programmatically retrieving our file paths to first get our stored model out of our \u003Ccode\u003EMODELSTAGE\u003C/code\u003E and downloaded into the session \u003Ccode\u003Edownload_models_and_libs_from_stage\u003C/code\u003E and then to load the contents of our model in (parameters) in \u003Ccode\u003Eload_model\u003C/code\u003E to use for prediction.\u003C/li\u003E\u003Cli\u003ETake the model we loaded in and call it \u003Ccode\u003Epredictor\u003C/code\u003E and wrap it in a UDF.\u003C/li\u003E\u003Cli\u003EReturn our dataframe with both the features used to predict and the new label.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E🧠 Another way to read this script is from the bottom up. This can help us progressively see what is going into our final dbt model and work backwards to see how the other functions are being referenced.\u003C/p\u003E\n\u003Col start=\"6\"\u003E\u003Cli\u003ELet&rsquo;s take a look at our predicted position alongside our feature variables. Open a new scratchpad and use the following query. I chose to order by the prediction of who would obtain a podium position:\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Eselect * from {{ ref('apply_prediction_to_position') }} order by position_predicted\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/preview_predicted_position.png\" alt=\"assets/machine-learning-training-prediction/preview_predicted_position.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EWe can see that we created predictions in our final dataset for each result.\u003C/p\u003E\n\u003Col start=\"7\"\u003E\u003Cli\u003ERun a fresh \u003Ccode\u003Edbt build\u003C/code\u003E in the command bar to ensure our pipeline is working end to end. This will take a few minutes, (3 minutes and 2.4 seconds to be exact) so it's not a bad time to stretch (we know programmers slouch). This runtime is pretty performant since we're using an X-Smalll warehouse. If you want to speed up the pipeline, you can increase the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/warehouses-overview\"\u003Ewarehouse size\u003C/a\u003E (good for SQL) or use a \u003Ca href=\"https://docs.snowflake.com/en/user-guide/warehouses-snowpark-optimized\"\u003ESnowpark-optimized Warehouses\u003C/a\u003E (good for Python)\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/fresh_dbt_build_full_pipeline.png\" alt=\"assets/machine-learning-training-prediction/fresh_dbt_build_full_pipeline.png\"\u003E\u003C/li\u003E\u003C/ol\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EPipeline Deployment\u003C/h2\u003E\n","\u003Ch3\u003ECommitting all development work\u003C/h3\u003E\n","\u003Cp\u003EBefore we jump into deploying our code, let's have a quick primer on environments. Up to this point, all of the work we've done in the dbt Cloud IDE has been in our development environment, with code committed to a feature branch and the models we've built created in our development schema in Snowflake as defined in our Development environment connection. Doing this work on a feature branch, allows us to separate our code from what other coworkers are building and code that is already deemed production ready. Building models in a development schema in Snowflake allows us to separate the database objects we might still be modifying and testing from the database objects running production dashboards or other downstream dependencies. Together, the combination of a Git branch and Snowflake database objects form our environment.\u003C/p\u003E\n","\u003Cp\u003ENow that we've completed applying prediction, we're ready to deploy our code from our development environment to our production environment and this involves two steps:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EPromoting code from our feature branch to the production branch in our repository.\n\u003Cul\u003E\u003Cli\u003EGenerally, the production branch is going to be named your main branch and there's a review process to go through before merging code to the main branch of a repository. Here we are going to merge without review for ease of this workshop.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EDeploying code to our production environment.\n\u003Cul\u003E\u003Cli\u003EOnce our code is merged to the main branch, we'll need to run dbt in our production environment to build all of our models and run all of our tests. This will allow us to build production-ready objects into our production environment in Snowflake. Luckily for us, the Partner Connect flow has already created our deployment environment and job to facilitate this step.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EBefore getting started, let's make sure that we've committed all of our work to our feature branch. Our working branch,\u003Ccode\u003Esnowpark-python-workshop\u003C/code\u003E, should be clean. If for some reason you do still have work to commit, you'll be able to select the \u003Cstrong\u003ECommit and sync\u003C/strong\u003E, provide a message, and then select \u003Cstrong\u003ECommit changes\u003C/strong\u003E again.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EOnce all of your work is committed, the git workflow button will now appear as \u003Cstrong\u003ECreate pull request\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/create_pull_request_dbt_cloud_button.png\" alt=\"assets/pipeline-deployment/create_pull_request_dbt_cloud_button.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EThis will bring you to your GitHub repo. This will show the commits that encompass all changes made since the last pull request. Since we only added new files we are able to merge into \u003Ccode\u003Emain\u003C/code\u003E without conflicts.  Click \u003Cstrong\u003ECreate pull request\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/review_commits_create_pull_request.png\" alt=\"assets/pipeline-deployment/review_commits_create_pull_request.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n&lt;!-- TODO This could be updated to have only the 3 commits to be a bit cleaner. I had an extra from needing to rename a folder.  --&gt;\n\u003Col start=\"4\"\u003E\u003Cli\u003EThis goes to a \u003Cstrong\u003EOpen a pull request\u003C/strong\u003E page. Usually, when merging in a pull request (PR) we would create descriptions and motivations for the work being completed, validation our models work (like a fresh dbt build), and note changes to exisiting models (we only created new models and didn't alter existing ones). Then typically your teammates will review, comment, and independently test out the code on your branch. dbt has created a \u003Ca href=\"https://docs.getdbt.com/blog/analytics-pull-request-template\"\u003Epull request template\u003C/a\u003E to make PRs as efficient and scalable to your analytics workflow.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EThe template is also located in our root directory under \u003Ccode\u003E.github\u003C/code\u003E in the file \u003Ccode\u003Epull_request_template.md\u003C/code\u003E. When a PR is opened, the template will automatically be pulled in for you to fill out. For the workshop we'll do an abbreviated version of this for example. If you'd like you can just add a quick comment followed by \u003Cstrong\u003EMerge pull request\u003C/strong\u003E since we're doing a workshop in an isolated Snowflake trial account (and won't break anything).\u003C/p\u003E\n","\u003Cp\u003EOur abbreviated PR template written markdown:\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/pr_template_writen_markdown.png\" alt=\"assets/pipeline-deployment/pr_template_writen_markdown.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EPR preview:\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/pr_template_preview.png\" alt=\"assets/pipeline-deployment/pr_template_preview.png\"\u003E\u003C/p\u003E\n\u003Col start=\"5\"\u003E\u003Cli\u003E\n","\u003Cp\u003EOur PR is looking good. Let's \u003Cstrong\u003EMerge pull request\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/merge_pr_github.png\" alt=\"assets/pipeline-deployment/merge_pr_github.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EThen click \u003Cstrong\u003EConfirm merge\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/confirm_merge_github.png\" alt=\"assets/pipeline-deployment/confirm_merge_github.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EIt's best practice to keep your repo clean by deleting your working branch once merged into main. You can always restore it later, for now \u003Cstrong\u003EDelete Branch\u003C/strong\u003E. We're all done in GitHub for today!\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/delete_branch_github.png\" alt=\"assets/pipeline-deployment/delete_branch_github.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EHead back over to your dbt Cloud browser tab. Under \u003Cstrong\u003EVersion Control\u003C/strong\u003E select \u003Cstrong\u003EPull from &quot;main&quot;\u003C/strong\u003E. If you don't see this, refresh your browser tab and it should appear.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/pull_from_main_dbt_cloud.png\" alt=\"assets/pipeline-deployment/pull_from_main_dbt_cloud.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect \u003Cstrong\u003EChange branch\u003C/strong\u003E to your \u003Cstrong\u003Emain\u003C/strong\u003E branch that now appears as (ready-only).\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/change_branch_dbt_cloud.png\" alt=\"assets/pipeline-deployment/change_branch_dbt_cloud.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/change_to_main.png\" alt=\"assets/pipeline-deployment/change_to_main.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/checkout_main_branch.png\" alt=\"assets/pipeline-deployment/checkout_main_branch.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFinally, to bring our changes from our \u003Ccode\u003Emain\u003C/code\u003E branch in GitHub, select \u003Cstrong\u003EPull from remote\u003C/strong\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/pull_from_remote_dbt_cloud.png\" alt=\"assets/pipeline-deployment/pull_from_remote_dbt_cloud.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ENow that all of our development work has been merged to the main branch, we can build our deployment job. Given that our production environment and production job were created automatically for us through Partner Connect, all we need to do here is update some default configurations to meet our needs.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EIn the menu, select \u003Cstrong\u003EDeploy\u003C/strong\u003E \u003Cstrong\u003E&gt; Environments\u003C/strong\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/deploy_environments_ui.png\" alt=\"assets/pipeline-deployment/deploy_environments_ui.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003ESetting your production schema\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EYou should see two environments listed and you'll want to select the \u003Cstrong\u003EDeployment\u003C/strong\u003E environment then \u003Cstrong\u003ESettings\u003C/strong\u003E to modify it.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EBefore making any changes, let's touch on what is defined within this environment. The Snowflake connection shows the credentials that dbt Cloud is using for this environment and in our case they are the same as what was created for us through Partner Connect. Our deployment job will build in our \u003Ccode\u003EPC_DBT_DB\u003C/code\u003E database and use the default Partner Connect role and warehouse to do so. The deployment credentials section also uses the info that was created in our Partner Connect job to create the credential connection. However, it is using the same default schema that we've been using as the schema for our development environment.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ELet's update the schema to create a new schema specifically for our production environment. Click \u003Cstrong\u003EEdit\u003C/strong\u003E to allow you to modify the existing field values. Navigate to \u003Cstrong\u003EDeployment Credentials &gt;\u003C/strong\u003E \u003Cstrong\u003Eschema.\u003C/strong\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EUpdate the schema name to \u003Cstrong\u003Eproduction\u003C/strong\u003E. Remember to select \u003Cstrong\u003ESave\u003C/strong\u003E after you've made the change.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/setting-production-schema/name_production_schema.png\" alt=\"assets/pipeline-deployment/setting-production-schema/name_production_schema.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EBy updating the schema for our production environment to \u003Cstrong\u003Eproduction\u003C/strong\u003E, it ensures that our deployment job for this environment will build our dbt models in the \u003Cstrong\u003Eproduction\u003C/strong\u003E schema within the \u003Ccode\u003EPC_DBT_DB\u003C/code\u003E database as defined in the Snowflake Connection section.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003ECreating multiple jobs\u003C/h3\u003E\n","\u003Cp\u003EIn machine learning you rarely want to retrain your model as often as you want new predictions. Model training is compute intensive and requires person time for development and evaluation, while new predictions can run through an existing model to gain insights about drivers, customers, events, etc. This problem can be tricky, but dbt Cloud makes it easy by: automatically creating dependencies from your code and making setup for environments and jobs simple.\u003C/p\u003E\n","\u003Cp\u003EWith this in mind we're going to have two jobs:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EOne job that initially builds or retrains our machine learning model. This job will run all the models in our project, and was already created through partner connect.\u003C/li\u003E\u003Cli\u003EAnother job that focuses on creating predictions from the existing machine learning model. This job will exclude model training by using syntax to exclude running \u003Ccode\u003Etrain_model_to_predict_position.py\u003C/code\u003E. This second job requires that you have already created a trained model in a previous run and that it is in your MODELSTAGE area.\u003C/li\u003E\u003C/ul\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003ELet's look at over to our production job created by partner connect. Click on the deploy tab again and then select \u003Cstrong\u003EJobs\u003C/strong\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/deploy_jobs_ui.png\" alt=\"assets/pipeline-deployment/creating-multiple-jobs/deploy_jobs_ui.png\"\u003E You should see an existing and preconfigured \u003Cstrong\u003EPartner Connect Trial Job\u003C/strong\u003E. \u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/pc_default_job.png\" alt=\"assets/pipeline-deployment/creating-multiple-jobs/pc_default_job.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESimilar to the environment, click on the job, then select \u003Cstrong\u003ESettings\u003C/strong\u003E to modify it. Let's take a look at the job to understand it before making changes.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/pc_job_settings.png\" alt=\"assets/pipeline-deployment/creating-multiple-jobs/pc_job_settings.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003EThe Environment section is what connects this job with the environment we want it to run in. This job is already defaulted to use the Deployment environment that we just updated and the rest of the settings we can keep as is.\u003C/li\u003E\u003Cli\u003EThe Execution settings section gives us the option to generate docs, run source freshness, and defer to a previous run state. For the purposes of our lab, we're going to keep these settings as is as well and stick with just generating docs.\u003C/li\u003E\u003Cli\u003EThe Commands section is where we specify exactly which commands we want to run during this job. The command \u003Ccode\u003Edbt build\u003C/code\u003E will run and test all the models our in project. We'll keep this as is.\u003C/li\u003E\u003Cli\u003EFinally, we have the Triggers section, where we have a number of different options for scheduling our job. Given that our data isn't updating regularly here and we're running this job manually for now, we're also going to leave this section alone.\u003C/li\u003E\u003C/ul\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003ESo, what are we changing then? The job name and commands!\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EClick \u003Cstrong\u003EEdit\u003C/strong\u003E to allow you to make changes. Then update the name of the job to \u003Cstrong\u003EMachine learning initial model build or retraining\u003C/strong\u003E this may seem like a mouthful, but naming with an entire data team is helpful (or our future selves after not looking at a project for 3 months).\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EGo to \u003Cstrong\u003EExecution Settings &gt; Commands\u003C/strong\u003E. Click \u003Cstrong\u003EAdd Command\u003C/strong\u003E and input \u003Ccode\u003Edbt build\u003C/code\u003E.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/edit_pc_job.png\" alt=\"assets/pipeline-deployment/creating-multiple-jobs/edit_pc_job.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EDelete the existing commands \u003Ccode\u003Edbt seed\u003C/code\u003E, \u003Ccode\u003Edbt run\u003C/code\u003E, and \u003Ccode\u003Edbt test\u003C/code\u003E. Together they make up the functions of \u003Ccode\u003Edbt build\u003C/code\u003E so we are simplifying our code.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/edit_commands.png\" alt=\"assets/pipeline-deployment/creating-multiple-jobs/edit_commands.png\"\u003E\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/delete_commands.png\" alt=\"assets/pipeline-deployment/creating-multiple-jobs/delete_commands.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAfter that's done, DON'T FORGET CLICK \u003Cstrong\u003ESave\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003ENow let's go to run our job. Clicking on the job name in the path at the top of the screen will take you back to the job run history page where you'll be able to click \u003Cstrong\u003ERun\u003C/strong\u003E to kick off the job. In total we produced 106 entities: 14 view models, 67 tests, 24 table models, 1 incremental model.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/run_job.png\" alt=\"assets/pipeline-deployment/creating-multiple-jobs/run_job.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ELet's go over to Snowflake to confirm that everything built as expected in our production schema. Refresh the database objects in your Snowflake account and you should see the production schema now within our default Partner Connect database. If you click into the schema and everything ran successfully, you should be able to see all of the models we developed.\n\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/job_run_output.png\" alt=\"assets/pipeline-deployment/creating-multiple-jobs/job_run_output.png\"\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EGo back to dbt Cloud and navigate to \u003Cstrong\u003EDeploy &gt; Jobs &gt; Create Job\u003C/strong\u003E. Edit the following job settings:\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003ESet the \u003Cstrong\u003EGeneral Settings &gt; Job Name\u003C/strong\u003E to \u003Cstrong\u003EPrediction on data with existing model\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003ESet the \u003Cstrong\u003EExecution Settings &gt; Commands\u003C/strong\u003E to \u003Ccode\u003Edbt build --exclude train_model_to_predict_position\u003C/code\u003E\u003C/li\u003E\u003Cli\u003EWe can keep all other job settings the same\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESave\u003C/strong\u003E your job settings\u003C/li\u003E\u003C/ul\u003E\n\u003Col start=\"7\"\u003E\u003Cli\u003ERun your job using \u003Cstrong\u003ERun Now\u003C/strong\u003E. Remember the only difference between our first job and this job is we are excluding model retraining. So we will have one less model in our outputs. We can confirm this in our run steps.\u003C/li\u003E\u003Cli\u003EOpen the job and go to \u003Cstrong\u003ERun Steps &gt; Invoke\u003C/strong\u003E. In our job details we can confirm one less entity (105 instead of 106).\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EThat wraps all of our hands on the keyboard time for today!\u003C/p\u003E\n","\u003Ch2\u003EConclusion\u003C/h2\u003E\n","\u003Cp\u003EFantastic! You&rsquo;ve finished the workshop! We hope you feel empowered in using both SQL and Python in your dbt Cloud workflows with Snowflake. Having a reliable pipeline to surface both analytics and machine learning is crucial to creating tangible business value from your data.\u003C/p\u003E\n","\u003Cp\u003ETo learn more about how to combine Snowpark and dbt Cloud for smarter production, visit \u003Ca href=\"https://www.getdbt.com/partners/snowflake/?utm_medium=paid-search&amp;utm_source=google&amp;utm_campaign=q2-2024_us-nonbrand-snowflake_co&amp;utm_content=_kw-dbt-snowflake-ex___&amp;utm_term=all_all__&amp;utm_term=dbt%20snowflake&amp;utm_campaign=us-nonbrand-data-documentation_co&amp;utm_source=adwords&amp;utm_medium=ppc&amp;hsa_acc=8253637521&amp;hsa_cam=20228840529&amp;hsa_grp=156636570624&amp;hsa_ad=660652830669&amp;hsa_src=g&amp;hsa_tgt=kwd-1396665886035&amp;hsa_kw=dbt%20snowflake&amp;hsa_mt=e&amp;hsa_net=adwords&amp;hsa_ver=3&amp;gad=1&amp;gclid=CjwKCAjw-7OlBhB8EiwAnoOEk5VEMt-wpzr1XV8PHx2BybhKYhXNoajhZf7jt5ZT43dukzca--hLhhoCY_cQAvD_BwE\"\u003Eour page\u003C/a\u003E where you can \u003Ca href=\"https://www.getdbt.com/contact-demo/\"\u003Ebook a demo\u003C/a\u003E to talk to an expert and \u003Ca href=\"https://docs.getdbt.com/quickstarts/snowflake?step=1\"\u003Etry our quickstart\u003C/a\u003E focusing on dbt basics such as setup, connections, tests, and documentation.\u003C/p\u003E\n","\u003Cp\u003EFinally, for more help and information join our&nbsp;\u003Ca href=\"https://www.getdbt.com/community/\"\u003Edbt community Slack\u003C/a\u003E&nbsp;which contains more than 65,000 data practitioners today. We have a dedicated slack channel #db-snowflake to Snowflake related content. Happy dbt'ing!\u003C/p\u003E"],"title":"Leverage dbt Cloud to Generate ML ready pipelines using Snowpark python",":items":{},":itemsOrder":[],":type":"snowflake-site/components/contentfragment","isDeveloperGuidesPage":false,"elements":{"quickstartArticleBody":{"dataType":"string","title":"Quickstart Article Body","value":"\u003C!-- ------------------------ --\u003E\n## Overview \n\nThe focus of this workshop will be to demonstrate how we can use both *SQL and python together* in the same workflow to run *both analytics and machine learning models* on dbt Cloud.\n\nThe code complete repository for this quickstart can be found on [GitHub](https://github.com/dbt-labs/python-snowpark-formula1/tree/main).\n\n### What you'll need to setup for the lab\n\n- A [Snowflake account](https://trial.snowflake.com/) with ACCOUNTADMIN access\n- A [GitHub](https://github.com/) Account \n\n\n### What you will learn\n- How to use dbt with Snowflake to build scalable transformations using SQL and Python\n- How to use dbt SQL to prepare your data from sources to encoding \n- How to train a model in dbt python and use it for future prediction \n- How to deploy your full project \n\n### What you need to know\n\n- Basic to intermediate SQL and python.\n- Basic understanding of dbt fundamentals. We recommend the [dbt Fundamentals course](https://courses.getdbt.com/courses/fundamentals) if you're interested.\n- High level understanding of machine learning processes (encoding, training, testing). \n- Simple ML algorithms &mdash; we will use logistic regression to keep the focus on the *workflow*, not algorithms!\n\n### What you'll build\n\n- A set of data analytics and prediction pipelines using Formula 1 data leveraging dbt and Snowflake, making use of best practices and code promotion between environments. \n- We will create insights for:\n    1. Finding the lap time average and rolling average through the years\n    2. Predicting the position of each driver based on a decade of data\n\n### What you'll need\n\n- As inputs, we are going to leverage Formula 1 dataset hosted on a dbt Labs public S3 bucket. \n    - We will create a Snowflake Stage for our CSV files then use Snowflake’s `COPY INTO` function to copy the data in from our CSV files into tables. \n    - The Formula 1 dataset is available on [Kaggle](https://www.kaggle.com/datasets/rohanrao/formula-1-world-championship-1950-2020). \n    - The data is originally compiled from the [Ergast Developer API](http://ergast.com/mrd/). \n- We will not be building the full pipeline as part of this workshop. \n    - **Instead we will leverage an existing repo, fork it, and focus on our machine learning pipeline.**\n\n\u003C!-- ------------------------ --\u003E\n## Architecture and use case overview\n\nIn this lab we'll be transforming raw Formula 1 data into a consumable form for both analytics and machine learning pipelines. To understand how our data are related, we've included an entity relationship diagram (ERD) of the tables we'll be using today. \n\nOur data rarely ever looks the way we need it in its raw form: we need to join, filter, aggregate, etc. dbt is designed to transform your data and keep your pipeline organized and reliable along the way. We can see from our Formula1 ERD that if we have a major table called `results` with other tables such as `drivers`, `races`, and `circuits` tables that provide meaningful context to the `results` table. \n\nYou might also see that `circuits` cannot be directly joined to `results` since there is no key. This is a typical data model structure we see in the wild: we'll need to first join `results` and `races` together, then we can join to `circuits`. By bringing all this information together we'll be able to gain insights about lap time trends through the years. \n\n**Formula 1 ERD:** \u003Cbr\u003E\nERD can also be downloaded for interactive view from [S3](https://formula1-dbt-cloud-python-demo.s3.amazonaws.com/Formula1_ERD.svg)\n![assets/architecture-use-case/Formula1_ERD.svg](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/architecture-use-case/Formula1_ERD.svg)\n\nHere's a visual for the data pipeline that we'll be building using dbt!\n![project_DAG](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/architecture-use-case/project_DAG.png)\n\n\u003C!-- ------------------------ --\u003E\n## Getting started with Snowflake\n\n### Setup Snowflake trial and email alias \n\nIn this section we’re going to sign up for a Snowflake trial account and enable Anaconda-provided Python packages.\n\n1. [Sign up for a Snowflake Trial Account using this form](https://signup.snowflake.com/?utm_source=snowflake-devrel&utm_medium=developer-guides&utm_cta=developer-guides). Ensure that your account is set up using **AWS**. \n\n2. After creating your account and verifying it from your sign-up email, Snowflake will direct you back to the UI called Snowsight.\n\n3. To ensure we are working with a clean slate and create a fresh dbt Cloud instance when launching partner connect we will be using email aliasing. What this will look like is \u003Cyour_email\u003E+\u003Calias_addition\u003E@\u003Cyour_domain\u003E.com. \n\n4. Navigate to your left panel menu **∨** and select **Profile**. \n![assets/configure-snowflake/alias-account-email/1-snowflake_account_profile_menu.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/1-snowflake_account_profile_menu.png)\n\n5. You will see your unaliased email you used to sign up for your snowflake trial (screenshot is redacted for privacy). \n![assets/configure-snowflake/alias-account-email/2-unaliased_email_profile.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/2-unaliased_email_profile.png)\n\n6. Edit the email field to include the alias using the notation \u003Cyour_email\u003E+dbtsnowpark@\u003Cyour_domain\u003E.com. Ensure you **Save** your updated aliased email. \n![assets/configure-snowflake/alias-account-email/3-alias_email_update_profile_save.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/3-alias_email_update_profile_save.png)\n\n7. This should automatically send a re-verification email. In your email simply click the email link to verify your new aliased email, and then you're good to go. If for any reason you did the email was not generated you can navigate back to your **Profile** and click the link to manually **Resend verification email**. \n![assets/configure-snowflake/alias-account-email/4-manually_resend_verification_email.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/4-manually_resend_verification_email.png)\n\n8. Your verification email will look like the image below. Select **Validate your email**. \n![assets/configure-snowflake/alias-account-email/5-verification_email.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/5-verification_email.png)\n\n8. After you validate your email your screen should look as follows:\n![assets/configure-snowflake/alias-account-email/6-verification_confirmation_page.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/alias-account-email/6-verification_confirmation_page.png)\n\n9. Re-login or refresh your browser window. \n\nTo recap, we created this email alias to ensure that later when we launch Partner Connect to spin up a dbt Cloud account that there are no previously existing dbt Cloud accounts and projects that cause issues and complications in setup. \n\n### Enable Anaconda Python packages and open new SQL worksheet \n\n1. Ensure you are still logged in as the ACCOUNTADMIN. \n![new_snowflake_account](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/enable-anaconda/2-new-snowflake-account.png)\n\n2. Navigate to **Admin \u003E Billing & Terms**. Click **Enable \u003E Acknowledge & Continue** to enable Anaconda Python packages to run in Snowflake.\n![enable-anaconda](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/enable-anaconda/4-enable-anaconda.jpeg)\n![accept-anaconda-terms](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/configure-snowflake/enable-anaconda/3-accept-anaconda-terms.jpeg)\n\n3. Finally, navigate back to **Worksheets** to create a new SQL Worksheet by selecting **+** then **SQL Worksheet** in the upper right corner.\n\n\u003C!-- ------------------------ --\u003E\n## Load data into Snowflake\n\nWe need to obtain our data source by copying our Formula 1 data into Snowflake tables from a public S3 bucket that dbt Labs hosts. \n\n1. Your new Snowflake account has a preconfigured warehouse named `COMPUTE_WH`. You can check by going under **Admin \u003E Warehouses**. If for some reason you don’t have this warehouse, we can create a warehouse using the following script:\n\n    ```sql\n    create or replace warehouse COMPUTE_WH with warehouse_size=XSMALL\n    ```\n\n2. Rename the SQL worksheet by clicking the worksheet name (this is automatically set to the current timestamp) using the 3 dots `...` option, then click  **Rename**. Rename the file to `data setup script` since we will be placing code in this worksheet to ingest the Formula 1 data. Set the context of the worksheet by setting your role as the **ACCOUNTADMIN** and warehouse as **COMPUTE_WH**.\n![rename-worksheet-and-select-warehouse](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/1-rename-worksheet-and-select-warehouse.png)\n\n3. Copy the following code into the main body of the Snowflake SQL worksheet. You can also find this setup script under the `setup` folder in the [Git repository](https://raw.githubusercontent.com/dbt-labs/python-snowpark-formula1/main/setup/setup_script_s3_to_snowflake.sql). The script is long since it's bringing in all of the data we'll need today! We recommend copying this straight from the github file linked rather than from this workshop UI so you don't miss anything (use Ctrl+A or Cmd+A). \n\nGenerally during this lab we'll be explaining and breaking down the queries. We won't be going line by line, but we will point out important information related to our learning objectives!\n ```sql\n    /*\n    This is our setup script to create a new database for the Formula1 data in Snowflake.\n    We are copying data from a public s3 bucket into snowflake by defining our csv format and snowflake stage. \n    */\n    -- create and define our formula1 database\n    create or replace database formula1;\n    use database formula1; \n    create or replace schema raw; \n    use schema raw; \n\n    --define our file format for reading in the csvs \n    create or replace file format csvformat\n    type = csv\n    field_delimiter =','\n    field_optionally_enclosed_by = '\"', \n    skip_header=1; \n\n    --\n    create or replace stage formula1_stage\n    file_format = csvformat \n    url = 's3://formula1-dbt-cloud-python-demo/formula1-kaggle-data/';\n\n    -- load in the 8 tables we need for our demo \n    -- we are first creating the table then copying our data in from s3\n    -- think of this as an empty container or shell that we are then filling\n\n    --CIRCUITS\n    create or replace table formula1.raw.circuits (\n        CIRCUIT_ID NUMBER(38,0),\n        CIRCUIT_REF VARCHAR(16777216),\n        NAME VARCHAR(16777216),\n        LOCATION VARCHAR(16777216),\n        COUNTRY VARCHAR(16777216),\n        LAT FLOAT,\n        LNG FLOAT,\n        ALT NUMBER(38,0),\n        URL VARCHAR(16777216)\n    );\n    -- copy our data from public s3 bucket into our tables \n    copy into circuits \n    from @formula1_stage/circuits.csv\n    on_error='continue';\n\n    --CONSTRUCTOR RESULTS \n    create or replace table formula1.raw.constructor_results (\n        CONSTRUCTOR_RESULTS_ID NUMBER(38,0),\n        RACE_ID NUMBER(38,0),\n        CONSTRUCTOR_ID NUMBER(38,0),\n        POINTS NUMBER(38,0),\n        STATUS VARCHAR(16777216)\n    );\n    copy into constructor_results\n    from @formula1_stage/constructor_results.csv\n    on_error='continue';\n\n    --CONSTRUCTOR STANDINGS\n    create or replace table formula1.raw.constructor_standings (\n        CONSTRUCTOR_STANDINGS_ID NUMBER(38,0),\n        RACE_ID NUMBER(38,0),\n        CONSTRUCTOR_ID NUMBER(38,0),\n        POINTS NUMBER(38,0),\n        POSITION FLOAT,\n        POSITION_TEXT VARCHAR(16777216),\n        WINS NUMBER(38,0)\n    );\n    copy into constructor_standings\n    from @formula1_stage/constructor_standings.csv\n    on_error='continue';\n\n    --CONSTRUCTORS\n    create or replace table formula1.raw.constructors (\n        CONSTRUCTOR_ID NUMBER(38,0),\n        CONSTRUCTOR_REF VARCHAR(16777216),\n        NAME VARCHAR(16777216),\n        NATIONALITY VARCHAR(16777216),\n        URL VARCHAR(16777216)\n    );\n    copy into constructors \n    from @formula1_stage/constructors.csv\n    on_error='continue';\n\n    --DRIVER STANDINGS\n    create or replace table formula1.raw.driver_standings (\n        DRIVER_STANDINGS_ID NUMBER(38,0),\n        RACE_ID NUMBER(38,0),\n        DRIVER_ID NUMBER(38,0),\n        POINTS NUMBER(38,0),\n        POSITION FLOAT,\n        POSITION_TEXT VARCHAR(16777216),\n        WINS NUMBER(38,0)\n\n    );\n    copy into driver_standings \n    from @formula1_stage/driver_standings.csv\n    on_error='continue';\n\n    --DRIVERS\n    create or replace table formula1.raw.drivers (\n        DRIVER_ID NUMBER(38,0),\n        DRIVER_REF VARCHAR(16777216),\n        NUMBER VARCHAR(16777216),\n        CODE VARCHAR(16777216),\n        FORENAME VARCHAR(16777216),\n        SURNAME VARCHAR(16777216),\n        DOB DATE,\n        NATIONALITY VARCHAR(16777216),\n        URL VARCHAR(16777216)\n    );\n    copy into drivers \n    from @formula1_stage/drivers.csv\n    on_error='continue';\n\n    --LAP TIMES\n    create or replace table formula1.raw.lap_times (\n        RACE_ID NUMBER(38,0),\n        DRIVER_ID NUMBER(38,0),\n        LAP NUMBER(38,0),\n        POSITION FLOAT,\n        TIME VARCHAR(16777216),\n        MILLISECONDS NUMBER(38,0)\n    );\n    copy into lap_times \n    from @formula1_stage/lap_times.csv\n    on_error='continue';\n\n    --PIT STOPS \n    create or replace table formula1.raw.pit_stops (\n        RACE_ID NUMBER(38,0),\n        DRIVER_ID NUMBER(38,0),\n        STOP NUMBER(38,0),\n        LAP NUMBER(38,0),\n        TIME VARCHAR(16777216),\n        DURATION VARCHAR(16777216),\n        MILLISECONDS NUMBER(38,0)\n    );\n    copy into pit_stops \n    from @formula1_stage/pit_stops.csv\n    on_error='continue';\n\n    --QUALIFYING\n    create or replace table formula1.raw.qualifying (\n        QUALIFYING_ID NUMBER(38,0),\n        RACE_ID NUMBER(38,0),\n        DRIVER_ID NUMBER(38,0),\n        CONSTRUCTOR_ID NUMBER(38,0),\n        NUMBER NUMBER(38,0),\n        POSITION FLOAT,\n        Q1 VARCHAR(16777216),\n        Q2 VARCHAR(16777216),\n        Q3 VARCHAR(16777216)\n    );\n    copy into qualifying \n    from @formula1_stage/qualifying.csv\n    on_error='continue';\n\n    --RACES \n    create or replace table formula1.raw.races (\n        RACE_ID NUMBER(38,0),\n        YEAR NUMBER(38,0),\n        ROUND NUMBER(38,0),\n        CIRCUIT_ID NUMBER(38,0),\n        NAME VARCHAR(16777216),\n        DATE DATE,\n        TIME VARCHAR(16777216),\n        URL VARCHAR(16777216),\n        FP1_DATE VARCHAR(16777216),\n        FP1_TIME VARCHAR(16777216),\n        FP2_DATE VARCHAR(16777216),\n        FP2_TIME VARCHAR(16777216),\n        FP3_DATE VARCHAR(16777216),\n        FP3_TIME VARCHAR(16777216),\n        QUALI_DATE VARCHAR(16777216),\n        QUALI_TIME VARCHAR(16777216),\n        SPRINT_DATE VARCHAR(16777216),\n        SPRINT_TIME VARCHAR(16777216)\n    );\n    copy into races \n    from @formula1_stage/races.csv\n    on_error='continue';\n\n    --RESULTS\n    create or replace table formula1.raw.results (\n        RESULT_ID NUMBER(38,0),\n        RACE_ID NUMBER(38,0),\n        DRIVER_ID NUMBER(38,0),\n        CONSTRUCTOR_ID NUMBER(38,0),\n        NUMBER NUMBER(38,0),\n        GRID NUMBER(38,0),\n        POSITION FLOAT,\n        POSITION_TEXT VARCHAR(16777216),\n        POSITION_ORDER NUMBER(38,0),\n        POINTS NUMBER(38,0),\n        LAPS NUMBER(38,0),\n        TIME VARCHAR(16777216),\n        MILLISECONDS NUMBER(38,0),\n        FASTEST_LAP NUMBER(38,0),\n        RANK NUMBER(38,0),\n        FASTEST_LAP_TIME VARCHAR(16777216),\n        FASTEST_LAP_SPEED FLOAT,\n        STATUS_ID NUMBER(38,0)\n    );\n    copy into results \n    from @formula1_stage/results.csv\n    on_error='continue';\n\n    --SEASONS\n    create or replace table formula1.raw.seasons (\n        YEAR NUMBER(38,0),\n        URL VARCHAR(16777216)\n    );\n    copy into seasons \n    from @formula1_stage/seasons.csv\n    on_error='continue';\n\n    --SPRINT RESULTS\n    create or replace table formula1.raw.sprint_results (\n        RESULT_ID NUMBER(38,0),\n        RACE_ID NUMBER(38,0),\n        DRIVER_ID NUMBER(38,0),\n        CONSTRUCTOR_ID NUMBER(38,0),\n        NUMBER NUMBER(38,0),\n        GRID NUMBER(38,0),\n        POSITION FLOAT,\n        POSITION_TEXT VARCHAR(16777216),\n        POSITION_ORDER NUMBER(38,0),\n        POINTS NUMBER(38,0), \n        LAPS NUMBER(38,0),\n        TIME VARCHAR(16777216),\n        MILLISECONDS NUMBER(38,0),\n        FASTEST_LAP VARCHAR(16777216),\n        FASTEST_LAP_TIME VARCHAR(16777216),\n        STATUS_ID NUMBER(38,0)\n        );\n    copy into sprint_results \n    from @formula1_stage/sprint_results.csv\n    on_error='continue';\n\n    --STATUS\n    create or replace table formula1.raw.status (\n        STATUS_ID NUMBER(38,0),\n        STATUS VARCHAR(16777216)\n    );\n    copy into status \n    from @formula1_stage/status.csv\n    on_error='continue';\n```\n\n4. Ensure all the commands are selected before running the query &mdash; an easy way to do this is to use Ctrl-A to highlight all of the code in the worksheet. Select **run** (blue triangle icon). Notice how the dot next to your **COMPUTE_WH** turns from gray to green as you run the query. The **status** table is the final table of all 14 tables loaded in. \n![load-data-from-s3](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/2-load-data-from-s3.png)\n\n5. Let’s unpack that pretty long query we ran into component parts. We ran this query to load in our 14 Formula 1 tables from a public S3 bucket. To do this, we:\n- Created a new database called `formula1` and a schema called `raw` to place our raw (untransformed) data into. \n- Created a stage to locate our data we are going to load in. Snowflake Stages are locations where data files are stored. Stages are used to both load and unload data to and from Snowflake locations. Here we are using an external stage, by referencing an S3 bucket. \n- Created our tables for our data to be copied into. These are empty tables with the column name and data type. Think of this as creating an empty container that the data will then fill into. \n- Used the `copy into` statement for each of our tables. We reference our staged location we created and upon loading errors continue to load in the rest of the data. You should not have data loading errors but if you do, those rows will be skipped and Snowflake will tell you which rows caused errors. \n\n6. Once the script completes, browse to the left navigation menu. Click on **...** button to bring up **Refresh** button. Click **Refresh** and you will see the newly created `FORMULA1` database show up. Expand the database and explore the different tables you just created and loaded data into in the RAW schema.\n![create-new-worksheet-to-query-data](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/3a-refresh-database-objects.png)\n\n7. Now let's take a look at some of our cool Formula 1 data we just loaded up!\n- Create a SQL worksheet by selecting the **+** then **SQL Worksheet**.\n![create-new-worksheet-to-query-data](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/3b-create-new-worksheet-to-query-data.png)\n\n- Navigate to **Database \u003E Formula1 \u003E RAW \u003E Tables**. \n- Query the data using the following code. There are only 77 rows in the circuits table, so we don’t need to worry about limiting the amount of data we query.\n    ```sql\n    select * from formula1.raw.circuits\n    ```\n- Run the query. From here on out, we’ll use the keyboard shortcuts Command-Enter or Control-Enter to run queries and won’t explicitly call out this step. \n- Review the query results, you should see information about Formula 1 circuits, starting with Albert Park in Australia! \n- Ensure you have all 14 tables starting with `CIRCUITS` and ending with `STATUS`. Now we are ready to connect into dbt Cloud!\n![query-circuits-data](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/load-data-into-snowflake/4-query-circuits-data.png)\n\nWe're ready to setup our dbt account!\n\n\u003C!-- ------------------------ --\u003E\n## Launching dbt cloud through partner connect \n\nWe are going to be using [Snowflake Partner Connect](https://docs.snowflake.com/en/user-guide/ecosystem-partner-connect.html) to set up a dbt Cloud account. Using this method will allow you to spin up a fully fledged dbt account with your [Snowflake connection](https://docs.getdbt.com/docs/cloud/connect-data-platform/connect-snowflake) and environments already established.\n\n1. Navigate out of your SQL worksheet back by selecting **home**.\n2. In Snowsight, confirm that you are using the **ACCOUNTADMIN** role.\n3. Confirm that your email address contains an email alias. \n4. Navigate to the **Admin** **\u003E Partner Connect**. Find **dbt** either by using the search bar or navigating the **Data Integration**. Select the **dbt** tile.\n![assets/launching-dbt-cloud-through-partner-connect/1-open-partner-connect.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/1-open-partner-connect.png)\n\n5. You should now see a new window that says **Connect to dbt**. Select **Optional Grant** and add the `FORMULA1` database. This will grant access for your new dbt user role to the FORMULA1 database.\n![assets/launching-dbt-cloud-through-partner-connect/2-partner-connect-optional-grant.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/2-partner-connect-optional-grant.png)\n\n6. Ensure the `FORMULA1` is present in your optional grant before clicking **Connect**.  This will create a dedicated dbt user, database, warehouse, and role for your dbt Cloud trial.\n![assets/launching-dbt-cloud-through-partner-connect/3a-connect-to-dbt.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/3a-connect-to-dbt.png)\n\nIf you forgot to add the optional grant to the Formula1 database in the previous screenshot, please run these commands:\n\n```sql \n\ngrant usage on database FORMULA1 to role PC_DBT_ROLE;\ngrant usage on schema FORMULA1.RAW to role PC_DBT_ROLE;\ngrant select on all tables in schema FORMULA1.RAW to role PC_DBT_ROLE;\n```    \n\n6. When you see the **Your partner account has been created** window, click **Activate**.\n![assets/launching-dbt-cloud-through-partner-connect/3b-activate-partner-connect.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/3b-activate-partner-connect.png)\n\n7. You should be redirected to a dbt Cloud registration page. Fill out the form using whatever account name you'd like. Make sure to save the password somewhere for login in the future. \n![assets/launching-dbt-cloud-through-partner-connect/4-dbt-cloud-sign-up.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/launching-dbt-cloud-through-partner-connect/4-dbt-cloud-sign-up.png)\n\n8. Select **Complete Registration**. You should now be redirected to your dbt Cloud account, complete with a connection to your Snowflake account, a deployment and a development environment, and a sample job.\n\nInstead of building an entire version controlled data project from scratch, we'll be **forking and connecting to an existing workshop github repository** in the next step. dbt Cloud's git integration creates easy to use git guardrails. You won't need to know much Git for this workshop. In the future, if you’re developing your own proof of value project from scratch, [feel free to use dbt's managed  repository](https://docs.getdbt.com/docs/collaborate/git/managed-repository) that is spun up during partner connect. \n\n\n\u003C!-- ------------------------ --\u003E\n## Forking repository into dbt Cloud\n\nTo keep the focus on dbt python and deployment today, we only want to build a subset of models that would be in an entire data project. To achieve this we need to fork an existing repository into our personal github, copy our forked repo name into dbt cloud, and add the dbt deploy key to our github account. Viola! There will be some back and forth between dbt cloud and GitHub as part of this process, so keep your tabs open, and let's get the setup out of the way!\n\n1. Open a new browser tab and navigate to our demo repo by [clicking here](https://github.com/dbt-labs/dbt-python-hands-on-lab-snowpark).\n\n2. **Fork** your own copy of the lab repo.\n![assets/development-schema-and-forking-repo/forking-repo/5_fork_exisiting_formula1_repo.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/5_fork_exisiting_formula1_repo.png)\n\n3. Add a description if you'd like such as: \"learning about dbt Cloud is cool\" and **Create fork**.  \n![assets/development-schema-and-forking-repo/forking-repo/6_create_new_fork.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/6_create_new_fork.png)\n\n4. Select the **Code** button. Choose the SSH option and use the **copy** button shortcut for our repo. We'll be using this copied path in step 11 in this section.\n![assets/development-schema-and-forking-repo/forking-repo/7_copy_repo_ssh_github.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/7_copy_repo_ssh_github.png)\n\n5. Head back over to your dbt Cloud browser tab so we can connect our new forked repository into our dbt Cloud project. \n \n6. We'll need to delete the existing connection to the managed repository spun up during Partner Connect before we input our new one. To do this navigate to **Settings \u003E Account Settings \u003E Partner Connect Trial**.\n\n7. This will open the **Project Details**. Navigate to **Repository** and click the existing managed repository GitHub connection setup during partner connect.\n![assets/development-schema-and-forking-repo/forking-repo/1-select-partner-connect-repo.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/1-select-partner-connect-repo.png)\n\n8. In the **Repository Details** select **Edit** in the lower right corner. The option to **Disconnect** will appear, select it.\n![assets/development-schema-and-forking-repo/forking-repo/2_repository_details_disconnect.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/2_repository_details_disconnect.png)\n\n9. **Confirm disconnect**. \n![assets/development-schema-and-forking-repo/forking-repo/3_confirm_disconnect_from_managed_repo.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/3_confirm_disconnect_from_managed_repo.png)\n\n10. Within your **Project Details** you should have the option to **Configure Repository**.\n![assets/development-schema-and-forking-repo/forking-repo/4_configure_repository.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/4_configure_repository.png)\n\n11. After deleting our partner connect managed repository, we should see **New Repository**. Select **Git Clone**. Input the repository by pasting what you copied from GitHub in step 4 above into the **Repository** parameter and clicking **Import**.\n![assets/development-schema-and-forking-repo/forking-repo/8_git_clone_copy_repo_from_github.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/8_git_clone_copy_repo_from_github.png)\n\n12. We can see we successfully made the connection to our forked GitHub repo. ![assets/development-schema-and-forking-repo/forking-repo/9_update_dbt_cloud_repo_connection_with_forked_repo.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/forking-repo/9_update_dbt_cloud_repo_connection_with_forked_repo.png) \n\nIf you tried to start developing onto of this repo right now, we'd get permissions errors. So we need to give dbt Cloud write access. \n\n## Giving dbt cloud repo write access using github deploy keys\n\n1. Click on your git cloned repository link. dbt Cloud generated a deploy key to link the development we do in dbt cloud back to our GitHub repo. **Copy** the deploy key starting with **ssh-rsa** followed by a long hash key (full key hidden for privacy).\n![assets/development-schema-and-forking-repo/github-deploy-keys/copy_deploy_key_from_dbt_cloud.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/copy_deploy_key_from_dbt_cloud.png)\n\n2. Phew almost there! Navigate **back to GitHub** again. \n3. Ensure you're in your forked repo. Navigate to your repo **Settings**\n![assets/development-schema-and-forking-repo/github-deploy-keys/git_repo_settings.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/git_repo_settings.png)\n\n4. Go to **Deploy keys**. \n![assets/development-schema-and-forking-repo/github-deploy-keys/deploy_keys_github.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/deploy_keys_github.png)\n\n5. Select **Add deploy key**. ![assets/development-schema-and-forking-repo/github-deploy-keys/new_deploy_key_button.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/new_deploy_key_button.png)\n\n6. Give your deploy key a title such as `dbt Cloud python snowpark`. Paste the ssh-rsa deploy key we copied from dbt Cloud into the **Key** box. Be sure to enable **Allow write access**. Finally, **Add key**. Your deploy key has been created. We won't have to come back to again GitHub until the end of our workshop.\n![assets/development-schema-and-forking-repo/github-deploy-keys/add_new_deploy_key.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/add_new_deploy_key.png)\n![assets/development-schema-and-forking-repo/github-deploy-keys/deploy_key_created.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/deploy_key_created.png)\n\n7. Head back over to dbt cloud. Navigate to **Develop**.\n![assets/development-schema-and-forking-repo/github-deploy-keys/develop_panel_dbt_cloud.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/develop_panel_dbt_cloud.png)\n\n8. **Run \"dbt deps\"**\n![assets/development-schema-and-forking-repo/github-deploy-keys/run_dep_deps_after_importing_forked_repo.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/run_dep_deps_after_importing_forked_repo.png)\n\n9. Since we're bringing in an existing project, your root folder should now say `dbt-python-hands-on-lab-snowpark`\n![assets/development-schema-and-forking-repo/github-deploy-keys/file_tree_of_forked_repo.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/development-schema-and-forking-repo/github-deploy-keys/file_tree_of_forked_repo.png)\n\nAlas, now that our setup work is complete, time get a look at our production data pipeline code! \n\n\u003C!-- ------------------------ --\u003E\n## IDE overview and building our dbt project\n\ndbt Cloud's IDE will be our development space for this workshop, so let's get familiar with it. Once we've done that we'll run the pipeline we imported from our forked repo. \n\n1. There are a couple of key features to point out about the IDE before we get to work. It is a text editor, an SQL and Python runner, and a CLI with Git version control all baked into one package! This allows you to focus on editing your SQL and Python files, previewing the results with the SQL runner (it even runs Jinja!), and building models at the command line without having to move between different applications. The Git workflow in dbt Cloud allows both Git beginners and experts alike to be able to easily version control all of their work with a couple clicks.\n![assets/ide-overview-building-project/1-ide-overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/1-ide-overview.png)\n\u003C!-- TODO UPDATE IDE SCREENSHOT AND MENTION NEW FEATURES SUCH AS LINTING --\u003E\n\n2. In the file tree, click on the magnifying glass icon next to the File Explorer on the left sidebar and type in **hold_out_dataset_for_prediction.py**. Click the **Lineage** tab. To make it full screen click the viewfinder icon. Play around with the nodes being shown by removing the 2 in front or behind of `2+hold_out_dataset_for_prediction+2`and updating the graph.\n![assets/ide-overview-building-project/2_lineage_viewfinder.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/2_lineage_viewfinder.png)\n\n3. Explore the DAG for a few minutes to understand everything we've done to our pipeline along the way. This includes: cleaning up and joining our data, machine learning data prep, variable encoding, and splitting the datasets. We'll go more in-depth in next steps about how we brought in raw data and then transformed it, but for now get an overall familiarization. \n![assets/ide-overview-building-project/3_lineage_fullview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/3_lineage_fullview.png) You can view the code in each node of the DAG by selecting it and navigating out of the full screen. You can read the code on the scratchpad. \n\n4. Let's run the pipeline we imported from our forked repo. Type `dbt build` into the command line and select **Enter** on your keyboard. When the run bar expands you'll be able to see the results of the run, where you should see the run complete successfully. \n![assets/ide-overview-building-project/4_dbt_build_initial_pipeline_ml.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/4_dbt_build_initial_pipeline_ml.png) \nTo understand more about what the [dbt build](https://docs.getdbt.com/reference/commands/build) syntax is running check out the documentation.\n\n5. You can look at the run results of each model to see the code that dbt compiles and sends to Snowflake for execution. Select the arrow beside a model **\u003E**. Click **Details** and view the ouput. We can see that dbt automatically generates the DDL statement and is creating our models in our development schema (i.e. `dbt_hwatson`).\n![assets/ide-overview-building-project/5_model_details_ddl.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/5_model_details_ddl.png)\n\n6. Now let's switch over to a new browser tab **on Snowflake** to confirm that the objects were actually created. Click on the three dots **…** above your database objects and then **Refresh**. Expand the **PC_DBT_DB** database and you should see your development schema. Select the schema, then **Tables**  and **Views**. Now you should be able to see many models we created from our forked repo. \n![assets/ide-overview-building-project/6_confirm_pipeline_build_in_snowflake.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/ide-overview-building-project/6_confirm_pipeline_build_in_snowflake.png)\n\nWe did a lot upstream in our forked repo and we'll explore it at a high level of how we did that before moving on to machine learning model training and prediction in dbt cloud. \n\n\u003C!-- ------------------------ --\u003E\n## Understanding our existing pipeline \n\nWe brought a good chunk of our data pipeline in through our forked repo to lay a foundation for machine learning.\nIn the next couple steps we are taking time to review how this was done. That way when you have your own dbt project you'll be familiar with the setup! We'll start with the dbt_project.yml, sources, and staging. \n\n\n### dbt_project.yml\n1. Select the `dbt_project.yml` file in the root directory the file explorer to open it. What are we looking at here? Every dbt project requires a `dbt_project.yml` file &mdash; this is how dbt knows a directory is a dbt project. The [dbt_project.yml](https://docs.getdbt.com/reference/dbt_project.yml) file also contains important information that tells dbt how to operate on your project.\n2. Your code should as follows: \n    ```yaml\n    name: 'snowflake_python_workshop'\n    version: '1.5.0'\n    require-dbt-version: '\u003E=1.3.0'\n    config-version: 2\n\n    # This setting configures which \"profile\" dbt uses for this project.\n    profile: 'default'\n\n    # These configurations specify where dbt should look for different types of files.\n    # The `source-paths` config, for example, states that models in this project can be\n    # found in the \"models/\" directory. You probably won't need to change these!\n    model-paths: [\"models\"]\n    analysis-paths: [\"analyses\"]\n    test-paths: [\"tests\"]\n    seed-paths: [\"seeds\"]\n    macro-paths: [\"macros\"]\n    snapshot-paths: [\"snapshots\"]\n\n    target-path: \"target\"  # directory which will store compiled SQL files\n    clean-targets:         # directories to be removed by `dbt clean`\n        - \"target\"\n        - \"dbt_packages\"\n\n    models:\n        snowflake_python_workshop:\n        staging:\n            +docs:\n            node_color: \"CadetBlue\"\n\n        marts:\n            +materialized: table\n            aggregates:\n            +docs:\n                node_color: \"Maroon\"\n            +tags: \"bi\"\n\n        core:\n            +materialized: table\n            +docs:\n            node_color: \"#800080\"\n\n        ml:\n            +materialized: table\n            prep_encoding_splitting:\n            +docs:\n                node_color: \"Indigo\"\n            training_and_prediction:\n            +docs:\n                node_color: \"Black\"\n    ```\n\n3. The key configurations to point out in the file with relation to the work that we're going to do are in the `models` section.\n    - `require-dbt-version` &mdash; Tells dbt which version of dbt to use for your project. We are requiring 1.3.0 and any newer version to run python models and node colors.\n    - `materialized` &mdash; Tells dbt how to materialize models when compiling the code before it pushes it down to Snowflake. All models in the `marts` folder will be built as tables.\n    - `tags` &mdash; Applies tags at a directory level to all models. All models in the `aggregates` folder will be tagged as `bi` (abbreviation for business intelligence).\n4. [Materializations](https://docs.getdbt.com/docs/build/materializations) are strategies for persisting dbt models in a warehouse, with `tables` and `views` being the most commonly utilized types. By default, all dbt models are materialized as views and other materialization types can be configured in the `dbt_project.yml` file or in a model itself. It’s very important to note *Python models can only be materialized as tables or incremental models.* Since all our Python models exist under `marts`, the following portion of our `dbt_project.yml` ensures no errors will occur when we run our Python models. Starting with [dbt version 1.4](https://docs.getdbt.com/guides/migration/versions/upgrading-to-v1.4#updates-to-python-models), Python files will automatically get materialized as tables even if not explicitly specified.\n\n    ```yaml \n    marts:     \n      +materialized: table\n    ``` \n\nCool, now that dbt knows we have a dbt project we can view the folder structure and data modeling.  \n\n### Folder structure \ndbt Labs has developed a [project structure guide](https://docs.getdbt.com/guides/best-practices/how-we-structure/1-guide-overview) that contains a number of recommendations for how to build the folder structure for your project. These apply to our entire project except the machine learning portion - this is still relatively new use case in dbt without the same established best practices. \n\nDo check out that guide if you want to learn more. Right now we are going to organize our project using the following structure:\n- sources &mdash; This is our Formula 1 dataset and it will be defined in a source YAML file. Nested under our Staging folder. \n- staging models &mdash; These models have a 1:1 with their source table and are for light transformation (renaming columns, recasting data types, etc.).\n- core models &mdash; Fact and dimension tables available for end user analysis. Since the Formula 1 is pretty clean demo data these look similar to our staging models. \n- marts models &mdash; Here is where we perform our major transformations. It contains the subfolder:\n    - aggregates\n- ml :\n    - prep_encoding_splitting\n    - training_and_prediction (we'll be creating this folder later &mdash; it doesn't exist yet )\n\nYour folder structure should look like (make sure to expand some folders if necessary):\n![assets/understanding-our-existing-pipeline/folder_structure.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/understanding-our-existing-pipeline/folder_structure.png)\n\nRemember you can always reference the entire project in [GitHub](https://github.com/dbt-labs/python-snowpark-formula1) to view the complete folder and file strucutre.  \n\n\u003C!-- ------------------------ --\u003E\n## Data modeling: review sources and staging \n\nIn any data project we follow the process of starting with raw data, cleaning and transforming it, and then gaining insights. In this step we'll be showing you how to bring raw data into dbt and create staging models. The steps of setting up sources and staging models were completed when we forked our repo, so we'll only need to preview these files (instead of build them).\n\nSources allow us to create a dependency between our source database object and our staging models which will help us when we look at [data-lineage](https://docs.getdbt.com/terms/data-lineage) later. Also, if your source changes database or schema, you only have to update it in your `f1_sources.yml` file rather than updating all of the models it might be used in.\n\nStaging models are the base of our project, where we bring all the individual components we're going to use to build our more complex and useful models into the project. Staging models have a 1:1 relationship with their source table and are for light transformation steps such as renaming columns, type casting, basic computations, and categorizing data. \n\nSince we want to focus on dbt and Python in this workshop, check out our [sources](https://docs.getdbt.com/docs/build/sources) and [staging](https://docs.getdbt.com/guides/best-practices/how-we-structure/2-staging) docs if you want to learn more (or take our [dbt Fundamentals](https://courses.getdbt.com/collections) course which covers all of our core functionality).\n\n### Creating Sources \n1. Open the file called `f1_sources.yml` with the following file path: `models/staging/formula1/f1_sources.yml`.\n2. You should see the following code that creates our 14 source tables in our dbt project from Snowflake:\n![assets/data-modeling-sources-and-staging/sources_f1.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/data-modeling-sources-and-staging/sources_f1.png)\n\n\n3. dbt makes it really easy to:\n    - declare [sources](https://docs.getdbt.com/docs/build/sources)\n    - provide [testing](https://docs.getdbt.com/docs/build/tests) for data quality and integrity with support for both generic and singular tests \n    - create [documentation](https://docs.getdbt.com/docs/collaborate/documentation) using descriptions where you write code\n\nNow that we are connected into our raw data let's do some light transformations in staging. \n\n### Staging \n1. Let's view two staging models that we'll be using to understand lap time trends through the years. \n2. Open `stg_lap_times`. \n    ```sql\n    with\n\n    lap_times as (select * from {{ source('formula1', 'lap_times') }}),\n\n    renamed as (\n        select\n            race_id as race_id,\n            driver_id as driver_id,\n            lap,\n            \"POSITION\" as driver_position,\n            \"TIME\" as lap_time_formatted,\n            {{ convert_laptime(\"lap_time_formatted\") }} as official_laptime,\n            milliseconds as lap_time_milliseconds\n        from lap_times\n    )\n    select\n        {{ dbt_utils.generate_surrogate_key([\"race_id\", \"driver_id\", \"lap\"]) }}\n        as lap_times_id,\n        *\n    from renamed\n    ```\n\n3. Review the SQL code. We see renaming columns using the alias in addition to reformatting using a jinja code in our project referencing a macro. At a high level a macro is a reusable piece of code and jinja is the way we can bring that code into our SQL model. Datetimes column formatting is usually tricky and repetitive. By using a macro we introduce a way to systematic format times and reduce redunant code in our Formula 1 project. Select **\u003C/\u003E Compile** once its finished view the **Compiled Code tab**. \n![assets/data-modeling-sources-and-staging/compiled_jinja_lap_times.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/data-modeling-sources-and-staging/compiled_jinja_lap_times.png)\n\n4. Now click **Preview** &mdash; look how pretty and human readable our `official_laptime` column is!\n5. Feel free to view our project macros under the root folder `macros` and look at the code for our convert_laptime macro in the `convert_laptim.sql` file. \n6. We can see the reusable logic we have for splitting apart different components of our lap times from hours to nanoseconds. If you want to learn more about leveraging macros within dbt SQL, check out our [macros documentation](https://docs.getdbt.com/docs/build/jinja-macros). \n\n\u003C!-- 7. TODO talk about surrogate_key and dbt_utils --\u003E\n\nYou can see for every source table, we have a staging table. Now that we're done staging our data it's time for transformation.\n\n\u003C!-- ------------------------ --\u003E\n## SQL Transformations \n\ndbt got it's start in being a powerful tool to enhance the way data transformations are done in SQL. Before we jump into python, let's pay homage to SQL. \u003Cbr\u003E\nSQL is so performant at data cleaning and transformation, that many data science projects \"use SQL for everything you can, then hand off to python\" and that's exactly what we're going to do. \n\n### Fact and dimension tables \n[Dimensional modeling](https://docs.getdbt.com/terms/dimensional-modeling) is an important data modeling concept where we break up data into \"facts\" and \"dimensions\" to organize and describe data. We won't go into depth here, but think of facts as \"skinny and long\" transactional tables and dimensions as \"wide\" referential tables. We'll preview one dimension table and be building one fact table. \n\n1. Create a new branch so we can build new models (our main branch is protected as read-only in dbt Cloud). Name your branch `snowpark-python-workshop`. \n![assets/sql-transformations/create_branch_dbt_cloud.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/create_branch_dbt_cloud.png)\n![assets/sql-transformations/name_branch_dbt_cloud.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/name_branch_dbt_cloud.png)\n\n2. Navigate in the file tree to **models \u003E marts \u003E core \u003E dim_races**. \n3. **Preview** the data. We can see we have the `RACE_YEAR` in this table. That's important since we want to understand the changes in lap times over years. So we now know `dim_races` contains the time column we need to make those calculations. \n\u003C!-- TODO SCREENSHOT OF PREVIEWED DATA  --\u003E\n4. Create a new file within the **core** directory **core \u003E ... \u003E Create file**.\n![assets/sql-transformations/create_fct_file.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/create_fct_file.png)\n \n5. Name the file `fct_lap_times.sql`.\n![assets/sql-transformations/fct_lap_times.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/fct_lap_times.png)\n\n6. Copy in the following code and save the file (**Save** or Ctrl+S):\n    ```sql\n    with lap_times as (\n        select \n            {{ dbt_utils.generate_surrogate_key(['race_id', 'driver_id', 'lap']) }} as lap_times_id,\n            race_id                                                                 as race_id,\n            driver_id                                                               as driver_id,\n            lap                                                                     as lap,\n            driver_position                                                         as driver_position,\n            lap_time_formatted                                                      as lap_time_formatted,\n            official_laptime                                                        as official_laptime,\n            lap_time_milliseconds                                                   as lap_time_milliseconds\n        from {{ ref('stg_lap_times') }}\n    )\n    select * from lap_times\n    ```\n7. Our `fct_lap_times` is very similar to our staging file since this is clean demo data. In your real world data project your data will probably be messier and require extra filtering and aggregation prior to becoming a fact table exposed to your business users for utilizing.\n8. Use the UI **Build** (buttom with hammer icon) to create the `fct_lap_times` model. \n![assets/sql-transformations/dbt_build_fct_lap_times.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/dbt_build_fct_lap_times.png)\n\nNow we have both `dim_races` and `fct_lap_times` separately. Next we'll to join these to create lap trend analysis through the years.\n\n### Marts tables\nMarts tables are where everything comes together to create our business-defined entities that have an identity and purpose. \nWe'll be joining our `dim_races` and `fct_lap_times` together. \n\n1. Create a new file under your **marts** folder called `mrt_lap_times_years.sql`.\n2. Copy and **Save** the following code:\n    ```sql\n    with lap_times as (\n    select * from {{ ref('fct_lap_times') }}\n        ),\n        races as (\n        select * from {{ ref('dim_races') }}\n        ),\n        expanded_lap_times_by_year as (\n            select \n                lap_times.race_id, \n                driver_id, \n                race_year,\n                lap,\n                lap_time_milliseconds \n            from lap_times\n            left join races\n                on lap_times.race_id = races.race_id\n            where lap_time_milliseconds is not null \n        )\n        select * from expanded_lap_times_by_year\n    ```\n\u003C!-- TODO ADD SCREENSHOT OF MART  --\u003E\n3. Our dataset contains races going back to 1950, but the measurement of lap times begins in 1996. Here we join our datasets together use our `where` clause to filter our races prior to 1996, so they have lap times. \n4. Execute the model using **Build**. \n5. **Preview** your new model. We have race years and lap times together in one joined table so we are ready to create our trend analysis. \n6. It's a good time to commit the 2 new models we created in our repository. Click **Commit and sync** and add a commit message. \n![assets/sql-transformations/commit_and_sync_fct_mrt.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/commit_and_sync_fct_mrt.png)\n![assets/sql-transformations/commit_message_fct_mrt.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/sql-transformations/commit_message_fct_mrt.png)\n\nNow that we've joined and denormalized our data we're ready to use it in python development. \n\n\u003C!-- ------------------------ --\u003E\n## Python development in snowflake python worksheets \n\nThis step is optional for this quickstart to give a better feel for working with python directly in Snowflake. To see how to implement this in dbt Cloud, you may skip to the next section.\n\nNow that we've transformed data using SQL let's write our first python code and get insights about lap time trends.\nSnowflake python worksheets are excellent for developing your python code before bringing it into a dbt python model.\nThen once we are settled on the code we want, we can drop it into our dbt project. \n\n[Python worksheets](https://docs.snowflake.com/en/developer-guide/snowpark/python/python-worksheets) in Snowflake are a dynamic and interactive environment for executing Python code directly within Snowflake's cloud data platform. They provide a seamless integration between Snowflake's powerful data processing capabilities and the versatility of Python as a programming language. With Python worksheets, users can easily perform data transformations, analytics, and visualization tasks using familiar Python libraries and syntax, all within the Snowflake ecosystem. These worksheets enable data scientists, analysts, and developers to streamline their workflows, explore data in real-time, and derive valuable insights from their Snowflake data.\n\n1. Head back over **to Snowflake**.\n2. Open up a **Python Worksheet**. The boilerplate example code when you first create a Python worksheet is fetching `information_schema.packages` available, filtering on column `language = ‘python’`, and returning that as dataframe, which is what gets shown in result (next step). \n![assets/python-development/create_python_worksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/create_python_worksheet.png)\n![assets/python-development/new_python_worksheet_boilerplate_example_code.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/new_python_worksheet_boilerplate_example_code.png)\n\n3. Ensure you are in your development database and schema (i.e. **PC_DBT_DB** and **DBT_HWATSON**) and run the Python worksheet (Ctrl+A and **Run**).\nThe query results represent the many (about 5,400) packages snowpark for python supports that you can leverage! \n![assets/python-development/python_worksheet_db_schema.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/python_worksheet_db_schema.png)\n![assets/python-development/results_of_new_python_worksheet_boilerplate_example_code.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/results_of_new_python_worksheet_boilerplate_example_code.png)\n\n\n4. Delete the sample boilerplate code in the new python worksheet. Copy the following code into the python worksheet to get a 5 year moving average of Formula 1 laps:\n    ```python\n    # The Snowpark package is required for Python Worksheets. \n    # You can add more packages by selecting them using the Packages control and then importing them.\n\n    import snowflake.snowpark as snowpark\n    import pandas as pd \n\n    def main(session: snowpark.Session): \n        # Your code goes here, inside the \"main\" handler.\n        tableName = 'MRT_LAP_TIMES_YEARS'\n        dataframe = session.table(tableName)\n        lap_times = dataframe.to_pandas()\n\n        # print table\n        print(lap_times)\n\n        # describe the data\n        lap_times[\"LAP_TIME_SECONDS\"] = lap_times[\"LAP_TIME_MILLISECONDS\"]/1000\n        lap_time_trends = lap_times.groupby(by=\"RACE_YEAR\")[\"LAP_TIME_SECONDS\"].mean().to_frame()\n        lap_time_trends.reset_index(inplace=True)\n        lap_time_trends[\"LAP_MOVING_AVG_5_YEARS\"] = lap_time_trends[\"LAP_TIME_SECONDS\"].rolling(5).mean()\n        lap_time_trends.columns = lap_time_trends.columns.str.upper()\n\n        final_df = session.create_dataframe(lap_time_trends)\n        # Return value will appear in the Results tab.\n        return final_df\n    ```\nIf you have workloads that have large memory requirements such as deep learning models consider using [Snowpark dataframes](https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes) and [Snowpark-optimized warehouses](https://docs.snowflake.com/en/user-guide/warehouses-snowpark-optimized) that are specifically engineered to handle these types of compute intensive workloads!\n\n5. Your result should have three columns: `race_year`, `lap_time_seconds`, and `lap_moving_avg_5_years`. \n![assets/python-development/chart_5yr_lap_time_avg.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-development/chart_5yr_lap_time_avg.png) \n\nWe were able to quickly calculate a 5 year moving average using python instead of having to sort our data and worry about lead and lag SQL commands. Clicking on the **Chart** button next to **Results**, we can see that lap times seem to be trending down with small fluctuations until 2010 and 2011 which coincides with drastic Formula 1 [regulation changes](https://en.wikipedia.org/wiki/History_of_Formula_One_regulations) including cost-cutting measures and in-race refueling bans. So we can safely ascertain lap times are not consistently decreasing.\n\nNow that we've created this dataframe and lap time trend insight, what do we do when we want to scale it? In the next section we'll be learning how to do this by leveraging python transformations in dbt Cloud. \n\n\u003C!-- ------------------------ --\u003E\n## Python transformations in dbt Cloud  \n\n### Our first dbt python model for lap time trends\nLet's get our lap time trends in our data pipeline so we have this data frame to leverage as new data comes in. The syntax of of a dbt python model is a variation of our development code in the python worksheet so we'll be explaining the code and concepts more.\n\nYou might be wondering: How does this work? \u003Cbr\u003E\nOr more specifically: How is dbt able to send a python command over to a Snowflake runtime executing python? \u003Cbr\u003E\n\nAt a high level, dbt executes python models as stored procedures in Snowflake, via Snowpark for python. \n\n**Snowpark for python and dbt python architecture:**\n![architecture_diagram](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/architecture-use-case/Snowpark_for_python_and_dbt_architecture.svg)\n\n1. Open your dbt Cloud browser tab. \n2. Create a new file under the **models \u003E marts \u003E aggregates** directory called `agg_lap_times_moving_avg.py`. \n3. Copy the following code in and **Save** the file:\n    ```python\n    import pandas as pd\n\n    def model(dbt, session):\n        # dbt configuration\n        dbt.config(packages=[\"pandas\"])\n\n        # get upstream data\n        lap_times = dbt.ref(\"mrt_lap_times_years\").to_pandas()\n\n        # describe the data\n        lap_times[\"LAP_TIME_SECONDS\"] = lap_times[\"LAP_TIME_MILLISECONDS\"]/1000\n        lap_time_trends = lap_times.groupby(by=\"RACE_YEAR\")[\"LAP_TIME_SECONDS\"].mean().to_frame()\n        lap_time_trends.reset_index(inplace=True)\n        lap_time_trends[\"LAP_MOVING_AVG_5_YEARS\"] = lap_time_trends[\"LAP_TIME_SECONDS\"].rolling(5).mean()\n        lap_time_trends.columns = lap_time_trends.columns.str.upper()\n        \n        return lap_time_trends.round(1)\n    ```\n4. Let’s break down what this code is doing:\n- First, we are importing the Python libraries that we are using. This is similar to a dbt *package*, but our Python libraries do *not* persist across the entire project.\n- Defining a function called `model` with the parameter `dbt` and `session`. We'll define these more in depth later in this section. You can see that all the data transformation happening is within the body of the `model` function that the `return` statement is tied to.\n- Then, within the context of our dbt model library, we are passing in a configuration of which packages we need using `dbt.config(packages=[\"pandas\"])`.\n- Use the `.ref()` function to retrieve the upstream data frame `mrt_lap_times_years` that we created in our last step using SQL. We cast this to a pandas dataframe (by default it's a Snowpark Dataframe).\n- From there we are using python to transform our dataframe to give us a rolling average by using `rolling()` over `RACE_YEAR`. \n- Convert our Python column names to all uppercase using `.upper()`, so Snowflake recognizes them. **This has been a frequent \"gotcha\" for folks using dbt python so we call it out here.**\nWe won’t go as in depth for our subsequent scripts, but will continue to explain at a high level what new libraries, functions, and methods are doing.\n5. Create the model in our warehouse by clicking **Build**.\n6. We can't preview Python models directly, so let’s open a new file using the **+** button or the Control-N shortcut to create a new scratchpad:\n    ```sql\n    select * from {{ ref('agg_lap_times_moving_avg') }}\n    ```\n7. **Preview** the output. It should look the same as our snowflake python worksheet:\n![assets/python-transformations-dbt-cloud/preview_agg_lap_times_scratchpad.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/python-transformations-dbt-cloud/preview_agg_lap_times_scratchpad.png)\n\n8. We can see we have the same results from our python worksheet development as we have in our codified dbt python project. \n\n### The dbt model, .source(), .ref() and .config() functions\nLet’s take a step back before starting machine learning to both review and go more in-depth at the methods that make running dbt python models possible. If you want to know more outside of this lab’s explanation read the documentation on Python models [here](https://docs.getdbt.com/docs/building-a-dbt-project/building-models/python-models).\n\n- def model(dbt, session). For starters, each Python model lives in a .py file in your models/ folder. It defines a function named `model()`, which takes two parameters:\n    - dbt &mdash; A class compiled by dbt Core, unique to each model, enables you to run your Python code in the context of your dbt project and DAG.\n    - session &mdash; A class representing your data platform’s connection to the Python backend. The session is needed to read in tables as DataFrames and to write DataFrames back to tables. In PySpark, by convention, the SparkSession is named spark, and available globally. For consistency across platforms, we always pass it into the model function as an explicit argument called session.\n- The `model()` function must return a single DataFrame. On Snowpark (Snowflake), this can be a Snowpark or pandas DataFrame.\n- `.source()` and `.ref()` functions. Python models participate fully in dbt's directed acyclic graph (DAG) of transformations. If you want to read directly from a raw source table, use `dbt.source()`. We saw this in our earlier section using SQL with the source function. These functions have the same execution, but with different syntax. Use the `dbt.ref()` method within a Python model to read data from other models (SQL or Python). These methods return DataFrames pointing to the upstream source, model, seed, or snapshot.\n- `.config()`. Just like SQL models, there are three ways to configure Python models:\n    - In a dedicated `.yml` file, within the `models/` directory\n    - Within the model's `.py` file, using the `dbt.config()` method\n    - Calling the `dbt.config()` method will set configurations for your model within your `.py` file, similar to the `{{ config() }} macro` in `.sql` model files. There's a limit to how complex you can get with the `dbt.config()` method. It accepts only literal values (strings, booleans, and numeric types). Passing another function or a more complex data structure is not possible. The reason is that dbt statically analyzes the arguments to `.config()` while parsing your model without executing your Python code. If you need to set a more complex configuration, we recommend you define it using the config property in a [YAML file](https://docs.getdbt.com/reference/resource-properties/config). Learn more about configurations [here](https://docs.getdbt.com/reference/model-configs).\n        ```python \n        def model(dbt, session):\n\n        # setting configuration\n        dbt.config(materialized=\"table\")\n        ```\n9. **Commit and sync** so our project contains our `agg_lap_times_moving_avg.py` model, add a commit message and **Commit changes**. \n\nNow that we understand how to create python transformations we can use them to prepare train machine learning models and generate predictions!\n\n## Machine Learning: training and prediction\n\nIn upstream parts of our data lineage we had dedicated steps and data models to cleaning, encoding, and splitting out the data into training and testing datasets. We do these steps to ensure:\n - We have features for prediction and the predictions aren't erroneous (we filtered our drivers that weren't active drivers present at 2020) &mdash; review `ml_data_prep.py`\n - Representing (encoding) non-numerical data such as categorical and text variables as numbers &mdash; review `covariate_encoding.py`\n - Splitting our data into a training and testing set and a hold out set &mdash; review `training_testing_dataset.py` and `hold_out_dataset_for_prediction.py`\n\nThere are 3 areas to break down as we go since we are working at the intersection all within one model file:\n1. Machine Learning\n2. Snowflake and Snowpark\n3. dbt Python models\n\n\u003C!-- ------------------------ --\u003E\n### Training and saving a machine learning model\n\n1. Project organization remains key, under the `ml` folder make a new subfolder called `training_and_prediction`.\n2. Now create a new file called `train_model_to_predict_position.py` \n![assets/machine-learning-training-prediction/create_train_model_file.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/create_train_model_file.png)\n\n3. Copy and save the following code (make sure copy all the way to the right). You can also copy it from our demo repo by [clicking on this link](https://raw.githubusercontent.com/dbt-labs/python-snowpark-formula1/main/models/ml/training_and_prediction/train_model_to_predict_position.py) and using Ctrl/Cmd+A. \n\n    ```python \n    import snowflake.snowpark.functions as F\n    from sklearn.model_selection import train_test_split\n    import pandas as pd\n    from sklearn.metrics import confusion_matrix, balanced_accuracy_score\n    import io\n    from sklearn.linear_model import LogisticRegression\n    from joblib import dump, load\n    import joblib\n    import logging\n    import sys\n    from joblib import dump, load\n\n    logger = logging.getLogger(\"mylog\")\n\n    def save_file(session, model, path, dest_filename):\n        input_stream = io.BytesIO()\n        joblib.dump(model, input_stream)\n        session._conn.upload_stream(input_stream, path, dest_filename)\n        return \"successfully created file: \" + path\n\n    def model(dbt, session):\n        dbt.config(\n            packages = ['numpy','scikit-learn','pandas','numpy','joblib','cachetools'],\n            materialized = \"table\",\n            tags = \"train\"\n        )\n        # Create a stage in Snowflake to save our model file\n        session.sql('create or replace stage MODELSTAGE').collect()\n        \n        #session._use_scoped_temp_objects = False\n        version = \"1.0\"\n        logger.info('Model training version: ' + version)\n\n        # read in our training and testing upstream dataset\n        test_train_df = dbt.ref(\"training_testing_dataset\")\n\n        #  cast snowpark df to pandas df\n        test_train_pd_df = test_train_df.to_pandas()\n        target_col = \"POSITION_LABEL\"\n\n        # split out covariate predictors, x, from our target column position_label, y.\n        split_X = test_train_pd_df.drop([target_col], axis=1)\n        split_y = test_train_pd_df[target_col]\n\n        # Split out our training and test data into proportions\n        X_train, X_test, y_train, y_test  = train_test_split(split_X, split_y, train_size=0.7, random_state=42)\n        train = [X_train, y_train]\n        test = [X_test, y_test]\n            # now we are only training our one model to deploy\n        # we are keeping the focus on the workflows and not algorithms for this lab!\n        model = LogisticRegression()\n        \n        # fit the preprocessing pipeline and the model together \n        model.fit(X_train, y_train)   \n        y_pred = model.predict_proba(X_test)[:,1]\n        predictions = [round(value) for value in y_pred]\n        balanced_accuracy =  balanced_accuracy_score(y_test, predictions)\n\n        # Save the model to a stage\n        save_file(session, model, \"@MODELSTAGE/driver_position_\"+version, \"driver_position_\"+version+\".joblib\" )\n        logger.info('Model artifact:' + \"@MODELSTAGE/driver_position_\"+version+\".joblib\")\n        \n        # Take our pandas training and testing dataframes and put them back into snowpark dataframes\n        snowpark_train_df = session.write_pandas(pd.concat(train, axis=1, join='inner'), \"train_table\", auto_create_table=True, create_temp_table=True)\n        snowpark_test_df = session.write_pandas(pd.concat(test, axis=1, join='inner'), \"test_table\", auto_create_table=True, create_temp_table=True)\n        \n        # Union our training and testing data together and add a column indicating train vs test rows\n        return  snowpark_train_df.with_column(\"DATASET_TYPE\", F.lit(\"train\")).union(snowpark_test_df.with_column(\"DATASET_TYPE\", F.lit(\"test\")))\n    ```\n\n4. Use the UI **Build** our `train_model_to_predict_position` model.\n5. Breaking down our Python script:\n- We’re importing some helpful libraries.\n    - Defining a function called `save_file()` that takes four parameters: `session`, `model`, `path` and `dest_filename` that will save our logistic regression model file.\n        - `session` &mdash; an object representing a connection to Snowflake.\n        - `model` &mdash; when models are trained they are saved in memory, we will be using the model name to save our in-memory model into a joblib file to retrieve to call new predictions later.\n        - `path` &mdash; a string representing the directory or bucket location where the file should be saved.\n        - `dest_filename` &mdash; a string representing the desired name of the file.\n    - Creating our dbt model\n        - Within this model we are creating a stage called `MODELSTAGE` to place our logistic regression `joblib` model file. This is really important since we need a place to keep our model to reuse and want to ensure it's there. When using Snowpark commands, it's common to see the `.collect()` method to ensure the action is performed. Think of the session as our “start” and collect as our “end” when [working with Snowpark](https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes.html) (you can use other ending methods other than collect).\n        - Using `.ref()` to connect into our `training_and_test_dataset` model.\n        - Now we see the machine learning part of our analysis:\n            - Create new dataframes for our prediction features from our target variable `position_label`.\n            - Split our dataset into 70% training (and 30% testing), train_size=0.7 with a `random_state` specified to have repeatable results.\n            - Specify our model is a logistic regression.\n            - Fit our model. In a logistic regression this means finding the coefficients that will give the least classification error.\n            - Round our predictions to the nearest integer since logistic regression creates a probability between for each class and calculate a balanced accuracy to account for imbalances in the target variable.\n    - Right now our model is only in memory, so we need to use our nifty function `save_file` to save our model file to our Snowflake stage. We save our model as a joblib file so Snowpark can easily call this model object back to create predictions. We really don’t need to know much else as a data practitioner unless we want to. It’s worth noting that joblib files aren’t able to be queried directly by SQL. To do this, we would need to transform the joblib file to an SQL queryable format such as JSON or CSV (out of scope for this workshop).\n    - Finally we want to return our dataframe, but create a new column indicating what rows were used for training and those for training.\n6. Viewing our output of this model:\n![assets/machine-learning-training-prediction/1-preview-train-test-position.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/1-preview-train-test-position.png)\n\n7. Let’s pop back over to Snowflake. To check that our logistic regression model has been stored in our `MODELSTAGE` open a **SQL Worksheet** and use the query below to list objects in your modelstage. Make sure you are in the correct database and development schema to view your stage (this should be `PC_DBT_DB` and your dev schema - for example `dbt_hwatson`). \n    ```sql\n    list @modelstage\n    ```\n![assets/machine-learning-training-prediction/2-list-snowflake-stage.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/2-list-snowflake-stage.png)\n\n8. To investigate the commands run as part of `train_model_to_predict_position.py` script, navigate to Snowflake query history to view it **Home button \u003E Activity \u003E Query History**. We can view the portions of query that we wrote such as `create or replace stage MODELSTAGE`, but we also see additional queries that Snowflake uses to interpret python code.\n![assets/machine-learning-training-prediction/3-view-snowflake-query-history.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/3-view-snowflake-query-history.png)\n\nLet's use our new trained model to create predictions!\n\n\u003C!-- ------------------------ --\u003E\n### Predicting on new data\nIt's time to use that 2020 data we held out to make predictions on!\n\n1. Create a new file under `ml/training_and_prediction` called `apply_prediction_to_position.py` and copy and save the following code (You can also copy it from our demo repo by [clicking on this link](https://raw.githubusercontent.com/dbt-labs/python-snowpark-formula1/main/models/ml/training_and_prediction/apply_prediction_to_position.py) and using Ctrl/Cmd+A.):\n    ```python\n    import logging\n    import joblib\n    import pandas as pd\n    import os\n    from snowflake.snowpark import types as T\n\n    DB_STAGE = 'MODELSTAGE'\n    version = '1.0'\n    # The name of the model file\n    model_file_path = 'driver_position_'+version\n    model_file_packaged = 'driver_position_'+version+'.joblib'\n\n    # This is a local directory, used for storing the various artifacts locally\n    LOCAL_TEMP_DIR = f'/tmp/driver_position'\n    DOWNLOAD_DIR = os.path.join(LOCAL_TEMP_DIR, 'download')\n    TARGET_MODEL_DIR_PATH = os.path.join(LOCAL_TEMP_DIR, 'ml_model')\n    TARGET_LIB_PATH = os.path.join(LOCAL_TEMP_DIR, 'lib')\n\n    # The feature columns that were used during model training\n    # and that will be used during prediction\n    FEATURE_COLS = [\n            \"RACE_YEAR\"\n            ,\"RACE_NAME\"\n            ,\"GRID\"\n            ,\"CONSTRUCTOR_NAME\"\n            ,\"DRIVER\"\n            ,\"DRIVERS_AGE_YEARS\"\n            ,\"DRIVER_CONFIDENCE\"\n            ,\"CONSTRUCTOR_RELAIBLITY\"\n            ,\"TOTAL_PIT_STOPS_PER_RACE\"]\n\n    def register_udf_for_prediction(p_predictor ,p_session ,p_dbt):\n\n        # The prediction udf\n\n        def predict_position(p_df: T.PandasDataFrame[int, int, int, int,\n                                            int, int, int, int, int]) -\u003E T.PandasSeries[int]:\n            # Snowpark currently does not set the column name in the input dataframe\n            # The default col names are like 0,1,2,... Hence we need to reset the column\n            # names to the features that we initially used for training.\n            p_df.columns = [*FEATURE_COLS]\n            \n            # Perform prediction. this returns an array object\n            pred_array = p_predictor.predict(p_df)\n            # Convert to series\n            df_predicted = pd.Series(pred_array)\n            return df_predicted\n\n        # The list of packages that will be used by UDF\n        udf_packages = p_dbt.config.get('packages')\n\n        predict_position_udf = p_session.udf.register(\n            predict_position\n            ,name=f'predict_position'\n            ,packages = udf_packages\n        )\n        return predict_position_udf\n\n    def download_models_and_libs_from_stage(p_session):\n        p_session.file.get(f'@{DB_STAGE}/{model_file_path}/{model_file_packaged}', DOWNLOAD_DIR)\n    \n    def load_model(p_session):\n        # Load the model and initialize the predictor\n        model_fl_path = os.path.join(DOWNLOAD_DIR, model_file_packaged)\n        predictor = joblib.load(model_fl_path)\n        return predictor\n    \n    # -------------------------------\n    def model(dbt, session):\n        dbt.config(\n            packages = ['snowflake-snowpark-python' ,'scipy','scikit-learn' ,'pandas' ,'numpy'],\n            materialized = \"table\",\n            tags = \"predict\"\n        )\n        session._use_scoped_temp_objects = False\n        download_models_and_libs_from_stage(session)\n        predictor = load_model(session)\n        predict_position_udf = register_udf_for_prediction(predictor, session ,dbt)\n        \n        # Retrieve the data, and perform the prediction\n        hold_out_df = (dbt.ref(\"hold_out_dataset_for_prediction\")\n            .select(*FEATURE_COLS)\n        )\n        trained_model_file = dbt.ref(\"train_model_to_predict_position\")\n\n        # Perform prediction.\n        new_predictions_df = hold_out_df.withColumn(\"position_predicted\"\n            ,predict_position_udf(*FEATURE_COLS)\n        )\n        \n        return new_predictions_df\n    ```\n2. Use the UI Build our `apply_prediction_to_position` model.\n3. **Commit and sync** our changes to keep saving our work as we go using the commit message `logistic regression model training and application` before moving on.\n![assets/machine-learning-training-prediction/commit_training_and_prediction.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/commit_training_and_prediction.png)\n![assets/machine-learning-training-prediction/commit_message_training_and_prediction.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/commit_message_training_and_prediction.png)\n\n4. At a high level in this script, we are:\n- Retrieving our staged logistic regression model\n- Loading the model in\n- Placing the model within a user defined function (UDF) to call in line predictions on our driver’s position\n5. At a more detailed level:\n- Import our libraries.\n- Create variables to reference back to the `MODELSTAGE` we just created and stored our model to.\n- The temporary file paths we created might look intimidating, but all we’re doing here is programmatically using an initial file path and adding to it to create the following directories:\n    - LOCAL_TEMP_DIR ➡️ /tmp/driver_position\n    - DOWNLOAD_DIR ➡️ /tmp/driver_position/download\n    - TARGET_MODEL_DIR_PATH ➡️ /tmp/driver_position/ml_model\n    - TARGET_LIB_PATH ➡️ /tmp/driver_position/lib\n- Provide a list of our feature columns that we used for model training and will now be used on new data for prediction.\n- Next, we are creating our main function `register_udf_for_prediction(p_predictor ,p_session ,p_dbt):`. This function is used to register a user-defined function (UDF) that performs the machine learning prediction. It takes three parameters: `p_predictor` is an instance of the machine learning model, `p_session` is an instance of the Snowflake session, and `p_dbt` is an instance of the dbt library. The function creates a UDF named `predict_position` which takes a pandas dataframe with the input features and returns a pandas series with the predictions.\n- ⚠️ Pay close attention to the whitespace here. We are using a function within a function for this script.\n- We have 2 simple functions that are programmatically retrieving our file paths to first get our stored model out of our `MODELSTAGE` and downloaded into the session `download_models_and_libs_from_stage` and then to load the contents of our model in (parameters) in `load_model` to use for prediction.\n- Take the model we loaded in and call it `predictor` and wrap it in a UDF.\n- Return our dataframe with both the features used to predict and the new label.\n\n🧠 Another way to read this script is from the bottom up. This can help us progressively see what is going into our final dbt model and work backwards to see how the other functions are being referenced.\n\n6. Let’s take a look at our predicted position alongside our feature variables. Open a new scratchpad and use the following query. I chose to order by the prediction of who would obtain a podium position:\n    ```sql\n    select * from {{ ref('apply_prediction_to_position') }} order by position_predicted\n    ```\n![assets/machine-learning-training-prediction/preview_predicted_position.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/preview_predicted_position.png)\n\nWe can see that we created predictions in our final dataset for each result. \n\n7. Run a fresh `dbt build` in the command bar to ensure our pipeline is working end to end. This will take a few minutes, (3 minutes and 2.4 seconds to be exact) so it's not a bad time to stretch (we know programmers slouch). This runtime is pretty performant since we're using an X-Smalll warehouse. If you want to speed up the pipeline, you can increase the [warehouse size](https://docs.snowflake.com/en/user-guide/warehouses-overview) (good for SQL) or use a [Snowpark-optimized Warehouses](https://docs.snowflake.com/en/user-guide/warehouses-snowpark-optimized) (good for Python)\n![assets/machine-learning-training-prediction/fresh_dbt_build_full_pipeline.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/machine-learning-training-prediction/fresh_dbt_build_full_pipeline.png)\n\n\n\u003C!-- ------------------------ --\u003E\n## Pipeline Deployment \n\n### Committing all development work \nBefore we jump into deploying our code, let's have a quick primer on environments. Up to this point, all of the work we've done in the dbt Cloud IDE has been in our development environment, with code committed to a feature branch and the models we've built created in our development schema in Snowflake as defined in our Development environment connection. Doing this work on a feature branch, allows us to separate our code from what other coworkers are building and code that is already deemed production ready. Building models in a development schema in Snowflake allows us to separate the database objects we might still be modifying and testing from the database objects running production dashboards or other downstream dependencies. Together, the combination of a Git branch and Snowflake database objects form our environment.\n\nNow that we've completed applying prediction, we're ready to deploy our code from our development environment to our production environment and this involves two steps:\n\n- Promoting code from our feature branch to the production branch in our repository.\n    - Generally, the production branch is going to be named your main branch and there's a review process to go through before merging code to the main branch of a repository. Here we are going to merge without review for ease of this workshop.\n- Deploying code to our production environment.\n    - Once our code is merged to the main branch, we'll need to run dbt in our production environment to build all of our models and run all of our tests. This will allow us to build production-ready objects into our production environment in Snowflake. Luckily for us, the Partner Connect flow has already created our deployment environment and job to facilitate this step.\n\n1. Before getting started, let's make sure that we've committed all of our work to our feature branch. Our working branch,`snowpark-python-workshop`, should be clean. If for some reason you do still have work to commit, you'll be able to select the **Commit and sync**, provide a message, and then select **Commit changes** again.\n2. Once all of your work is committed, the git workflow button will now appear as **Create pull request**. \n![assets/pipeline-deployment/create_pull_request_dbt_cloud_button.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/create_pull_request_dbt_cloud_button.png)\n\n3. This will bring you to your GitHub repo. This will show the commits that encompass all changes made since the last pull request. Since we only added new files we are able to merge into `main` without conflicts.  Click **Create pull request**. \n![assets/pipeline-deployment/review_commits_create_pull_request.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/review_commits_create_pull_request.png)\n\u003C!-- TODO This could be updated to have only the 3 commits to be a bit cleaner. I had an extra from needing to rename a folder.  --\u003E\n\n4. This goes to a **Open a pull request** page. Usually, when merging in a pull request (PR) we would create descriptions and motivations for the work being completed, validation our models work (like a fresh dbt build), and note changes to exisiting models (we only created new models and didn't alter existing ones). Then typically your teammates will review, comment, and independently test out the code on your branch. dbt has created a [pull request template](https://docs.getdbt.com/blog/analytics-pull-request-template) to make PRs as efficient and scalable to your analytics workflow. \n\nThe template is also located in our root directory under `.github` in the file `pull_request_template.md`. When a PR is opened, the template will automatically be pulled in for you to fill out. For the workshop we'll do an abbreviated version of this for example. If you'd like you can just add a quick comment followed by **Merge pull request** since we're doing a workshop in an isolated Snowflake trial account (and won't break anything).\n\nOur abbreviated PR template written markdown:\n![assets/pipeline-deployment/pr_template_writen_markdown.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/pr_template_writen_markdown.png)\n\nPR preview: \n![assets/pipeline-deployment/pr_template_preview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/pr_template_preview.png)\n\n5. Our PR is looking good. Let's **Merge pull request**. \n![assets/pipeline-deployment/merge_pr_github.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/merge_pr_github.png)\n\n6. Then click **Confirm merge**. \n![assets/pipeline-deployment/confirm_merge_github.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/confirm_merge_github.png)\n\n7. It's best practice to keep your repo clean by deleting your working branch once merged into main. You can always restore it later, for now **Delete Branch**. We're all done in GitHub for today!\n![assets/pipeline-deployment/delete_branch_github.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/delete_branch_github.png)\n\n8. Head back over to your dbt Cloud browser tab. Under **Version Control** select **Pull from \"main\"**. If you don't see this, refresh your browser tab and it should appear.\n![assets/pipeline-deployment/pull_from_main_dbt_cloud.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/pull_from_main_dbt_cloud.png)\n\n9. Select **Change branch** to your **main** branch that now appears as (ready-only). \n![assets/pipeline-deployment/change_branch_dbt_cloud.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/change_branch_dbt_cloud.png)\n![assets/pipeline-deployment/change_to_main.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/change_to_main.png)\n![assets/pipeline-deployment/checkout_main_branch.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/checkout_main_branch.png)\n\n10. Finally, to bring our changes from our `main` branch in GitHub, select **Pull from remote**\n![assets/pipeline-deployment/pull_from_remote_dbt_cloud.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/pull_from_remote_dbt_cloud.png)\n\n11. Now that all of our development work has been merged to the main branch, we can build our deployment job. Given that our production environment and production job were created automatically for us through Partner Connect, all we need to do here is update some default configurations to meet our needs.\n12. In the menu, select **Deploy** **\u003E Environments**\n![assets/pipeline-deployment/deploy_environments_ui.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/deploy_environments_ui.png)\n\n\n### Setting your production schema \n1. You should see two environments listed and you'll want to select the **Deployment** environment then **Settings** to modify it.\n2. Before making any changes, let's touch on what is defined within this environment. The Snowflake connection shows the credentials that dbt Cloud is using for this environment and in our case they are the same as what was created for us through Partner Connect. Our deployment job will build in our `PC_DBT_DB` database and use the default Partner Connect role and warehouse to do so. The deployment credentials section also uses the info that was created in our Partner Connect job to create the credential connection. However, it is using the same default schema that we've been using as the schema for our development environment.\n3. Let's update the schema to create a new schema specifically for our production environment. Click **Edit** to allow you to modify the existing field values. Navigate to **Deployment Credentials \u003E** **schema.**\n4. Update the schema name to **production**. Remember to select **Save** after you've made the change.\n![assets/pipeline-deployment/setting-production-schema/name_production_schema.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/setting-production-schema/name_production_schema.png)\n\n5. By updating the schema for our production environment to **production**, it ensures that our deployment job for this environment will build our dbt models in the **production** schema within the `PC_DBT_DB` database as defined in the Snowflake Connection section.\n\n### Creating multiple jobs \nIn machine learning you rarely want to retrain your model as often as you want new predictions. Model training is compute intensive and requires person time for development and evaluation, while new predictions can run through an existing model to gain insights about drivers, customers, events, etc. This problem can be tricky, but dbt Cloud makes it easy by: automatically creating dependencies from your code and making setup for environments and jobs simple.\n\nWith this in mind we're going to have two jobs:\n- One job that initially builds or retrains our machine learning model. This job will run all the models in our project, and was already created through partner connect. \n- Another job that focuses on creating predictions from the existing machine learning model. This job will exclude model training by using syntax to exclude running `train_model_to_predict_position.py`. This second job requires that you have already created a trained model in a previous run and that it is in your MODELSTAGE area. \n\n\n1. Let's look at over to our production job created by partner connect. Click on the deploy tab again and then select **Jobs**. \n![assets/pipeline-deployment/creating-multiple-jobs/deploy_jobs_ui.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/deploy_jobs_ui.png) You should see an existing and preconfigured **Partner Connect Trial Job**. ![assets/pipeline-deployment/creating-multiple-jobs/pc_default_job.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/pc_default_job.png) \n\n2. Similar to the environment, click on the job, then select **Settings** to modify it. Let's take a look at the job to understand it before making changes.\n![assets/pipeline-deployment/creating-multiple-jobs/pc_job_settings.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/pc_job_settings.png) \n\n- The Environment section is what connects this job with the environment we want it to run in. This job is already defaulted to use the Deployment environment that we just updated and the rest of the settings we can keep as is. \n- The Execution settings section gives us the option to generate docs, run source freshness, and defer to a previous run state. For the purposes of our lab, we're going to keep these settings as is as well and stick with just generating docs.\n- The Commands section is where we specify exactly which commands we want to run during this job. The command `dbt build` will run and test all the models our in project. We'll keep this as is.\n- Finally, we have the Triggers section, where we have a number of different options for scheduling our job. Given that our data isn't updating regularly here and we're running this job manually for now, we're also going to leave this section alone. \n  \n3. So, what are we changing then? The job name and commands!\n- Click **Edit** to allow you to make changes. Then update the name of the job to **Machine learning initial model build or retraining** this may seem like a mouthful, but naming with an entire data team is helpful (or our future selves after not looking at a project for 3 months). \n- Go to **Execution Settings \u003E Commands**. Click **Add Command** and input `dbt build`.\n![assets/pipeline-deployment/creating-multiple-jobs/edit_pc_job.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/edit_pc_job.png) \n\n- Delete the existing commands `dbt seed`, `dbt run`, and `dbt test`. Together they make up the functions of `dbt build` so we are simplifying our code. \n![assets/pipeline-deployment/creating-multiple-jobs/edit_commands.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/edit_commands.png) \n![assets/pipeline-deployment/creating-multiple-jobs/delete_commands.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/delete_commands.png) \n\n- After that's done, DON'T FORGET CLICK **Save**.\n4. Now let's go to run our job. Clicking on the job name in the path at the top of the screen will take you back to the job run history page where you'll be able to click **Run** to kick off the job. In total we produced 106 entities: 14 view models, 67 tests, 24 table models, 1 incremental model. \n![assets/pipeline-deployment/creating-multiple-jobs/run_job.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/run_job.png) \n\n5. Let's go over to Snowflake to confirm that everything built as expected in our production schema. Refresh the database objects in your Snowflake account and you should see the production schema now within our default Partner Connect database. If you click into the schema and everything ran successfully, you should be able to see all of the models we developed. \n![assets/pipeline-deployment/creating-multiple-jobs/job_run_output.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/pipeline-deployment/creating-multiple-jobs/job_run_output.png) \n\n6. Go back to dbt Cloud and navigate to **Deploy \u003E Jobs \u003E Create Job**. Edit the following job settings:\n- Set the **General Settings \u003E Job Name** to **Prediction on data with existing model**\n- Set the **Execution Settings \u003E Commands** to `dbt build --exclude train_model_to_predict_position`\n- We can keep all other job settings the same \n- **Save** your job settings \n7. Run your job using **Run Now**. Remember the only difference between our first job and this job is we are excluding model retraining. So we will have one less model in our outputs. We can confirm this in our run steps.\n8. Open the job and go to **Run Steps \u003E Invoke**. In our job details we can confirm one less entity (105 instead of 106). \n\nThat wraps all of our hands on the keyboard time for today! \n\n## Conclusion\n\nFantastic! You’ve finished the workshop! We hope you feel empowered in using both SQL and Python in your dbt Cloud workflows with Snowflake. Having a reliable pipeline to surface both analytics and machine learning is crucial to creating tangible business value from your data. \n\nTo learn more about how to combine Snowpark and dbt Cloud for smarter production, visit [our page](https://www.getdbt.com/partners/snowflake/?utm_medium=paid-search&utm_source=google&utm_campaign=q2-2024_us-nonbrand-snowflake_co&utm_content=_kw-dbt-snowflake-ex___&utm_term=all_all__&utm_term=dbt%20snowflake&utm_campaign=us-nonbrand-data-documentation_co&utm_source=adwords&utm_medium=ppc&hsa_acc=8253637521&hsa_cam=20228840529&hsa_grp=156636570624&hsa_ad=660652830669&hsa_src=g&hsa_tgt=kwd-1396665886035&hsa_kw=dbt%20snowflake&hsa_mt=e&hsa_net=adwords&hsa_ver=3&gad=1&gclid=CjwKCAjw-7OlBhB8EiwAnoOEk5VEMt-wpzr1XV8PHx2BybhKYhXNoajhZf7jt5ZT43dukzca--hLhhoCY_cQAvD_BwE) where you can [book a demo](https://www.getdbt.com/contact-demo/) to talk to an expert and [try our quickstart](https://docs.getdbt.com/quickstarts/snowflake?step=1) focusing on dbt basics such as setup, connections, tests, and documentation.  \n\nFinally, for more help and information join our [dbt community Slack](https://www.getdbt.com/community/) which contains more than 65,000 data practitioners today. We have a dedicated slack channel #db-snowflake to Snowflake related content. Happy dbt'ing!\n","multiValue":false,":type":"text/x-markdown"},"quickstartArticleLogoImage":{"dataType":"string","title":"Quickstart Article Logo Image","multiValue":false,":type":"text/plain"}},"elementsOrder":["quickstartArticleBody","quickstartArticleLogoImage"],"model":"snowflake-site/models/quickstart-article"},"flexible_column_cont":{"id":"flexible-column-container-b0d79b821f","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"none","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-8918e0da30",":items":{"quickstart_last_modi":{"id":"quickstart-last-modified-e201bcbaad","icon":{"id":"icon","icon":"calendar",":type":"snowflake-site/components/icon","appliedCssClassNames":"snowflake-icon-blue"},"lastModifiedDatePrefix":"Updated","lastModifiedDate":"2025-12-20",":type":"snowflake-site/components/quickstart/quickstart-last-modified","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"},"text":{"id":"text-5396190002","additionalClasses":"qs-disclaimer-text","text":"\u003Cp\u003E\u003Cspan style=\"color: #666;\"\u003EThis content is provided as is, and is not maintained on an ongoing basis. It may be out of date with current Snowflake instances\u003C/span\u003E\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"}},":itemsOrder":["quickstart_last_modi","text"],":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container"},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-bb96a383fe",":items":{},":itemsOrder":[],":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container"},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["contentfragment","flexible_column_cont"],":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container"},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-3e3ea8759e",":items":{"quickstart_table_of_":{"layout":"SIMPLE","id":"container-f9bb5c5d2a","isDeveloperGuidesPage":false,":items":{"quickstart_table_of_":{"id":"quickstart-table-of-content-d20de9368d","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python",":type":"snowflake-site/components/quickstart/quickstart-table-of-content","headings":["\u003Ch2\u003EOverview\u003C/h2\u003E","\u003Ch2\u003EArchitecture and use case overview\u003C/h2\u003E","\u003Ch2\u003EGetting started with Snowflake\u003C/h2\u003E","\u003Ch2\u003ELoad data into Snowflake\u003C/h2\u003E","\u003Ch2\u003ELaunching dbt cloud through partner connect\u003C/h2\u003E","\u003Ch2\u003EForking repository into dbt Cloud\u003C/h2\u003E","\u003Ch2\u003EGiving dbt cloud repo write access using github deploy keys\u003C/h2\u003E","\u003Ch2\u003EIDE overview and building our dbt project\u003C/h2\u003E","\u003Ch2\u003EUnderstanding our existing pipeline\u003C/h2\u003E","\u003Ch2\u003EData modeling: review sources and staging\u003C/h2\u003E","\u003Ch2\u003ESQL Transformations\u003C/h2\u003E","\u003Ch2\u003EPython development in snowflake python worksheets\u003C/h2\u003E","\u003Ch2\u003EPython transformations in dbt Cloud\u003C/h2\u003E","\u003Ch2\u003EMachine Learning: training and prediction\u003C/h2\u003E","\u003Ch2\u003EPipeline Deployment\u003C/h2\u003E","\u003Ch2\u003EConclusion\u003C/h2\u003E"]},"quickstart_button":{"id":"quickstart-button-21223ab5d5","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python",":type":"snowflake-site/components/quickstart/quickstart-button","appliedCssClassNames":"snowflake-responsive-component-top-padding-none"}},":itemsOrder":["quickstart_table_of_","quickstart_button"],":type":"snowflake-site/components/quickstart/quickstart-table-of-content/quickstart-table-of-content-container"}},":itemsOrder":["quickstart_table_of_"],":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container"},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"},"markup_editor":{"id":"markup-editor-88dfc0e0b9","title":"Page CSS","cssContent":"#quickstart-template-main-flexible-container{padding:24px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{grid-template-columns:1fr 0}.qs-disclaimer-text p \u003E span{font-size:15px !important}@media (min-width:768px){#quickstart-template-main-flexible-container{padding:24px 32px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{grid-template-columns:7fr 3fr;gap:48px}}@media (max-width:767px){#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{gap:0}}@media (min-width:1024px){#quickstart-template-main-flexible-container{padding:0 92px 48px 92px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{gap:117px}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["quickstart_hero","flexible_column_cont","markup_editor"],":type":"wcm/foundation/components/responsivegrid"},"modal_container":{"layout":"SIMPLE","id":"container-0bd4d8e02a",":items":{},":itemsOrder":[],":type":"snowflake-site/components/modal/modal-container"},"experiencefragment-footer":{"id":"experiencefragment-8c0282dce5","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/jcr:content","configured":true,":items":{"root":{"additionalClasses":"sf-footer","layout":"SIMPLE","id":"container-ba7afe7e4e",":items":{"container_copy":{"additionalClasses":"sf-footer__inner","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-802536d045","appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small",":items":{"flexible_column_cont":{"id":"flexible-column-container-0b4b095a4c","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"medium","bottomPadding":"extra-small","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"propertiesCSSClasses":"sf-footer-grid","backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-43b26246ab",":items":{"container":{"additionalClasses":"sf-footer-grid__inner","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","container_1622723482":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy_":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy":"aem-GridColumn aem-GridColumn--default--12","container_copy":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-9c04660d54","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"container_1622723482":{"additionalClasses":"sf-footer__column","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-8fecf57378","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"container":{"additionalClasses":"sf-footer__newsletter-group","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12","marketo_v2":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-ec03db8dd8","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"text":{"id":"text-d7ea9f3dbb","additionalClasses":"sf-footer__newsletter-title","text":"\u003Cp\u003E\u003Cb\u003ESubscribe to our monthly newsletter\u003C/b\u003E\u003C/p\u003E\r\n\u003Cp\u003EStay up to date on Snowflake’s latest products, expert insights and resources—right in your inbox!\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-regular text-color-text-04"},"marketo_v2":{"id":"marketo-v2-ac36f016e0","marketoForm":{"edit":false,"successUrl":null,"formId":"45871","hidden":null,"script":null,"values":null},"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com","marketoConfigured":true,"formConfigured":true,":type":"snowflake-site/components/form/marketo-v2"}},":itemsOrder":["text","marketo_v2"],":type":"snowflake-site/components/container"}},":itemsOrder":["container"],":type":"snowflake-site/components/container"},"container":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text_copy":"aem-GridColumn aem-GridColumn--default--12","text":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-490a7534e4","appliedCssClassNames":"snowflake-responsive-container-inner-padding-medium",":items":{"text":{"id":"text-983a5c16b5","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003EProduct\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/platform/\"\u003EPlatform\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/product/snowflake-cowork/\"\u003ESnowflake CoWork\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/data-engineering/\"\u003EData Engineering\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/analytics/\"\u003EAnalytics\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/ai/\"\u003EAI\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/applications-and-collaboration/\"\u003EApplications &amp; Collaboration\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/pricing-options/\"\u003EPricing\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"text_copy":{"id":"text-2c1b5de77c","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ESupport\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/support/\"\u003ESupport\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/addenda/priority-support-services-description/\"\u003EPriority Support\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://status.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EStatus\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text","text_copy"],":type":"snowflake-site/components/container"},"container_copy_copy":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-262b160e8e","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"text":{"id":"text-779584aeb7","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003E\u003Ca href=\"/en/solutions/industries/\"\u003EIndustries\u003C/a\u003E\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/advertising-media-entertainment/\"\u003EAdvertising, Media &amp; Entertainment\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/financial-services/\"\u003EFinancial Services\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/healthcare-and-life-sciences/\"\u003EHealthcare &amp; Life Sciences\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/manufacturing/\"\u003EManufacturing\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/public-sector/\"\u003EPublic Sector\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/retail-consumer-goods/\"\u003ERetail &amp; Consumer Goods\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/telecom/\"\u003ETelecom\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/solutions/industries/technology/\"\u003ETechnology\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],":type":"snowflake-site/components/container"},"container_copy":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-42a638d146","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"text":{"id":"text-bc662657e4","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ECompany\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/about-snowflake/\"\u003EAbout Snowflake\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/leadership-and-board/\"\u003ELeadership &amp; Board\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://careers.snowflake.com/us/en\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ECareers\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://investors.snowflake.com/overview/default.aspx\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EInvestor Relations\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://trust.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ETrust Center\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/brand-guidelines/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EBrand Guidelines\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/contact/\"\u003EContact\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/news/\"\u003ENewsroom\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/esg/\"\u003EEnvironmental, Social &amp; Governance\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/snowflake-ventures/\"\u003ESnowflake Ventures\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/end-data-disparity/\"\u003EEnd Data Disparity\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/summit/\"\u003ESnowflake Summit 26\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],":type":"snowflake-site/components/container"},"container_copy_copy_":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-91187f6072","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"text":{"id":"text-c41427a469","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ELearn\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/en/resources/\"\u003EResource Library\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/webinars/demo/\"\u003ELive Demos\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/fundamentals/\"\u003EFundamentals\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/training/\"\u003ETraining\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/certifications/\"\u003ECertifications\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://learn.snowflake.com/en/\"\u003ESnowflake University\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/developers/guides\"\u003EDeveloper Guides\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://docs.snowflake.com/\"\u003EDocumentation\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/data-governance/\"\u003EData Governance\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],":type":"snowflake-site/components/container"}},":itemsOrder":["container_1622723482","container","container_copy_copy","container_copy","container_copy_copy_"],":type":"snowflake-site/components/container"}},":itemsOrder":["container"],":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container"},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],":type":"snowflake-site/components/container"},"container_573483281_":{"additionalClasses":"sf-footer__bottom","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container_112062425":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-28df260ea0","appliedCssClassNames":"snowflake-responsive-container-inner-padding-none",":items":{"container_112062425":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-a0a45fd573","appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small",":items":{"flexible_column_cont":{"id":"flexible-column-container-a89fbb4705","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-d35cf36b4c",":items":{"container":{"additionalClasses":"sf-footer__legal-container","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","text_copy_copy_16360":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-2dc6da57f7","appliedCssClassNames":"snowflake-responsive-container-inner-padding-none",":items":{"container":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-a453284180","appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small",":items":{"image":{"id":"image-e05ca63dfa","additionalClasses":"sf-footer__logo","alt":"Snowflake logo","imageLink":{"valid":true,"url":"/en/"},"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/_jcr_content/root/container_573483281_/container_112062425/flexible_column_cont/flexible_column_content_container_1/container/container/image.coreimg.svg/1747882370694/nav-icon-snowflake-bug.svg","lazyEnabled":true,"height":"64","width":"64",":type":"snowflake-site/components/image"}},":itemsOrder":["image"],":type":"snowflake-site/components/container"},"text_copy_copy_16360":{"id":"text-b5d3677c47","additionalClasses":"sf-footer__legal-links","text":"\u003Cul\u003E\r\n\u003Cli\u003E© 2026 Snowflake Inc. All Rights Reserved\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/privacy/privacy-policy/\"\u003EPrivacy Policy\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/en/legal/snowflake-site-terms/\"\u003ESite Terms\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://info.snowflake.com/Preference-center.html\"\u003ECommunication Preferences\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Cbutton id=\"ot-sdk-btn\" class=\"ot-sdk-show-settings\"\u003ECookie Settings\u003C/button\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/privacy/privacy-policy/#12\"\u003EDo Not Share My Personal Information\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/\"\u003ELegal\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"markup_editor":{"id":"markup-editor-57687394f4","title":" ","htmlContent":"\u003Cdiv class=\"sf-footer__social\"\u003E\r\n\u003Cdiv data-testid=\"snowflake-footer-twitter\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://x.com/Snowflake\" data-testid=\"button-external\" aria-label=\"X (Twitter)\" role=\"button\" class=\"snowflake-button-container\" title=\"X (Twitter)\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 59 53\" class=\"button-icon\"\u003E\u003Cpath fill=\"currentColor\" d=\"M46.614 0h9.044L35.8 22.49 59 53H40.795L26.54 34.46 10.223 53H1.18l21.036-24.055L0 0h18.657l12.878 16.937zM43.45 47.72h5.013L16.023 5.085h-5.387z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-linkedin\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.linkedin.com/company/3653845\" data-testid=\"button-external\" aria-label=\"LinkedIn\" role=\"button\" class=\"snowflake-button-container\" title=\"LinkedIn\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M22.223 0H1.772C.792 0 0 .773 0 1.73v20.536C0 23.222.792 24 1.772 24h20.451c.98 0 1.777-.778 1.777-1.73V1.73C24 .773 23.203 0 22.223 0ZM7.12 20.452H3.558V8.995H7.12v11.457ZM5.34 7.434a2.064 2.064 0 1 1 0-4.125 2.063 2.063 0 0 1 0 4.125Zm15.112 13.018h-3.558v-5.57c0-1.326-.024-3.037-1.852-3.037-1.851 0-2.133 1.449-2.133 2.944v5.663H9.356V8.995h3.413v1.566h.047c.473-.9 1.636-1.852 3.365-1.852 3.605 0 4.27 2.372 4.27 5.457v6.286Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-facebook\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.facebook.com/snowflakedb/\" data-testid=\"button-external\" aria-label=\"Facebook\" role=\"button\" class=\"snowflake-button-container\" title=\"Facebook\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M24 12c0-6.627-5.373-12-12-12S0 5.373 0 12c0 5.99 4.388 10.954 10.125 11.854V15.47H7.078V12h3.047V9.356c0-3.007 1.792-4.668 4.533-4.668 1.312 0 2.686.234 2.686.234v2.953H15.83c-1.491 0-1.956.925-1.956 1.875V12h3.328l-.532 3.469h-2.796v8.385C19.612 22.954 24 17.99 24 12Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-youtube\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.youtube.com/user/snowflakecomputing\" data-testid=\"button-external\" aria-label=\"YouTube\" role=\"button\" class=\"snowflake-button-container\" title=\"YouTube\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M23.76 7.2s-.233-1.655-.955-2.381c-.914-.956-1.936-.961-2.405-1.017-3.356-.244-8.395-.244-8.395-.244h-.01s-5.039 0-8.395.244c-.469.056-1.49.06-2.405 1.017C.473 5.545.244 7.2.244 7.2S0 9.145 0 11.086v1.819c0 1.94.24 3.886.24 3.886s.233 1.654.95 2.38c.915.957 2.115.924 2.65 1.027 1.92.183 8.16.24 8.16.24s5.044-.01 8.4-.249c.469-.056 1.49-.06 2.405-1.017.722-.727.956-2.381.956-2.381S24 14.85 24 12.905v-1.819c0-1.94-.24-3.886-.24-3.886ZM9.52 15.113V8.367l6.483 3.385-6.483 3.36Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\r\n\u003C/div\u003E","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container","text_copy_copy_16360","markup_editor"],":type":"snowflake-site/components/container"}},":itemsOrder":["container"],":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container"},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],":type":"snowflake-site/components/container"}},":itemsOrder":["container_112062425"],":type":"snowflake-site/components/container"},"markup_editor_copy":{"id":"markup-editor-3e28568860","title":"New css","cssContent":".snowflake-image-container img{background-color:transparent}div.snowflake-person-chip-avatar{width:80px !important}#snowflake-blog-template-main-container .aem-GridColumn:has(.vertical-video){background-color:#000;border-radius:16px;overflow:hidden}#snowflake-blog-template-main-container .vertical-video{max-width:240px;margin-left:auto;margin-right:auto}@media screen and (min-width:1367px){.dynamic .heading-1-v2 .snowflake-title-v2-line{font-size:72px !important;line-height:60px !important}}.snowflake-flexible-column-container-items-alignment-match-height .download-card,.snowflake-flexible-column-container-items-alignment-match-height .download-card\u003E.container{height:100%}.download-card div.code-toolbar\u003E.toolbar .copy-to-clipboard-button{background-color:white;border:1px solid #a9e1f6;margin-right:4px;top:6px;border-radius:16px;height:26px;width:40px}.download-card .snowflake-code-snippet\u003Ediv.code-toolbar\u003E.toolbar\u003E.toolbar-item\u003Ebutton:before{content:'';background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2' style='stroke:%23249EDC;'%3E%3C/rect%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' style='stroke:%23249EDC;'%3E%3C/path%3E%3C/svg%3E\");background-size:auto 65%;background-position:center;background-repeat:no-repeat;top:0;left:0;width:100%;height:100%}.download-card .snowflake-code-snippet\u003Ediv.code-toolbar\u003E.toolbar\u003E.toolbar-item\u003Ebutton:hover:before{background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2' style='stroke:%23fff;'%3E%3C/rect%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' style='stroke:%23fff;'%3E%3C/path%3E%3C/svg%3E\")}.download-card\u003Ediv{background-color:#fff;border:1px solid #ccc;border-radius:8px;padding:24px}.download-chip__headline{border-bottom:1px solid #ccc;padding-bottom:16px;margin-bottom:16px}.download-chip{padding:8px 12px !important;border-radius:4px;transition:300ms ease background-color}.download-chip .black-blue-text-color .snowflake-title-v2-line{color:#000 !important;padding-right:24px;font-family:'Lato',sans-serif;font-size:14px !important;font-weight:500 !important}.download-chip .black-blue-text-color .snowflake-title-v2-line:not(:first-child){opacity:.6;font-style:italic !important}.download-chip .snowflake-content-chip-button{display:none}.download-chip.is-external-link{background-size:16px 16px;background-image:url(\"data:image/svg+xml,%3Csvg width='15' height='15' viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.06055 13.0607L11.8605 2.26067M13.0605 10.6607V1.06067H3.46055' stroke='%23249EDC' stroke-width='2.12132' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\")}.download-chip{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_883_7979)'%3E%3Cpath d='M3.375 16.875H14.625' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9 1.125V11.25' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M4.5 7.875L9 12.375L13.5 7.875' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_883_7979'%3E%3Crect width='18' height='18' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A\");background-size:24px auto;background-repeat:no-repeat;background-position:calc(100% - 12px) center}.download-chip__headline{display:flex;gap:16px;flex-direction:row !important;flex-wrap:nowrap}.download-chip__headline::before{content:'';display:inline-block;width:24px;height:24px;background-position:center;background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='21' viewBox='0 0 21 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.50005 9.89999C8.13657 9.89999 8.74702 9.64713 9.19711 9.19704C9.64719 8.74696 9.90005 8.13651 9.90005 7.49999V2.69999C9.90005 2.06347 9.64719 1.45302 9.19711 1.00293C8.74702 .552844 8.13657 .299988 7.50005 .299988H2.70005C2.06353 .299988 1.45308 .552844 1.00299 1.00293C.552905 1.45302 .300049 2.06347 .300049 2.69999V7.49999C.300049 8.13651 .552905 8.74696 1.00299 9.19704C1.45308 9.64713 2.06353 9.89999 2.70005 9.89999H7.50005ZM7.50005 7.49999H2.70005V2.69999H7.50005V7.49999Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.50005 20.3C8.13657 20.3 8.74702 20.0472 9.19711 19.5971C9.64719 19.147 9.90005 18.5365 9.90005 17.9V13.1C9.90005 12.4635 9.64719 11.853 9.19711 11.403C8.74702 10.9529 8.13657 10.7 7.50005 10.7H2.70005C2.06353 10.7 1.45308 10.9529 1.00299 11.403C.552905 11.853 .300049 12.4635 .300049 13.1V17.9C.300049 18.5365 .552905 19.147 1.00299 19.5971C1.45308 20.0472 2.06353 20.3 2.70005 20.3H7.50005ZM7.50005 17.9H2.70005V13.1H7.50005V17.9Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.9001 9.89999C18.5366 9.89999 19.147 9.64713 19.5971 9.19704C20.0472 8.74696 20.3001 8.13651 20.3001 7.49999V2.69999C20.3001 2.06347 20.0472 1.45302 19.5971 1.00293C19.147 .552844 18.5366 .299988 17.9001 .299988H13.1001C12.4636 .299988 11.8531 .552844 11.403 1.00293C10.9529 1.45302 10.7001 2.06347 10.7001 2.69999V7.49999C10.7001 8.13651 10.9529 8.74696 11.403 9.19704C11.8531 9.64713 12.4636 9.89999 13.1001 9.89999H17.9001ZM17.9001 7.49999H13.1001V2.69999H17.9001V7.49999Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.9001 20.3C18.5366 20.3 19.147 20.0472 19.5971 19.5971C20.0472 19.147 20.3001 18.5365 20.3001 17.9V13.1C20.3001 12.4635 20.0472 11.853 19.5971 11.403C19.147 10.9529 18.5366 10.7 17.9001 10.7H13.1001C12.4636 10.7 11.8531 10.9529 11.403 11.403C10.9529 11.853 10.7001 12.4635 10.7001 13.1V17.9C10.7001 18.5365 10.9529 19.147 11.403 19.5971C11.8531 20.0472 12.4636 20.3 13.1001 20.3H17.9001ZM17.9001 17.9H13.1001V13.1H17.9001V17.9Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat}.download-chip__headline.is-cli::before{background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 17L10 11L4 5' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M12 19H20' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\")}.download-card pre[class*=language-]{padding:8px 12px;background-color:var(--ui-background-05);overflow:hidden}.download-chip__headline.is-windows,.download-chip__headline.is-mac{gap:12px}.download-chip__headline.is-windows::before{width:16px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='4875' height='4875' viewBox='0 0 4875 4875' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_122_201)'%3E%3Cpath d='M0 0H2311V2310H0V0ZM2564 0H4875V2310H2564V0ZM0 2564H2311V4875H0V2564ZM2564 2564H4875V4875H2564' fill='%23000'/%3E%3C/g%3E%3C/svg%3E\")}.download-chip__headline.is-mac::before{width:16px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns:x='ns_extend;' xmlns:i='ns_ai;' xmlns:graph='ns_graphs;' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0' y='0' viewBox='0 0 41.5 51' style='enable-background:new 0 0 41.5 51;' xml:space='preserve'%3E%3Cmetadata%3E%3Csfw xmlns='ns_sfw;'%3E%3Cslices%3E%3C/slices%3E%3CsliceSourceBounds bottomLeftOrigin='true' height='51' width='41.5' x='166.1' y='-208.1'%3E%3C/sliceSourceBounds%3E%3C/sfw%3E%3C/metadata%3E%3Cg%3E%3Cpath d='M40.2,17.4c-3.4,2.1-5.5,5.7-5.5,9.7c0,4.5,2.7,8.6,6.8,10.3c-.8,2.6-2,5-3.5,7.2c-2.2,3.1-4.5,6.3-7.9,6.3s-4.4-2-8.4-2 c-3.9,0-5.3,2.1-8.5,2.1s-5.4-2.9-7.9-6.5C2,39.5,.1,33.7,0,27.6c0-9.9,6.4-15.2,12.8-15.2c3.4,0,6.2,2.2,8.3,2.2 c2,0,5.2-2.3,9-2.3C34.1,12.2,37.9,14.1,40.2,17.4z M28.3,8.1C30,6.1,30.9,3.6,31,1c0-.3,0-.7-.1-1c-2.9,.3-5.6,1.7-7.5,3.9 c-1.7,1.9-2.7,4.3-2.8,6.9c0,.3,0,.6,.1,.9c.2,0,.5,.1,.7,.1C24.1,11.6,26.6,10.2,28.3,8.1z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E\")}.download-chip__headline.is-desktop::before{background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg opacity='.8'%3E%3Cpath d='M1.5 21H22.5V18H1.5V21Z' fill='%23000' stroke='white' stroke-width='.75'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M19.5 15C20.2956 15 21.0587 14.6839 21.6213 14.1213C22.1839 13.5587 22.5 12.7956 22.5 12V6C22.5 5.20435 22.1839 4.44129 21.6213 3.87868C21.0587 3.31607 20.2956 3 19.5 3H4.5C3.70435 3 2.94129 3.31607 2.37868 3.87868C1.81607 4.44129 1.5 5.20435 1.5 6V12C1.5 12.7956 1.81607 13.5587 2.37868 14.1213C2.94129 14.6839 3.70435 15 4.5 15H19.5ZM19.5 12H4.5V6H19.5V12Z' fill='%23000' stroke='white' stroke-width='.75'/%3E%3C/g%3E%3C/svg%3E%0A\")}.download-card .snowflake-code-snippet,.download-card .snowflake-code-snippet code,.download-card .snowflake-code-snippet pre{font-size:14px;color:#000;text-shadow:none !important}.download-chip:hover{background-color:var(--ui-background-05) !important;transition:300ms ease background-color}body:has(.snowflake-skip-to-content[style]) #subNav,.pushdown-banner-dismissed #subNav{top:var(--scroll-padding-top) !important;transition:300ms ease top}body:has(.snowflake-skip-to-content[style*=\"58\"]) #subNav{top:34px !important}body:has(.snowflake-skip-to-content[style*=\"82\"]) #subNav{top:58px !important}body:has(.snowflake-skip-to-content[style*=\"130\"]) #subNav{top:106px !important}body:has(.snowflake-skip-to-content[style*=\"138\"]) #subNav{top:114px !important}body:has(.snowflake-skip-to-content[style*=\"146\"]) #subNav{top:122px !important}.is-hidden .snowflake-person-chip-avatar{display:none}.is-small .snowflake-person-chip-avatar{width:56px;height:56px}.ai-summary ul{margin:16px 0 0 0 !important;padding:0 !important;list-style-type:none}.ai-summary li{margin:0;padding:0 0 0 32px;position:relative}.ai-summary li::before{content:\"\";display:block;border-radius:100%;background:#29b5e8;width:18px;height:18px;position:absolute;top:4px;left:0;border:5px solid #e5f2f7;box-sizing:border-box}.ai-summary li:not(:last-child){margin-bottom:1rem}.snowflake-content-chip-image__image{aspect-ratio:5 / 3 !important}.content-chip-new .snowflake-content-chip-image__image{height:100% !important;aspect-ratio:unset !important}.snapshot-card .snowflake-text p:not(:first-child){margin-top:var(--spacing-01)}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2) p:has(b){font-family:'Texta',sans-serif;margin-top:24px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2) p b{font-weight:700 !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2){border-bottom:1px solid #ccc;padding-bottom:24px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) p:first-child:has(b){font-family:'Texta',sans-serif;font-size:20px !important;margin-bottom:1rem !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) li{display:inline-block}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) li a{display:inline-block;text-decoration:none;padding:4px 16px !important;border:1px solid #ccc;border-radius:24px;color:#666 !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) ul{list-style-type:none;display:flex;padding:0 !important;margin:0 !important;gap:12px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container img{width:90%;max-width:240px;margin:0 auto}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container{padding:40px;max-width:450px;margin:0 0 0 auto;background-color:#fff;box-shadow:0 2px 6px 0 rgba(152,162,179,.25),0 10px 20px 0 rgba(152,162,179,.10);border-radius:8px;border-top:4px solid var(--ui-01)}.ai-summary{background-color:#f3fbfe;border-left:2px solid var(--ui-01);padding:40px}.ai-summary\u003Espan p:last-child:has(i){color:#666;font-size:14px !important}.ai-summary\u003Espan p:last-child:has(i) a{color:#666 !important;text-decoration:underline !important}.ai-summary\u003Espan p:last-child:has(i) a:hover{color:var(--ui-01) !Important}.ai-summary\u003Espan p:first-child:has(b)::after{content:'';display:inline-block;width:20px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.3158 3.15226C8.6475 6.2258 6.22698 8.64545 3.15232 9.31587C2.94923 9.36072 2.94923 9.63928 3.15232 9.68413C6.22698 10.3522 8.6475 12.7742 9.3158 15.8477C9.36067 16.0508 9.63933 16.0508 9.6842 15.8477C10.3525 12.7742 12.773 10.3545 15.8477 9.68413C16.0508 9.63928 16.0508 9.36072 15.8477 9.31587C12.773 8.64781 10.3525 6.2258 9.6842 3.15226C9.63933 2.94925 9.36067 2.94925 9.3158 3.15226Z' fill='%23249EDC'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.3725 11.5461C16.9098 13.6739 15.2341 15.3491 13.1054 15.8132C12.9649 15.8443 12.9649 16.0371 13.1054 16.0681C15.2341 16.5307 16.9098 18.2074 17.3725 20.3353C17.4035 20.4758 17.5965 20.4758 17.6275 20.3353C18.0902 18.2074 19.7659 16.5323 21.8946 16.0681C22.0352 16.0371 22.0352 15.8443 21.8946 15.8132C19.7659 15.3507 18.0902 13.6739 17.6275 11.5461C17.5965 11.4055 17.4035 11.4055 17.3725 11.5461Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-repeat:no-repeat;background-size:contain;background-position:center;vertical-align:middle;margin-left:8px}.ai-summary\u003Espan p:first-child:has(b){color:var(--ui-01) !important;text-transform:uppercase}.border-top{border-top:1px solid rgba(0,0,0,.2)}.border-top\u003Espan{display:block;padding-top:32px}body .snowflake-card-v2-advanced-image__image{aspect-ratio:16 / 9 !important}.content-chip-new .snowflake-content-chip-image__image{border-radius:0;object-fit:cover;height:100%}.sf-footer #ot-sdk-btn.ot-sdk-show-settings,.sf-footer #ot-sdk-btn.optanon-show-settings{color:rgba(255,255,255,.7) !important;text-underline-offset:4px;border-top:none;border-left:none;border-right:none;border-bottom:1px dotted transparent;background-color:transparent !important;background-image:none !important;transition:300ms ease text-decoration-color;padding:0 !important;font-size:12px;font-family:'Lato',sans-serif}.sf-footer #ot-sdk-btn.ot-sdk-show-settings:hover,.sf-footer #ot-sdk-btn.optanon-show-settings:hover{color:rgba(255,255,255,1) !important;border-bottom:1px dotted var(--ui-01);transition:300ms ease text-decoration-color}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{flex-shrink:0}.sf-footer__disclaimers{background-color:#042130}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p a{color:inherit;text-decoration:none !important}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p sup{margin-right:2px}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p{text-indent:-5px;padding-left:5px}.sf-footer__disclaimers-inner{border-top:1px solid rgba(255,255,255,.25);padding:40px 0}.sf-footer__disclaimers .snowflake-simple-stat{align-items:flex-start;text-align:left;color:rgba(255,255,255,.7);margin-bottom:10px}.sf-footer__social{display:flex;justify-content:center;gap:12px}.sf-footer .snowflake-footer-social-item{margin:0 !important}.sf-footer .snowflake-footer-social-item a{line-height:0;background-color:rgba(3,24,35,.8);display:inline-block;width:48px !important;height:48px;border-radius:8px;display:inline-flex;justify-content:center;align-items:center;transition:300ms ease background-color}.sf-footer .snowflake-footer-social-item a:hover{background-color:var(--ui-01) !important;transition:300ms ease background-color}.sf-footer__bottom{padding-bottom:40px}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoError .mktoErrorMsg{max-width:100%;color:#fff}.sf-footer .mktoForm .mktoError .mktoErrorMsg .mktoErrorDetail{display:inline-block}.sf-footer .mktoFormRow:has(.mktoHtmlText:empty){display:none}.sf-footer .mktoFormRow .mktoHtmlText span{color:#fff !important}.sf-footer{background-color:#042130}.sf-footer .optanon-toggle-display:hover{text-decoration-color:var(--ui-01) !important;cursor:pointer !important;text-underline-offset:4px;text-decoration-style:dotted !important;text-decoration-color:var(--ui-01);color:#fff !important;transition:300ms ease text-decoration-color;text-decoration:underline;opacity:1}.sf-footer__logo{width:40px}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{row-gap:32px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:space-between;align-items:center;text-align:center;row-gap:16px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2){text-align:center;flex-grow:1}.sf-footer__legal-links li button,.sf-footer__legal-links li a,.sf-footer__legal-links li{margin:0;color:rgba(255,255,255,.7) !important;font-weight:500}.sf-footer__legal-links li a:hover{color:rgba(255,255,255,1) !important}.sf-footer div.sf-footer__copyright p,.sf-footer div.sf-footer__legal-links li,.sf-footer div.sf-footer__legal-links a,.sf-footer div.sf-footer__legal-links p{font-size:12px !important}.sf-footer__legal-links ul{list-style-type:none;margin:0;padding:0;display:flex;gap:20px;row-gap:4px;justify-content:center;flex-wrap:wrap;text-align:center}.sf-footer__legal-links li:last-child{width:100%}.sf-footer .mktoFormRow:has(.mktoPlaceholder),.sf-footer .mktoFormRow:has(input[type=\"hidden\"]){display:none !important}.sf-footer .mktoFormCol{margin-bottom:0 !important}.sf-footer label[for=\"adhoc1\"]{width:auto !important;flex-grow:1;margin-left:16px}.sf-footer .mktoFieldWrap:has(label[for=\"adhoc1\"]){display:flex;flex-direction:row-reverse;margin-top:22px}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoCheckboxList input[type=checkbox]{background-color:transparent !important;border:1px solid rgba(255,255,255,.4) !important;border-radius:4px !important}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select{background-color:transparent !important;color:#fff !important;height:auto !important;border:1px solid rgba(255,255,255,.4) !important;border-radius:4px !important;padding:12px 18px !important}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select:focus{border-color:var(--ui-01) !important}.sf-footer .mktoForm *{padding:0 !important}.sf-footer .mktoForm,.sf-footer .snowflake-marketo-form-container{padding:0 !important;background:transparent;margin-bottom:0;box-shadow:none}.sf-footer .mktoHtmlText.mktoHasWidth{width:100% !important;margin:24px 0}.sf-footer .mktoFormRow{flex-direction:column}.sf-footer .mktoForm .mktoButtonWrap{margin:0 !important}.sf-footer select{background-image:url(\"data:image/svg+xml,%3Csvg width='14' height='8' viewBox='0 0 14 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M.981445 1.43496L6.90897 7.32496L12.9314 1.33496' stroke='white' stroke-width='1.33333' stroke-miterlimit='10' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\") !important}.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative{justify-content:flex-start}.sf-footer *::placeholder{color:#fff !important;opacity:.8}.sf-footer .mktoForm .mktoButtonWrap.mktoSimple .mktoButton{background-color:var(--ui-01) !important;color:#fff !important;width:100% !important;padding:12px 16px !important;border:1px solid var(--ui-01) !important;background-image:none !important;border-radius:48px;text-transform:uppercase;font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:16px !important;line-height:1.2}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoHtmlText\u003Espan,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoLabel\u003Espan,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap label.mktoLabel{color:#fff !important}.sf-footer__newsletter-title p:not(:first-child){margin-top:8px !important}.sf-footer__newsletter-title p b{font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:22px !important;line-height:1.2}.sf-footer__newsletter-title p:last-child{font-size:14px !important;opacity:.8}.sf-footer__link-group li a[target=\"_blank\"]::after{content:'';display:inline-block;width:10px;height:10px;margin-left:5px;background-image:url(\"data:image/svg+xml,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.72222 1.22222C6.38471 1.22222 6.11111 .948616 6.11111 .611111C6.11111 .273607 6.38471 0 6.72222 0H10.3889C10.551 0 10.7064 .0643867 10.821 .178988C10.9356 .293596 11 .449032 11 .611111V4.27778C11 4.61529 10.7264 4.88889 10.3889 4.88889C10.0514 4.88889 9.77778 4.61529 9.77778 4.27778V2.08647L4.09879 7.76545C3.86013 8.00409 3.4732 8.00409 3.23454 7.76545C2.99589 7.52681 2.99589 7.13986 3.23454 6.90122L8.91355 1.22222H6.72222ZM0 2.44444C0 1.76943 .547207 1.22222 1.22222 1.22222H4.27778C4.61529 1.22222 4.88889 1.49583 4.88889 1.83333C4.88889 2.17084 4.61529 2.44444 4.27778 2.44444H1.22222V9.77778H8.55556V6.72222C8.55556 6.38471 8.82915 6.11111 9.16667 6.11111C9.50418 6.11111 9.77778 6.38471 9.77778 6.72222V9.77778C9.77778 10.4528 9.23059 11 8.55556 11H1.22222C.547207 11 0 10.4528 0 9.77778V2.44444Z' fill='white'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;background-position:center}.sf-footer__link-group ul,.sf-footer__link-group li{margin:0;padding:0;list-style-type:none}.sf-footer__link-group ul{margin-top:20px !important}.sf-footer__link-group li{margin-top:15px}.sf-footer div.sf-footer__link-group\u003Espan\u003Ep\u003Ea,.sf-footer div.sf-footer__link-group\u003Espan\u003Ep{color:var(--ui-01) !important;font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:20px !important;line-height:1.2}.sf-footer__link-group li a{opacity:.9;color:#fff !important;font-weight:500 !important;font-size:15px !important;line-height:1.3}.sf-footer__link-group li a:hover{opacity:1}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container::before,.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container::after{display:none}.sf-footer__column{flex-grow:1}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:first-child){width:50%}@media (min-width:800px){.sf-footer__legal-links ul{justify-content:flex-start;text-align:left}.sf-footer__social{justify-content:flex-end}.sf-footer__legal-links ul{padding-left:24px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container{text-align:right;flex-wrap:nowrap}.sf-footer__legal-links.align-left ul{justify-content:flex-start}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:space-between;flex-direction:row}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto !important;max-width:200px}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;order:2;width:100% !important;max-width:none}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto}}@media screen and (min-width:1380px){.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{flex-wrap:nowrap}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{padding-right:48px;max-width:380px;background-color:rgba(3,24,35,.4);padding:32px;margin-left:48px;border-radius:16px}.sf-footer__link-group li,.sf-footer__link-group li a{font-size:14px !important;line-height:1.3}}@media screen and (max-width:991px){.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{order:2;margin-top:24px !important}}@media screen and (max-width:420px){.is-reduced-mobile .heading-1-v2,.is-reduced-mobile .heading-1-v2-sm{font-size:32px;line-height:28px}}.quote-content-chip{background-color:var(--ui-background-05);padding:24px;border-radius:12px;position:relative}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan{color:rgba(0,0,0,.8) !important;font-size:15px !important;line-height:1.5 !important;font-family:'Lato',sans-serif;font-weight:400 !important}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan:not(:first-child){max-width:calc(100% - 200px)}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan:nth-child(2){font-family:'Texta',sans-serif;color:#000 !important;font-size:20px !important;font-weight:800 !important;margin-top:24px}.quote-content-chip .snowflake-content-chip-image{width:140px !important}@media screen and (min-width:992px){.quote-content-chip .snowflake-content-chip-image{position:absolute !important;bottom:24px;right:16px}}@media screen and (max-width:991px){.quote-content-chip .snowflake-content-chip-image{margin-bottom:40px}.quote-content-chip{flex-direction:column}}#spa-root{background-color:#fff}.lowercase .snowflake-title-v2-line{text-transform:none !important}.centered .snowflake-logo-content-container-inner{justify-content:center}div.snowflake-linklist-dropdown-menu{max-height:380px}.first-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:first-child{color:var(--ui-01) !important}.is-front{position:relative;z-index:2}.use-case-body .snowflake-text h1,.use-case-body .snowflake-text h2,.use-case-body .snowflake-text h3,.use-case-body .snowflake-text h4,.use-case-body .snowflake-text h5,.use-case-body .snowflake-text h6{font-family:'Texta',sans-serif;color:#000;margin:.25rem 0 0 0}.pc-hero .button-group\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:flex-start}.sf-footer .mktoFormRow .mktoHtmlText span{font-family:'Lato',sans-serif !important}.snowflake-button-primary.snowflake-button-blue .snowflake-button-container{justify-content:center}.related-chip-25{background-color:#fff;border:1px solid rgba(204,204,204,.5);border-radius:8px;padding:20px;position:relative}.related-chip-25:hover{box-shadow:rgba(152,162,179,.1) 0 10px 20px 0}.related-chip-25:hover::after{right:24px;transition:300ms ease right}.related-chip-25::after{content:'';display:block;transition:300ms ease right;background-image:url(\"data:image/svg+xml,%3Csvg width='8' height='14' viewBox='0 0 8 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.66699 7C7.66699 6.6571 7.53559 6.32825 7.30169 6.08578L2.34446 .947072C1.84529 .429617 1.0164 .429617 .517219 .947072C.0427878 1.43887 .042788 2.21798 .517219 2.70978L4.65591 7L.51722 11.2902C.0427889 11.782 .0427887 12.5611 .51722 13.0529C1.0164 13.5704 1.84529 13.5704 2.34447 13.0529L7.30169 7.91421C7.53559 7.67175 7.66699 7.34289 7.66699 7Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\");width:8px;height:14px;display:block;position:absolute;right:30px;top:50%;transform:translateY(-50%);background-size:contain;background-position:center;background-repeat:no-repeat}.related-chip-25 .heading-5-v2{font-size:22px;line-height:1.1}.related-chip-25 .snowflake-content-chip-image{width:48px;flex-shrink:0}.related-chip-25 .snowflake-content-chip-image__image{aspect-ratio:1;height:auto;object-fit:contain}.related-chip-25 .snowflake-content-chip-button{display:none}.related-chip-25 .snowflake-content-chip-content-without-tag{flex-grow:1;padding-right:24px}.case-study-25.small-logo .snowflake-case-study-card-logo img{width:60px !important}.swiper-slide .case-study-25{width:95%;margin-left:auto;margin-right:auto}.case-study-25 .snowflake-case-study-card-logo img{width:140px !important;height:auto !important;transform:none !important;margin:24px 0 8px 0}.case-study-25 .snowflake-case-study-card-image__image{object-position:left center}.case-study-25 .snowflake-case-study-card-information-container{padding-right:24px}.case-study-25 ul{list-style-type:none;padding:0;margin:8px 0 0 0}.case-study-25 li{font-size:15px !important;line-height:1.3 !important;display:flex;flex-direction:column;border-left:4px solid var(--ui-01);padding-left:24px;margin-top:24px;color:#535862;gap:4px}.case-study-25 li b{display:block;font-family:'Texta',sans-serif;font-weight:900 !important;font-size:48px !important;line-height:.9 !important;color:var(--ui-01)}.case-study-25 .snowflake-case-study-card-description p{color:#535862}.case-study-25 .snowflake-case-study-card-description p:nth-child(2):not(:has(a)){color:#000;font-family:Texta;font-size:30px !important;line-height:1 !important;font-style:normal;font-weight:700;text-indent:-8px}.case-study-25.is-story .snowflake-case-study-card-description p:nth-child(2):not(:has(a)){text-indent:0}.case-study-25 .snowflake-case-study-card-key-card{background-color:transparent}.case-study-25 .snowflake-case-study-card-button{display:none}.case-study-25{border-radius:24px;overflow:hidden}@media screen and (min-width:1024px){.case-study-25 .snowflake-case-study-card-left-container{position:static;width:60%;min-height:0}.case-study-25 .snowflake-case-study-card-right-container::after{content:'';display:block;width:60%;max-width:340px;padding-bottom:50%;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 22 16' class='snowflake-pushdown-banner-placeholder-arrow'%3E%3Cpath fill='%2329B5E8' fill-rule='evenodd' d='M17.865 8.756c.088-.274.124-.555.118-.834a2.551 2.551 0 0 0-1.3-2.142L7.887.76C6.645.055 5.063.475 4.35 1.7a2.535 2.535 0 0 0 .947 3.494l4.916 2.809-4.916 2.801a2.543 2.543 0 0 0-.947 3.502c.713 1.222 2.295 1.64 3.537.934l8.796-5.024a2.541 2.541 0 0 0 1.182-1.46Z' clip-rule='evenodd'%3E%3C/path%3E%3C/svg%3E\");background-size:contain;background-repeat:no-repeat;position:absolute;top:-10%;left:-20%}.case-study-25 .snowflake-case-study-card-right-container{max-width:none;width:40%;position:absolute;top:-5%;right:-5%;z-index:0;height:110%}}@media screen and (min-width:768px){.case-study-25 li{max-width:50%}.case-study-25 ul{display:flex;gap:48px}}.snowflake-text.section-eyebrow p{margin-left:auto;margin-right:auto;margin-bottom:16px !important}.snowflake-text.section-eyebrow p,.snowflake-text.eyebrow-text p{text-transform:uppercase;font-family:'Texta',sans-serif !important;font-weight:800 !important;letter-spacing:.025em;margin-bottom:12px;line-height:1.1 !important}.snowflake-title-v2.dynamic .heading-2-v2 span.snowflake-title-v2-line{font-size:clamp(2.5rem,4.5vw,4rem) !important;line-height:.82 !important}.checklist ul{padding:0;margin:0}.checklist ul li{list-style-type:none;padding-left:32px;position:relative}.checklist ul li:not(:last-child){margin-bottom:1em}.checklist ul li::before{content:'';display:inline-block;width:20px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='25' viewBox='0 0 24 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect y='.985352' width='24' height='24' rx='12' fill='%23D4F0FA'/%3E%3Cpath d='M7.28613 13.2967L10.7147 16.7253L17.5718 9.86816' stroke='%2329B5E8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;position:absolute;top:3px;left:0}.last-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:last-child{color:var(--ui-01)}.snowflake-text p sup{line-height:0}.snowflake-title-v2.lowercase .heading-3-v2{font-size:28px;line-height:1;text-transform:none;font-weight:700}.snowflake-title-v2.lowercase .heading-2-v2{font-size:32px;line-height:1;text-transform:none;font-weight:700}.content-chip-new{border:1px solid rgba(204,204,204,.5);border-radius:16px;overflow:hidden}.content-chip-new .snowflake-image-container{border-radius:0;display:none}.content-chip-new .snowflake-content-chip-image{margin-right:0;max-width:180px;flex-shrink:0}.content-chip-new .snowflake-content-chip-content{padding:24px}.content-chip-new .black-blue-text-color .snowflake-title-v2-line:first-child{font-size:24px;line-height:1.1}.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child){font-family:'Lato',sans-serif;font-size:17px;color:#535862 !important;font-weight:500;line-height:1.45;margin-top:8px;display:none}div.snowflake-text a{font-weight:normal;color:var(--ui-01);text-decoration:underline;text-underline-offset:4px;text-decoration-style:dotted !important;text-decoration-color:transparent;transition:300ms ease text-decoration-color}div.snowflake-text a:hover{text-decoration-color:var(--ui-01);transition:300ms ease text-decoration-color}.footer-nav__link-group .snowflake-button-container,.subnav__item--button,.snowflake-card-v2-advanced-button .snowflake-button-container{justify-content:flex-start}.button-container\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center}.button-container\u003E.container\u003E.cmp-container\u003E.aem-container .snowflake-button-primary+.snowflake-button-link{margin-left:12px !important}.snowflake-button-regular.snowflake-button-link .snowflake-button-container{font-size:18px !important;text-align:left;justify-content:flex-start;line-height:1.4 !important}body .snowflake-card-v2-advanced{border:1px solid rgba(204,204,204,.5);border-radius:var(--spacing-02);transition:300ms ease all}body .snowflake-card-v2-advanced:hover{transform:translateY(-10px);box-shadow:rgba(152,162,179,.1) 0 10px 20px 0;transition:300ms ease all}body .snowflake-card-v2-advanced-inner{border-bottom:none}body .snowflake-card-v2-advanced-image{line-height:0}body .snowflake-card-v2-advanced-image__image{aspect-ratio:16 / 9}body .snowflake-card-v2-advanced-content{position:relative}body .snowflake-card-v2-advanced-content::after{content:'';display:block;position:absolute;bottom:0;left:0;transition:300ms ease all;width:20%;height:4px;background-color:var(--ui-01);opacity:0}body .snowflake-card-v2-advanced:hover .snowflake-card-v2-advanced-content::after{width:100%;opacity:1;transition:300ms ease all}body .snowflake-card-v2-advanced .snowflake-button-link.snowflake-button-blue .snowflake-button-container\u003E.link-icon{transition:300ms ease transform}body .snowflake-card-v2-advanced:hover .snowflake-button-link.snowflake-button-blue .snowflake-button-container\u003E.link-icon{transform:translateX(4px);transition:300ms ease transform}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-wrap:wrap;gap:24px}.six-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.three-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.four-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.five-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center}.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:100%;margin:0 !important}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(50% - 12px);margin:0 !important}@media screen and (min-width:768px){.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(50% - 12px)}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.333% - 16px)}}@media screen and (min-width:1024px){.snowflake-title-v2.lowercase .heading-3-v2{font-size:34px}.snowflake-title-v2.lowercase.larger .heading-2-v2{font-size:44px;line-height:.95}.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.333% - 16px)}.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(25% - 18px)}.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(20% - 19.2px)}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(16.6666% - 20px)}.snowflake-title-v2.lowercase .heading-3-v2{font-size:28px !important}}@media screen and (min-width:1200px){.snowflake-title-v2.lowercase .heading-2-v2{font-size:40px}.content-chip-new .snowflake-content-chip-content{padding:32px}.content-chip-new .snowflake-image-container,.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child){display:block}}.promo-banner-25{border-radius:16px;overflow:hidden}.promo-banner-25 .snowflake-premium-content-banner-image-container{position:relative;max-width:380px}.promo-banner-25 .snowflake-text{color:#535862}.promo-banner-25 .snowflake-premium-content-banner-image__image{transform:translateY(8px);transition:300ms ease transform;border-radius:0;width:85%;margin:0 auto;display:block;position:relative;z-index:1}.promo-banner-25 .snowflake-premium-content-banner-image__link:hover .snowflake-premium-content-banner-image__image{transform:translateY(0);transition:300ms ease transform}.promo-banner-25 .snowflake-premium-content-banner-image__inner{height:auto;padding-top:24px}.promo-banner-25 .snowflake-premium-content-banner-image__link{position:relative;z-index:1;height:auto}.promo-banner-25 .snowflake-premium-content-banner-image__link::after{content:'';display:block;position:absolute;clip-path:polygon(0 0,66% 0,100% 100%,0 100%);bottom:0;left:0;width:100%;height:100%;background:var(--ui-01);transition:300ms ease width}.promo-banner-25 .snowflake-premium-content-banner-image__link:hover::after{width:110%;transition:300ms ease width}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select{background-position:95% 50%}.sf-footer__disclaimers .text-size-small .snowflake-text p{color:#fff !important;font-size:10px !important;opacity:.8}@media screen and (min-width:768px){.sf-footer__disclaimers .text-size-small .snowflake-text p{font-size:12px !important}}@media screen and (max-width:1023px){.mobile-top-padding{padding-top:64px}}@media (max-width:799px){.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative .mktoButton{width:100% !important}.sf-footer__logo{text-align:center;display:block;margin:0 auto}}.customer-card .snowflake-card-v2-advanced-image{aspect-ratio:4.35 / 1}.customer-card .snowflake-card-v2-advanced-image__image{width:100%;height:100%;padding-left:8px;object-fit:contain;object-position:left center;margin:0 !important;aspect-ratio:initial}.customer-card .snowflake-card-v2-advanced-image__inner{height:110px}.customer-card .snowflake-card-v2-advanced-tag-indicator{display:none}.pc-hero .snowflake-container-arrow-small-gray-image{top:-34% !important;width:18% !important}.pc-hero .snowflake-container-arrow-small-gray-image path{fill:var(--ui-01);opacity:1}@media screen and (max-width:767px){.mobile-padding-top{padding-top:64px}.hide-mobile{display:none !important}.pc-hero{padding-top:52px}.pc-hero .snowflake-text p,.pc-hero .left-alignment .snowflake-title-v2-line,.pc-hero h1 span{text-align:center !important}}div.snowflake-pushdown-banner-button{margin-top:0}.button-group.align-center\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center;justify-content:center !important}.text-center .snowflake-breadcrumb-swiper .swiper-wrapper{justify-content:center}div.snowflake-breadcrumb a.snowflake-breadcrumb-item,.snowflake-breadcrumb div.snowflake-breadcrumb-item{text-transform:none;font-weight:500}.snowflake-breadcrumb svg{display:none !important}.snowflake-breadcrumb a:has(svg)::after{content:'/';margin:0 12px;color:#666}.hide-filters .snowflake-filterable-and-searchable-grid-top-part{display:none !important}.page-section{padding-left:24px;padding-right:24px}@media screen and (min-width:768px){.page-section{padding-left:48px;padding-right:48px}}.download-card pre[class*=language-]{overflow-x:scroll !important}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container_copy","container_573483281_","markup_editor_copy"],":type":"snowflake-site/components/container"}},":itemsOrder":["root"],":type":"snowflake-site/components/experiencefragment","classNames":"aem-xf"},"markup_editor":{"id":"markup-editor-87b8d850b2","title":"Quickstarts Overrides","cssContent":".snowflake-markdown blockquote{padding:24px 32px;background:#f6f9fa;border:1px solid #29b5e8;border-radius:16px}.snowflake-markdown .snowflake-image-container img{width:auto !important;max-width:100%}.snowflake-markdown .snowflake-text ol{padding-left:20px !important}.snowflake-markdown .snowflake-text li{margin:0 0 12px 0 !important}.snowflake-markdown h3.snowflake-markdown-h3{font-size:20px !important;font-family:Texta,sans-serif !important}@media (min-width:768px){.snowflake-markdown h3.snowflake-markdown-h3{font-size:28px !important}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["experiencefragment-banner","experiencefragment-header","markup_editor_1950346551","responsivegrid","modal_container","experiencefragment-footer","markup_editor"],":type":"wcm/foundation/components/responsivegrid"}},":itemsOrder":["root"],"coveoConfig":{"organizationId":"snowflakecomputingproduction8neljofn","apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d","pipeline":"snowflake.com","searchHub":"snowflake.com"},"analyticsDebugMode":false,"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"quickstart-page-template","templateName":"quickstart-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python","language":"en","category":"general","pageName":"Leverage dbt Cloud to Generate ML ready pipelines using Snowpark python","contentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/product/ai","snowflake-site:taxonomy/product/applications-and-collaboration"]},":hierarchyType":"page",":path":"/content/snowflake-site/global/en/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python","analyticsContentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/product/ai","snowflake-site:taxonomy/product/applications-and-collaboration"],"analyticsEnabled":true,"isPasswordProtected":false,":mappedPath":"/en/developers/guides/leverage-dbt-cloud-to-generate-ml-ready-pipelines-using-snowpark-python/",":type":"snowflake-site/components/structure/page","locale":"en"}
  