{"allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"designPath":"/libs/settings/wcm/designs/default","brandSlug":"","componentsResourceTypes":["snowflake-site/components/quickstart/quickstart-button","snowflake-site/components/nav/nav-column/nav-column-container","snowflake-site/components/structure/page","snowflake-site/components/button","snowflake-site/components/quickstart/quickstart-hero","snowflake-site/components/quickstart/quickstart-table-of-content","snowflake-site/components/experiencefragment","snowflake-site/components/mega-header","snowflake-site/components/modal/modal-container","snowflake-site/components/image","snowflake-site/components/nav/nav-dropdown-header","snowflake-site/components/wistia-video/cta","nt:folder","snowflake-site/components/container","snowflake-site/components/nav/nav-dropdown-menu","snowflake-site/components/nav/nav-column","snowflake-site/components/flexible-column-container","snowflake-site/components/quickstart/quickstart-table-of-content/quickstart-table-of-content-container","snowflake-site/components/button/embedded","snowflake-site/components/icon","snowflake-site/components/nav/nav-mega","cq:LiveCopy","snowflake-site/components/quickstart/quickstart-last-modified","snowflake-site/components/nav/nav-promo-section","snowflake-site/components/markup-editor","snowflake-site/components/text","snowflake-site/components/title-v2","snowflake-site/components/nav/nav-dropdown-footer","nt:unstructured","nt:file","snowflake-site/components/contentfragment","snowflake-site/components/nav/nav-item","snowflake-site/components/nav/nav-promo-card","snowflake-site/components/form/marketo-v2","snowflake-site/components/nav/language-navigation","snowflake-site/components/title","wcm/foundation/components/responsivegrid","nt:resource","snowflake-site/components/structure/xfpage","snowflake-site/components/flexible-column-container/flexible-column-content-container","snowflake-site/components/pushdown-banner"],"templateName":"quickstart-page-template","cssClassNames":"page basicpage summit-page","dataLayerClientlibIncluded":true,"dataLayerName":"adobeDataLayer","clientlibsAsync":false,"lastModifiedDate":1770925655925,"language":"en","description":"Build robust data engineering pipelines with Snowpark Python for ELT, CDC processing, and data transformations.","title":"Data Engineering Pipelines with Snowpark Python","tags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/solution-center/certification/community-sourced","snowflake-site:taxonomy/solution-center/includes/architecture","snowflake-site:taxonomy/product/data-engineering","snowflake-site:taxonomy/snowflake-feature/transformation"],"analyticsPageType":"quickstart-page-template","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,":hierarchyType":"page",":path":"/content/snowflake-site/global/en/developers/guides/data-engineering-pipelines-with-snowpark-python","analyticsDebugMode":false,"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"quickstart-page-template","templateName":"quickstart-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/developers/guides/data-engineering-pipelines-with-snowpark-python","language":"en","category":"general","pageName":"Data Engineering Pipelines with Snowpark Python","contentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/solution-center/certification/community-sourced","snowflake-site:taxonomy/solution-center/includes/architecture","snowflake-site:taxonomy/product/data-engineering","snowflake-site:taxonomy/snowflake-feature/transformation"]},"analyticsEnabled":true,"coveoConfig":{"apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d","organizationId":"snowflakecomputingproduction8neljofn","searchHub":"snowflake.com","pipeline":"snowflake.com"},"isPasswordProtected":false,"analyticsContentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/solution-center/certification/community-sourced","snowflake-site:taxonomy/solution-center/includes/architecture","snowflake-site:taxonomy/product/data-engineering","snowflake-site:taxonomy/snowflake-feature/transformation"],":mappedPath":"/en/developers/guides/data-engineering-pipelines-with-snowpark-python/",":type":"snowflake-site/components/structure/page",":items":{"root":{"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"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"experiencefragment-banner":{"id":"experiencefragment-656037dae2","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"pushdown_banner_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-a8bfc021ec",":type":"snowflake-site/components/container",":items":{"pushdown_banner_copy":{"id":"pushdown-banner-5a38341375","contentHeadline":"Summit Builder Keynote Debut","contentDescription":"Broadcast live on June 23","contentJustifyContent":"center","linkStyle":"text-white","linkCTA":{"id":"link-cta","heapButtonClasses":["pushdown_banner"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://reg.snowflake.com/flow/snowflake/summit26/digitalreg/page/main"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":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"]},"image":{":type":"nt:unstructured"},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:metadata"],"classNames":"aem-xf"},"experiencefragment-header":{"id":"experiencefragment-a14b498dde","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"mega_header":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-84764c00df",":type":"snowflake-site/components/container",":items":{"markup_editor":{"id":"markup-editor-3cd907af60","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-c2586d8feb",":type":"snowflake-site/components/mega-header",":items":{"nav_mega":{"activeItem":"item_1719963657751_c_663444255","id":"tabs-860d844e23",":type":"snowflake-site/components/nav/nav-mega",":items":{"item_1719963657751_c_663444255":{"id":"nav-dropdown-menu-197e66460a","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-1c3d8fcb78",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"additionalClasses":"nav-platform-sidebar","numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-e3f545711b",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-e80ba7fd15","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-c3b751f06b","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-a5d86c6556","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-5170401da5","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-64b9e49d7d","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-59eb981c71","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-2860d44e97","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"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","navColumnTitle":"Featured Capabilities","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-5b9f65bdb2",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_212715":{"id":"nav-item-ca28a6f583","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-3762824d9a","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-407ed79277","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-58ae2d37ea","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-d1a6090367","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"]},"nav_column_692142673":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-9a210e6525",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_660590_1739526127":{"id":"nav-item-44286337b8","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-c49072eeb8","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-60dc7eac59","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-cf1012d7e0","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-289a0d7688","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"]},"nav_column_782221091":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-c8fbc47177",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-8e57a030ec","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-da1dd49d5a","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-bd66006caa","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-e4e03704dc","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-730cba6eca","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"]}},":itemsOrder":["nav_column","nav_column_copy_copy","nav_column_692142673","nav_column_782221091"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Product"},"nav_dropdown_menu_2":{"id":"nav-dropdown-menu-4710384fc4","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-4bd6ea753c",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"navColumnTitle":"INDUSTRIES","numberOfSubColumns":"one-column","minWidth":"280","layout":"SIMPLE","id":"container-07b69e5006",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_361384_2056203141":{"id":"nav-item-f66fd746cf","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-4951ad8aea","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-46f1ea5eda","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-03b13be617","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-3fe57ce58b","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-8f6b0e5c85","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-1f9ac158e4","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-dbfc9bb460","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-07ee685a65","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-fedbbae8b8","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"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"nav_column_copy":{"navColumnTitle":"DEPARTMENTS","numberOfSubColumns":"one-column","minWidth":"160","layout":"SIMPLE","id":"container-61977df9af",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-0d7e15ba3a","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-785119bc54","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-9857ee5aa7","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"]},"nav_column_833417450":{"navColumnTitle":"Enablement Solutions","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-111d0da478",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_107772":{"id":"nav-item-43cf66ffeb","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-c988542f3d","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_107772","nav_item_copy_copy"]},"nav_column_copy_copy":{"navColumnTitle":"PARTNER SOLUTIONS","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-7d0e806d78",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-efc9a182e8","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-68574ef013","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-2d1199db56","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"]}},":itemsOrder":["nav_column","nav_column_copy","nav_column_833417450","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Solutions"},"item_1719963657751_c":{"id":"nav-dropdown-menu-7f43da990c","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-4f29610567",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-7ce6c959fc",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-8c4d77d7ad","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"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","numberOfSubColumns":"two-columns","maxWidth":"1200","layout":"SIMPLE","id":"container-51c879b1ae",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-edc6b8f5eb","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-99eb83f268","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-0fcc34d484","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-8a24710d14","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565_903555964":{"id":"nav-item-a538afd60d","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,":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"]}},":itemsOrder":["nav_column","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Why Snowflake"},"item_1719961362824":{"id":"nav-dropdown-menu-1df6d82b0e","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-6280bbe369",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","minWidth":"124","layout":"SIMPLE","id":"container-0330bfa4e2",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-f34b9bd161","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-6aa640ac44","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-ede433f04a","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-33330e7811","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"]},"nav_column_44600420__826130542":{"navColumnTitle":"Learn","numberOfSubColumns":"two-columns","layout":"SIMPLE","id":"container-08e5cc8ffb",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-da293f3cec","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-23654ae4fa","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_1984107859":{"id":"nav-item-0fa9b12999","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1438098918":{"id":"nav-item-6b00f9e7ad","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_143809":{"id":"nav-item-a0088c83fe","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890638":{"id":"nav-item-594d6723c1","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945":{"id":"nav-item-7836b1824c","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890":{"id":"nav-item-24f4344fe3","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890_930852828":{"id":"nav-item-2fd70637b0","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,":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"]}},":itemsOrder":["nav_column_copy","nav_column_44600420__826130542"]},"nav_promo_section":{"id":"nav-promo-section-70339fa5c1","experience_fragment_1":{"id":"experiencefragment-1c7db42c98","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master1/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-6bee086448",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-8d0f59ee02","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?quality=85&preferwebp=true","lazyEnabled":true,"height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-de7cba645c","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-2/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-e2f9e720b2",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-adbd62a458","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?quality=85&preferwebp=true","lazyEnabled":true,"height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},"experience_fragment_3":{"id":"experiencefragment-a63375c35b","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-3/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-d9ee6a1bda",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-116ea28ce6","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?quality=85&preferwebp=true","lazyEnabled":true,"height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"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-a055dd55d5","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-349e5a8d3d",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy_copy":{"navColumnTitle":"Build","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-7c29d8dbed",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-0ca69e5c11","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-83db7362ff","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-d57c4f50af","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246","nav_item_copy"]},"nav_column_copy_copy_1367930678":{"navColumnTitle":"Learn","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-6cfc98d494",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-cc962b6f0d","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-3c80690590","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-ce995b0be9","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_copy"]},"nav_column_copy_copy_1101894776":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-56d355f318",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-ee210ecafe","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-c3c6031869","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,":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246"]}},":itemsOrder":["nav_column_copy_copy","nav_column_copy_copy_1367930678","nav_column_copy_copy_1101894776"]},"nav_promo_section":{"id":"nav-promo-section-df106f695f","experience_fragment_1":{"id":"experiencefragment-2e7a32c0e9","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-5/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-de5cd2c28f",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-27a133872d","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?quality=85&preferwebp=true","lazyEnabled":true,"height":"210","width":"415",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"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"],"classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-830991310f","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-440a98d50f",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-6bc8e62c98","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?quality=85&preferwebp=true","lazyEnabled":true,"height":"700","width":"1440",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"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"],"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-bf86e05753","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-97a8e5f006","languageNavItems":[{"title":"English","path":"/en/developers/guides/data-engineering-pipelines-with-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-57cd835d5c","heapButtonClasses":["mega-nav__sign-in"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://app.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-link snowflake-button-black snowflake-button-compact","text":"Sign in"},"button":{"id":"button-923ea115ca","heapButtonClasses":["contact_nav","heap-nav-contact"],"showOutboundIcon":true,"buttonLink":{"valid":true,"url":"/en/contact-sales/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-secondary snowflake-button-blue snowflake-button-compact","text":"CONTACT SALES"},"button_288358396":{"id":"button-7e7fecc911","heapButtonClasses":["start_for_free_nav","heap-nav-start-for-free"],"showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://signup.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-primary snowflake-button-blue snowflake-button-compact","text":"start for free"}},":itemsOrder":["nav_mega","languagenavigation","button_1177328691","button","button_288358396"],"appliedCssClassNames":"snowflake-header-container white"}},":itemsOrder":["markup_editor","mega_header"]},"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"],"classNames":"aem-xf"},"markup_editor_1950346551":{"id":"markup-editor-c8e64777f0","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":{"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"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"quickstart_hero":{"id":"quickstart-hero-ba1aa48afe","isDeveloperGuidesPage":false,"quickstartHeroFirstCertifiedTag":{"tagText":"Community Solution","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/solution-center/certification/community-sourced","tagIcon":""},"quickstartHeroTitle":{"lines":["Data Engineering Pipelines with Snowpark Python"],"type":"heading2",":type":"snowflake-site/components/title-v2"},"quickstartHeroAuthor":"Jeremiah Hansen","quickstartHeroFirstSnowflakeFeatureTag":{"tagText":"Transformation","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/snowflake-feature/transformation","tagIcon":""},"quickstartHeroForkRepoLink":{"id":"button-bbbf6bb7f3","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://github.com/Snowflake-Labs/sfquickstarts/tree/master/site/sfguides/src/data-engineering-pipelines-with-snowpark-python"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Fork Repo"},"quickstartHeroOpenInSnowflakeLink":{"id":"button-384972b214","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://app.snowflake.com/templates?template=data_engineering_pipelines_snowpark_python&utm_source=build&utm_medium=templates&utm_campaign=guides&utm_content=nov25"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Open in Snowflake"},"quickstartHeroBreadcrumbs":[{"title":"Data Engineering Pipelines with Snowpark Python","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides/data-engineering-pipelines-with-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}],"fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/data-engineering-pipelines-with-snowpark-python",":type":"snowflake-site/components/quickstart/quickstart-hero"},"flexible_column_cont":{"id":"flexible-column-container-c2506cf0da","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-6aba7f46d2",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"contentfragment":{"id":"contentfragment-c1032a07d9","paragraphs":["\u003Ch2\u003EOverview\u003C/h2\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E&quot;Data engineers are focused primarily on building and maintaining data pipelines that transport data through different steps and put it into a usable state ... The data engineering process encompasses the overall effort required to create \u003Cstrong\u003Edata pipelines\u003C/strong\u003E that automate the transfer of data from place to place and transform that data into a specific format for a certain type of analysis. In that sense, data engineering isn&rsquo;t something you do once. It&rsquo;s an ongoing practice that involves collecting, preparing, transforming, and delivering data. A data pipeline helps automate these tasks so they can be reliably repeated. It&rsquo;s a practice more than a specific technology.&quot; (From Cloud Data Engineering for Dummies, Snowflake Special Edition)\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EAre you interested in unleashing the power of Snowpark Python to build data engineering pipelines? Well then, this Quickstart is for you! The focus here will be on building data engineering pipelines with Python, and not on data science. For examples of doing data science with Snowpark Python please check out our \u003Ca href=\"/en/developers/guides/getting-started-snowpark-machine-learning/\"\u003EMachine Learning with Snowpark Python: - Credit Card Approval Prediction\u003C/a\u003E Quickstart.\u003C/p\u003E\n","\u003Cp\u003EThis Quickstart will cover a lot of ground, and by the end you will have built a robust data engineering pipeline using Snowpark Python stored procedures. That pipeline will process data incrementally, be orchestrated with Snowflake tasks, and be deployed via a CI/CD pipeline. You'll also learn how to use Snowflake's new developer CLI tool and Visual Studio Code extension! Here's a quick visual overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003ESo buckle up and get ready!\u003C/p\u003E\n","\u003Ch3\u003EPrerequisites\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EFamiliarity with Python\u003C/li\u003E\u003Cli\u003EFamiliarity with the DataFrame API\u003C/li\u003E\u003Cli\u003EFamiliarity with Snowflake\u003C/li\u003E\u003Cli\u003EFamiliarity with Git repositories and GitHub\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EWhat You&rsquo;ll Learn\u003C/h3\u003E\n","\u003Cp\u003EYou will learn about the following Snowflake features during this Quickstart:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowflake's Table Format\u003C/li\u003E\u003Cli\u003EData ingestion with COPY\u003C/li\u003E\u003Cli\u003ESchema inference\u003C/li\u003E\u003Cli\u003EData sharing/marketplace (instead of ETL)\u003C/li\u003E\u003Cli\u003EStreams for incremental processing (CDC)\u003C/li\u003E\u003Cli\u003EStreams on views\u003C/li\u003E\u003Cli\u003EPython UDFs (with third-party packages)\u003C/li\u003E\u003Cli\u003EPython Stored Procedures\u003C/li\u003E\u003Cli\u003ESnowpark DataFrame API\u003C/li\u003E\u003Cli\u003ESnowpark Python programmability\u003C/li\u003E\u003Cli\u003EWarehouse elasticity (dynamic scaling)\u003C/li\u003E\u003Cli\u003EVisual Studio Code Snowflake native extension (PuPr, Git integration)\u003C/li\u003E\u003Cli\u003ESnowCLI (PuPr)\u003C/li\u003E\u003Cli\u003ETasks (with Stream triggers)\u003C/li\u003E\u003Cli\u003ETask Observability\u003C/li\u003E\u003Cli\u003EGitHub Actions (CI/CD) integration\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EWhat You&rsquo;ll Need\u003C/h3\u003E\n","\u003Cp\u003EYou will need the following things before beginning:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowflake account\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EA Snowflake Account\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EA Snowflake user created with ACCOUNTADMIN permissions\u003C/strong\u003E. This user will be used to get things setup in Snowflake.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EAnaconda Terms &amp; Conditions accepted\u003C/strong\u003E. See Getting Started section in \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-packages.html#getting-started\"\u003EThird-Party Packages\u003C/a\u003E.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EGitHub account\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EA GitHub account\u003C/strong\u003E. If you don't already have a GitHub account you can create one for free. Visit the \u003Ca href=\"https://github.com/signup\"\u003EJoin GitHub\u003C/a\u003E page to get started.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EWhat You&rsquo;ll Build\u003C/h3\u003E\n","\u003Cp\u003EDuring this Quickstart you will accomplish the following things:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ELoad Parquet data to Snowflake using schema inference\u003C/li\u003E\u003Cli\u003ESetup access to Snowflake Marketplace data\u003C/li\u003E\u003Cli\u003ECreate a Python UDF to convert temperature\u003C/li\u003E\u003Cli\u003ECreate a data engineering pipeline with Python stored procedures to incrementally process data\u003C/li\u003E\u003Cli\u003EOrchestrate the pipelines with tasks\u003C/li\u003E\u003Cli\u003EMonitor the pipelines with Snowsight\u003C/li\u003E\u003Cli\u003EDeploy the Snowpark Python stored procedures via a CI/CD pipeline\u003C/li\u003E\u003C/ul\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EQuickstart Setup\u003C/h2\u003E\n","\u003Ch3\u003EFork the Quickstart Repository and Enable GitHub Actions\u003C/h3\u003E\n","\u003Cp\u003EYou'll need to create a fork of the repository for this Quickstart in your GitHub account. Visit the \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python\"\u003EData Engineering Pipelines with Snowpark Python associated GitHub Repository\u003C/a\u003E and click on the &quot;Fork&quot; button near the top right. Complete any required fields and click &quot;Create Fork&quot;.\u003C/p\u003E\n","\u003Cp\u003EBy default GitHub Actions disables any workflows (or CI/CD pipelines) defined in the forked repository. This repository contains a workflow to deploy your Snowpark Python UDF and stored procedures, which we'll use later on. So for now enable this workflow by opening your forked repository in GitHub, clicking on the \u003Ccode\u003EActions\u003C/code\u003E tab near the top middle of the page, and then clicking on the \u003Ccode\u003EI understand my workflows, go ahead and enable them\u003C/code\u003E green button.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/github-actions-activate.png\" alt=\"assets/github-actions-activate.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ECreate GitHub Codespace\u003C/h3\u003E\n","\u003Cp\u003EFor this Quickstart we will be using \u003Ca href=\"https://docs.github.com/en/codespaces/overview\"\u003EGitHub Codespaces\u003C/a\u003E for our development environment. Codespaces offer a hosted development environment with a hosted, web-based VS Code environment. GitHub currently offers \u003Ca href=\"https://github.com/features/codespaces\"\u003E60 hours for free each month\u003C/a\u003E when using a 2 node environment, which should be more than enough for this lab.\u003C/p\u003E\n","\u003Cp\u003ETo create a GitHub Codespace, click on the green \u003Ccode\u003E&lt;&gt; Code\u003C/code\u003E button from the GitHub repository homepage. In the Code popup, click on the \u003Ccode\u003ECodespaces\u003C/code\u003E tab and then on the green \u003Ccode\u003ECreate codespace on main\u003C/code\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/codespace_setup.png\" alt=\"assets/codespace_setup.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EThis will open a new tab and begin setting up your codespace. This will take a few minutes as it sets up the entire environment for this Quickstart. Here is what is being done for you:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ECreating a container for your environment\u003C/li\u003E\u003Cli\u003EInstalling Anaconda (miniconda)\u003C/li\u003E\u003Cli\u003ECreating a directory and default config files\u003C/li\u003E\u003Cli\u003EAnaconda setup\n\u003Cul\u003E\u003Cli\u003ECreating the Anaconda environment\u003C/li\u003E\u003Cli\u003EInstalling the Snowpark Python library\u003C/li\u003E\u003Cli\u003EInstalling the SnowCLI Python CLI\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EVS Code setup\n\u003Cul\u003E\u003Cli\u003EInstalling VS Code\u003C/li\u003E\u003Cli\u003EConfiguring VS Code for the Python Anaconda environment\u003C/li\u003E\u003Cli\u003EInstalling the Snowflake VS Code extension\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EStarting a hosted, web-based VS Code editor\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EOnce the codepsace has been created and started you should see a hosted web-based version of VS Code with your forked repository set up! Just a couple more things and we're ready to start.\u003C/p\u003E\n","\u003Ch3\u003EConfigure Snowflake Credentials\u003C/h3\u003E\n","\u003Cp\u003EBoth the \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/python-connector/python-connector\"\u003ESnowflake Connector for Python\u003C/a\u003E and the SnowCLI tool use the same configuration files, which can be found in the \u003Ccode\u003E~/.snowflake\u003C/code\u003E folder. Default configuration files were created for you during the codespace setup.\u003C/p\u003E\n","\u003Cp\u003EFor this Quickstart you'll only need to edit the \u003Ccode\u003E~/.snowflake/connections.toml\u003C/code\u003E file. The easiest way to edit the default \u003Ccode\u003E~/.snowflake/connections.toml\u003C/code\u003E file is directly from VS Code in your codespace. Type \u003Ccode\u003ECommand-P\u003C/code\u003E, type (or paste) \u003Ccode\u003E~/.snowflake/connections.toml\u003C/code\u003E and hit return. The config file should now be open. You just need to edit the file and replace the \u003Ccode\u003Eaccount\u003C/code\u003E, \u003Ccode\u003Euser\u003C/code\u003E, and \u003Ccode\u003Epassword\u003C/code\u003E with your values. Then save and close the file.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote:\u003C/strong\u003E The SnowCLI tool (and by extension this Quickstart) currently does not work with Key Pair authentication. It simply grabs your username and password details from the config file.\u003C/p\u003E\n","\u003Ch3\u003EVerify Your Anaconda Environment is Activated\u003C/h3\u003E\n","\u003Cp\u003EDuring the codespace setup we created an Anaconda environment named \u003Ccode\u003Esnowflake-demo\u003C/code\u003E. And when VS Code started up it should have automatically activated the environment in your terminal. You should see something like this in the terminal, and in particular you should see \u003Ccode\u003E(snowflake-demo)\u003C/code\u003E before your bash prompt.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/vscode-terminal-conda.png\" alt=\"assets/vscode-terminal-conda.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EIf for some reason it wasn't activiated simply run \u003Ccode\u003Econda activate snowflake-demo\u003C/code\u003E in your terminal.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESetup Snowflake\u003C/h2\u003E\n","\u003Ch3\u003ESnowflake Extensions for VS Code\u003C/h3\u003E\n","\u003Cp\u003EYou can run SQL queries against Snowflake in many different ways (through the Snowsight UI, SnowSQL, etc.) but for this Quickstart we'll be using the Snowflake extension for VS Code. For a brief overview of Snowflake's native extension for VS Code, please check out our \u003Ca href=\"https://marketplace.visualstudio.com/items?itemName=snowflake.snowflake-vsc\"\u003EVS Code Marketplace Snowflake extension page\u003C/a\u003E.\u003C/p\u003E\n","\u003Ch3\u003ERun the Script\u003C/h3\u003E\n","\u003Cp\u003ETo set up all the objects we'll need in Snowflake for this Quickstart you'll need to run the \u003Ccode\u003Esteps/01_setup_snowflake.sql\u003C/code\u003E script.\u003C/p\u003E\n","\u003Cp\u003EStart by clicking on the Snowflake extension in the left navigation bar in VS Code. Then login to your Snowflake account with a user that has ACCOUNTADMIN permissions. Once logged in to Snowflake, open the \u003Ccode\u003Esteps/01_setup_snowflake.sql\u003C/code\u003E script in VS Code by going back to the file Explorer in the left navigation bar.\u003C/p\u003E\n","\u003Cp\u003ETo run all the queries in this script, use the &quot;Execute All Statements&quot; button in the upper right corner of the editor window. Or, if you want to run them in chunks, you can highlight the ones you want to run and press CMD/CTRL+Enter.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ELoad Raw\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be loading the raw Tasty Bytes POS and Customer loyalty data from raw Parquet files in \u003Ccode\u003Es3://sfquickstarts/data-engineering-with-snowpark-python/\u003C/code\u003E to our \u003Ccode\u003ERAW_POS\u003C/code\u003E and \u003Ccode\u003ERAW_CUSTOMER\u003C/code\u003E schemas in Snowflake. And you are going to be orchestrating this process from your laptop in Python using the Snowpark Python API. To put this in context, we are on step \u003Cstrong\u003E#2\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ERun the Script\u003C/h3\u003E\n","\u003Cp\u003ETo load the raw data, execute the \u003Ccode\u003Esteps/02_load_raw.py\u003C/code\u003E script. This can be done a number of ways in VS Code, from a terminal or directly by VS Code. For this demo you will need to execute the Python scripts from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps\npython 02_load_raw.py\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\u003C/p\u003E\n","\u003Ch3\u003ERunning Snowpark Python Locally\u003C/h3\u003E\n","\u003Cp\u003EIn this step you will be running the Snowpark Python code locally from your laptop. At the bottom of the script is a block of code that is used for local debugging (under the \u003Ccode\u003Eif __name__ == &quot;__main__&quot;:\u003C/code\u003E block):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E# For local debugging\nif __name__ == &quot;__main__&quot;:\n    # Create a local Snowpark session\n    with Session.builder.getOrCreate() as session:\n        load_all_raw_tables(session)\n#        validate_raw_tables(session)\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EA few things to point out here. First, the Snowpark session is being created with the \u003Ccode\u003ESession.builder.getOrCreate()\u003C/code\u003E statement. And the connection details used by the Snowpark library are pulled from the standard \u003Ccode\u003E~/.snowflake/connections.toml\u003C/code\u003E configuration file (which you configured in step 2).\u003C/p\u003E\n","\u003Cp\u003EThen after getting the Snowpark session it calls the \u003Ccode\u003Eload_all_raw_tables(session)\u003C/code\u003E method which does the heavy lifting. The next few sections will point out the key parts.\u003C/p\u003E\n","\u003Cp\u003EFinally, almost all of the Python scripts in this Quickstart include a local debugging block. Later on we will create Snowpark Python stored procedures and UDFs and those Python scripts will have a similar block. So this pattern is important to understand.\u003C/p\u003E\n","\u003Ch3\u003EViewing What Happened in Snowflake\u003C/h3\u003E\n","\u003Cp\u003EThe \u003Ca href=\"https://docs.snowflake.com/en/user-guide/ui-snowsight-activity.html#query-history\"\u003EQuery History\u003C/a\u003E in Snowflake is a very power feature, that logs every query run against your Snowflake account, no matter which tool or process initiated it. And this is especially helpful when working with client tools and APIs.\u003C/p\u003E\n","\u003Cp\u003EThe Python script you just ran did a small amount of work locally, basically just orchestrating the process by looping through each table and issuing the command to Snowflake to load the data. But all of the heavy lifting ran inside Snowflake! This push-down is a hallmark of the Snowpark API and allows you to leverage the scalability and compute power of Snowflake!\u003C/p\u003E\n","\u003Cp\u003ELog in to your Snowflake account and take a quick look at the SQL that was generated by the Snowpark API. This will help you better understand what the API is doing and will help you debug any issues you may run into.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/query_history_sproc.png\" alt=\"assets/query_history_sproc.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ESchema Inference\u003C/h3\u003E\n","\u003Cp\u003EOne very helpful feature in Snowflake is the ability to infer the schema of files in a stage that you wish to work with. This is accomplished in SQL with the \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/infer_schema.html\"\u003E\u003Ccode\u003EINFER_SCHEMA()\u003C/code\u003E\u003C/a\u003E function. The Snowpark Python API does this for you automatically when you call the \u003Ccode\u003Esession.read()\u003C/code\u003E method. Here is the code snippet:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    # we can infer schema using the parquet read option\n    df = session.read.option(&quot;compression&quot;, &quot;snappy&quot;) \\\n                            .parquet(location)\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EData Ingestion with COPY\u003C/h3\u003E\n","\u003Cp\u003EIn order to load the data into a Snowflake table we will use the \u003Ccode\u003Ecopy_into_table()\u003C/code\u003E method on a DataFrame. This method will create the target table in Snowflake using the inferred schema (if it doesn't exist), and then call the highly optimized Snowflake \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html\"\u003E\u003Ccode\u003ECOPY INTO &lt;table&gt;\u003C/code\u003E Command\u003C/a\u003E. Here is the code snippet:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    df.copy_into_table(&quot;{}&quot;.format(tname))\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003ESnowflake's Table Format\u003C/h3\u003E\n","\u003Cp\u003EOne of the major advantages of Snowflake is being able to eliminate the need to manage a file-based data lake. And Snowflake was designed for this purpose from the beginning. In the step we are loading the raw data into a structured Snowflake managed table. But Snowflake tables can natively support structured and semi-structured data, and are stored in Snowflake's mature cloud table format (which predates Hudi, Delta or Iceberg).\u003C/p\u003E\n","\u003Cp\u003EOnce loaded into Snowflake the data will be securely stored and managed, without the need to worry about securing and managing raw files. Additionally the data, whether raw or structured, can be transformed and queried in Snowflake using SQL or the language of your choice, without needing to manage separate compute services like Spark.\u003C/p\u003E\n","\u003Cp\u003EThis is a huge advantage for Snowflake customers.\u003C/p\u003E\n","\u003Ch3\u003EWarehouse Elasticity (Dynamic Scaling)\u003C/h3\u003E\n","\u003Cp\u003EWith Snowflake there is only one type of user defined compute cluster, the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/warehouses.html\"\u003EVirtual Warehouse\u003C/a\u003E, regardless of the language you use to process that data (SQL, Python, Java, Scala, Javascript, etc.). This makes working with data much simpler in Snowflake. And governance of the data is completely separated from the compute cluster, in other words there is no way to get around Snowflake governance regardless of the warehouse settings or language being used.\u003C/p\u003E\n","\u003Cp\u003EAnd these virtual warehouses can be dynamically scaled, in under a second for most sized warehouses! This means that in your code you can dynamically resize the compute environment to increase the amount of capacity to run a section of code in a fraction of the time, and then dynamically resized again to reduce the amount of capacity. And because of our per-second billing (with a sixty second minimum) you won't pay any extra to run that section of code in a fraction of the time!\u003C/p\u003E\n","\u003Cp\u003ELet's see how easy that is done. Here is the code snippet:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    _ = session.sql(&quot;ALTER WAREHOUSE HOL_WH SET WAREHOUSE_SIZE = XLARGE WAIT_FOR_COMPLETION = TRUE&quot;).collect()\n\n    # Some data processing code\n\n    _ = session.sql(&quot;ALTER WAREHOUSE HOL_WH SET WAREHOUSE_SIZE = XSMALL&quot;).collect()\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EPlease also note that we included the \u003Ccode\u003EWAIT_FOR_COMPLETION\u003C/code\u003E parameter in the first \u003Ccode\u003EALTER WAREHOUSE\u003C/code\u003E statement. Setting this parameter to \u003Ccode\u003ETRUE\u003C/code\u003E will block the return of the \u003Ccode\u003EALTER WAREHOUSE\u003C/code\u003E command until the resize has finished provisioning all its compute resources. This way we make sure that the full cluster is available before processing any data with it.\u003C/p\u003E\n","\u003Cp\u003EWe will use this pattern a few more times during this Quickstart, so it's important to understand.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ELoad Weather\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be &quot;loading&quot; the raw weather data to Snowflake. But &quot;loading&quot; is the really the wrong word here. Because we're using Snowflake's unique data sharing capability we don't actually need to copy the data to our Snowflake account with a custom ETL process. Instead we can directly access the weather data shared by Weather Source in the Snowflake Marketplace. To put this in context, we are on step \u003Cstrong\u003E#3\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ESnowflake Marketplace\u003C/h3\u003E\n","\u003Cp\u003EWeather Source is a leading provider of global weather and climate data and their OnPoint Product Suite provides businesses with the necessary weather and climate data to quickly generate meaningful and actionable insights for a wide range of use cases across industries. Let's connect to the \u003Ccode\u003EWeather Source LLC: frostbyte\u003C/code\u003E feed from Weather Source in the Snowflake Marketplace by following these steps:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ELogin to Snowsight\u003C/li\u003E\u003Cli\u003EClick on the \u003Ccode\u003EMarketplace\u003C/code\u003E link in the left navigation bar\u003C/li\u003E\u003Cli\u003EEnter &quot;Weather Source LLC: frostbyte&quot; in the search box and click return\u003C/li\u003E\u003Cli\u003EClick on the &quot;Weather Source LLC: frostbyte&quot; listing tile\u003C/li\u003E\u003Cli\u003EClick the blue &quot;Get&quot; button\n\u003Cul\u003E\u003Cli\u003EExpand the &quot;Options&quot; dialog\u003C/li\u003E\u003Cli\u003EChange the &quot;Database name&quot; to read &quot;FROSTBYTE_WEATHERSOURCE&quot; (all capital letters)\u003C/li\u003E\u003Cli\u003ESelect the &quot;HOL_ROLE&quot; role to have access to the new database\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EClick on the blue &quot;Get&quot; button\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThat's it... we don't have to do anything from here to keep this data updated. The provider will do that for us and data sharing means we are always seeing whatever they have published. How amazing is that? Just think of all the things you didn't have do here to get access to an always up-to-date, third-party dataset!\u003C/p\u003E\n","\u003Ch3\u003ERun the Script\u003C/h3\u003E\n","\u003Cp\u003EOpen the \u003Ccode\u003Esteps/03_load_weather.sql\u003C/code\u003E script in VS Code from the file Explorer in the left navigation bar, and run the script. Notice how easy it is to query data shared through the Snowflake Marketplace! You access it just like any other table or view in Snowflake:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT * FROM FROSTBYTE_WEATHERSOURCE.ONPOINT_ID.POSTAL_CODES LIMIT 100;\n\u003C/code\u003E\u003C/pre\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ECreate POS View\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be creating a view to simplify the raw POS schema by joining together 6 different tables and picking only the columns we need. But what's really cool is that we're going to define that view with the Snowpark DataFrame API! Then we're going to create a Snowflake stream on that view so that we can incrementally process changes to any of the POS tables. To put this in context, we are on step \u003Cstrong\u003E#4\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ERun the Script\u003C/h3\u003E\n","\u003Cp\u003ETo create the view and stream, execute the \u003Ccode\u003Esteps/04_create_pos_view.py\u003C/code\u003E script. Like we did in step 2, let's execute it from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps\npython 04_create_pos_view.py\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\u003C/p\u003E\n","\u003Ch3\u003ESnowpark DataFrame API\u003C/h3\u003E\n","\u003Cp\u003EThe first thing you'll notice in the \u003Ccode\u003Ecreate_pos_view()\u003C/code\u003E function is that we define the Snowflake view using the Snowpark DataFrame API. After defining the final DataFrame, which captures all the logic we want in the view, we can simply call the Snowpark \u003Ccode\u003Ecreate_or_replace_view()\u003C/code\u003E method. Here's the final line from the \u003Ccode\u003Ecreate_pos_view()\u003C/code\u003E function:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    final_df.create_or_replace_view('POS_FLATTENED_V')\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EFor more details about the Snowpark Python DataFrame API, please check out our \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes.html\"\u003EWorking with DataFrames in Snowpark Python\u003C/a\u003E page.\u003C/p\u003E\n","\u003Ch3\u003EStreams for Incremental Processing (CDC)\u003C/h3\u003E\n","\u003Cp\u003ESnowflake makes processing data incrementally very easy. Traditionally the data engineer had to keep track of a high watermark (usually a datetime column) in order to process only new records in a table. This involved tracking and persisting that watermark somewhere and then using it in any query against the source table. But with Snowflake streams all the heavy lifting is done for you by Snowflake. For more details please check out our \u003Ca href=\"https://docs.snowflake.com/en/user-guide/streams.html\"\u003EChange Tracking Using Table Streams\u003C/a\u003E user guide.\u003C/p\u003E\n","\u003Cp\u003EAll you need to do is create a \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/sql/create-stream.html\"\u003E\u003Ccode\u003ESTREAM\u003C/code\u003E\u003C/a\u003E object in Snowflake against your base table or view, then query that stream just like any table in Snowflake. The stream will return only the changed records since the last DML option your performed. To help you work with the changed records, Snowflake streams will supply the following metadata columns along with the base table or view columns:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EMETADATA$ACTION\u003C/li\u003E\u003Cli\u003EMETADATA$ISUPDATE\u003C/li\u003E\u003Cli\u003EMETADATA$ROW_ID\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EFor more details about these stream metadata columns please check out the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/streams-intro.html#stream-columns\"\u003EStream Columns\u003C/a\u003E section in our documentation.\u003C/p\u003E\n","\u003Ch3\u003EStreams on views\u003C/h3\u003E\n","\u003Cp\u003EWhat's really cool about Snowflake's incremental/CDC stream capability is the ability to create a stream on a view! In this example we are creating a stream on a view which joins together 6 of the raw POS tables. Here is the code to do that:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Edef create_pos_view_stream(session):\n    session.use_schema('HARMONIZED')\n    _ = session.sql('CREATE OR REPLACE STREAM POS_FLATTENED_V_STREAM \\\n                        ON VIEW POS_FLATTENED_V \\\n                        SHOW_INITIAL_ROWS = TRUE').collect()\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ENow when we query the \u003Ccode\u003EPOS_FLATTENED_V_STREAM\u003C/code\u003E stream to find changed records, Snowflake is actually looking for changed records in any of the 6 tables included in the view. For those who have tried to build incremental/CDC processes around denormalized schemas like this, you will appreciate the incredibly powerful feature that Snowflake provides here.\u003C/p\u003E\n","\u003Cp\u003EFor more details please check out the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/streams-intro.html#streams-on-views\"\u003EStreams on Views\u003C/a\u003E section in our documentation.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EFahrenheit to Celsius UDF\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be creating and deploying our first Snowpark Python object to Snowflake, a user-defined function (or UDF). To begin with the UDF will be very basic, but in a future step we'll update it to include a third-party Python package. Also in this step you will be introduced to the new SnowCLI, a new developer command line tool. SnowCLI makes building and deploying Snowpark Python objects to Snowflake a consistent experience for the developer. More details below on SnowCLI. To put this in context, we are on step \u003Cstrong\u003E#5\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ERunning the UDF Locally\u003C/h3\u003E\n","\u003Cp\u003ETo test the UDF locally, you will execute the \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/fahrenheit_to_celsius_udf/function.py\u003C/code\u003E script. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/05_fahrenheit_to_celsius_udf\npython fahrenheit_to_celsius_udf/function.py 35\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhile you're developing the UDF you can simply run it locally in VS Code. And if your UDF doesn't need to query data from Snowflake, this process will be entirely local.\u003C/p\u003E\n","\u003Ch3\u003EDeploying the UDF to Snowflake\u003C/h3\u003E\n","\u003Cp\u003ETo deploy your UDF to Snowflake we will use the SnowCLI tool. The SnowCLI tool will do all the heavy lifting of packaging up your application, copying it to a Snowflake stage, and creating the object in Snowflake. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/05_fahrenheit_to_celsius_udf\nsnow snowpark build\nsnow snowpark deploy\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\u003C/p\u003E\n","\u003Ch3\u003ERunning the UDF in Snowflake\u003C/h3\u003E\n","\u003Cp\u003EIn order to run the UDF in Snowflake you have a few options. Any UDF in Snowflake can be invoked through SQL as follows:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT ANALYTICS.FAHRENHEIT_TO_CELSIUS_UDF(35);\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EAnd with the SnowCLI utility you can also invoke the UDF from the terminal in VS Code as follows:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow snowpark execute function &quot;fahrenheit_to_celsius_udf(35)&quot;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThat will result in the SnowCLI tool generating the SQL query above and running it against your Snowflake account.\u003C/p\u003E\n","\u003Ch3\u003EOverview of the SnowCLI Tool\u003C/h3\u003E\n","\u003Cp\u003EThe \u003Ca href=\"https://github.com/Snowflake-Labs/snowcli\"\u003ESnowCLI\u003C/a\u003E tool is a command line tool for developers, and is executed as \u003Ccode\u003Esnow\u003C/code\u003E from the command line.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote\u003C/strong\u003E - Do not confuse this with the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowsql.html\"\u003ESnowSQL\u003C/a\u003E command line tool which is a client for connecting to Snowflake to execute SQL queries and perform all DDL and DML operations, and is executed as \u003Ccode\u003Esnowsql\u003C/code\u003E from the command line.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003ESnowCLI simplifies the development and deployment of the following Snowflake objects:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowpark Python UDFs\u003C/li\u003E\u003Cli\u003ESnowpark Python Stored Procedures\u003C/li\u003E\u003Cli\u003EStreamlit Applications\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EFor this Quickstart we will be focused on the first two. And for Snowpark Python UDFs and sprocs in particular, the SnowCLI does all the heavy lifting of deploying the objects to Snowflake. Here's a brief summary of the steps the SnowCLI deploy command does for you:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EDealing with third-party packages\n\u003Cul\u003E\u003Cli\u003EFor packages that can be accessed directly from our Anaconda channel it will add them to the \u003Ccode\u003EPACKAGES\u003C/code\u003E list in the \u003Ccode\u003ECREATE PROCEDURE\u003C/code\u003E or \u003Ccode\u003ECREATE FUNCTION\u003C/code\u003E SQL command\u003C/li\u003E\u003Cli\u003EFor packages which are not currently available in our Anaconda channel it will download the code and include them in the project zip file\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003ECreating a zip file of everything in your project\u003C/li\u003E\u003Cli\u003ECopying that project zip file to your Snowflake stage\u003C/li\u003E\u003Cli\u003ECreating the Snowflake function or stored procedure object\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThis also allows you to develop and test your Python application without having to worry about wrapping it in a corresponding Snowflake database object.\u003C/p\u003E\n","\u003Ch3\u003EMore on Snowpark Python UDFs\u003C/h3\u003E\n","\u003Cp\u003EIn this step we deployed a very simple Python UDF to Snowflake. In a future step will update it to use a third-party package. And because we deployed it to Snowflake with the SnowCLI command you didn't have to worry about the SQL DDL Syntax to create the object in Snowflake. But for reference please check out our \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/udf/python/udf-python.html\"\u003EWriting Python UDFs\u003C/a\u003E developer guide.\u003C/p\u003E\n","\u003Cp\u003EHere is the SQL query that the SnowCLI tool generated to deploy the function:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Ecreate or replace function HOL_DB.ANALYTICS.FAHRENHEIT_TO_CELSIUS_UDF(temp_f float)\nreturns float\nlanguage python\nruntime_version=3.10\nimports=('@HOL_DB.ANALYTICS.DEPLOYMENT/hol/fahrenheit_to_celsius_udf.zip')\nhandler='function.main'\npackages=('snowflake-snowpark-python')\n\u003C/code\u003E\u003C/pre\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EOrders Update Sproc\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be creating and deploying our first Snowpark Python stored procedure (or sproc) to Snowflake. This sproc will merge changes from the \u003Ccode\u003EHARMONIZED.POS_FLATTENED_V_STREAM\u003C/code\u003E stream into our target \u003Ccode\u003EHARMONIZED.ORDERS\u003C/code\u003E table. To put this in context, we are on step \u003Cstrong\u003E#6\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ERunning the Sproc Locally\u003C/h3\u003E\n","\u003Cp\u003ETo test the procedure locally, you will execute the \u003Ccode\u003Esteps/06_orders_update_sp/orders_update_sp/procedure.py\u003C/code\u003E script. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/06_orders_update_sp\npython orders_update_sp/procedure.py\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhile you're developing the sproc you can simply run it locally in VS Code. The Python code will run locally on your laptop, but the Snowpark DataFrame code will issue SQL queries to your Snowflake account.\u003C/p\u003E\n","\u003Ch3\u003EDeploying the Sproc to Snowflake\u003C/h3\u003E\n","\u003Cp\u003ETo deploy your sproc to Snowflake we will use the SnowCLI tool. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/06_orders_update_sp\nsnow snowpark build\nsnow snowpark deploy\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\u003C/p\u003E\n","\u003Ch3\u003ERunning the Sproc in Snowflake\u003C/h3\u003E\n","\u003Cp\u003EIn order to run the sproc in Snowflake you have a few options. Any sproc in Snowflake can be invoked through SQL as follows:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECALL ORDERS_UPDATE_SP();\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EAnd with the SnowCLI utility you can also invoke the UDF from the terminal in VS Code as follows:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow snowpark execute procedure &quot;harmonized.orders_update_sp()&quot;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThat will result in the SnowCLI tool generating the SQL query above and running it against your Snowflake account.\u003C/p\u003E\n","\u003Ch3\u003EMore on Snowpark Python Sprocs\u003C/h3\u003E\n","\u003Cp\u003EIn this step we deployed a Python sproc to Snowflake. And because we deployed it to Snowflake with the SnowCLI command you didn't have to worry about the SQL DDL Syntax to create the object in Snowflake. But for reference please check out our \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/stored-procedures-python.html\"\u003EWriting Stored Procedures in Snowpark (Python)\u003C/a\u003E guide.\u003C/p\u003E\n","\u003Cp\u003EHere is the SQL query that the SnowCLI tool generated to deploy the procedure:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003Ecreate or replace procedure HOL_DB.HARMONIZED.ORDERS_UPDATE_SP()\nreturns string\nlanguage python\nruntime_version=3.10\nimports=('@HOL_DB.HARMONIZED.DEPLOYMENT/hol/orders_update_sp.zip')\nhandler='procedure.main'\npackages=('snowflake-snowpark-python')\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EMore on the Snowpark API\u003C/h3\u003E\n","\u003Cp\u003EIn this step we're starting to really use the Snowpark DataFrame API for data transformations. The Snowpark API provides the same functionality as the \u003Ca href=\"https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/index.html\"\u003ESpark SQL API\u003C/a\u003E. To begin with you need to create a Snowpark session object. Like PySpark, this is accomplished with the \u003Ccode\u003ESession.builder.configs().create()\u003C/code\u003E methods. When running locally, we use the \u003Ccode\u003ESession.builder.getOrCreate()\u003C/code\u003E method to create the session object for us. But when deployed to Snowflake, the session object is provisioned for you automatically by Snowflake. And when building a Snowpark Python sproc the contract is that the first argument to the entry point (or handler) function is a Snowpark session.\u003C/p\u003E\n","\u003Cp\u003EThe first thing you'll notice in the \u003Ccode\u003Esteps/06_orders_update_sp/orders_update_sp/procedure.py\u003C/code\u003E script is that we have some functions which use SQL to create objects in Snowflake and to check object status. To issue a SQL statement to Snowflake with the Snowpark API you use the \u003Ccode\u003Esession.sql()\u003C/code\u003E function, like you'd expect. Here's one example:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Edef create_orders_stream(session):\n    _ = session.sql(&quot;CREATE STREAM IF NOT EXISTS HARMONIZED.ORDERS_STREAM ON TABLE HARMONIZED.ORDERS \\\n                    SHOW_INITIAL_ROWS = TRUE;&quot;).collect()\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThe second thing to point out is how we're using DataFrames to merge changes from the source view to the target table. The Snowpark DataFrame API provides a \u003Ccode\u003Emerge()\u003C/code\u003E method which will ultimately generate a \u003Ccode\u003EMERGE\u003C/code\u003E command in Snowflake.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    source = session.table('HARMONIZED.POS_FLATTENED_V_STREAM')\n    target = session.table('HARMONIZED.ORDERS')\n\n    # TODO: Is the if clause supposed to be based on &quot;META_UPDATED_AT&quot;?\n    cols_to_update = {c: source[c] for c in source.schema.names if &quot;METADATA&quot; not in c}\n    metadata_col_to_update = {&quot;META_UPDATED_AT&quot;: F.current_timestamp()}\n    updates = {**cols_to_update, **metadata_col_to_update}\n\n    # merge into DIM_CUSTOMER\n    target.merge(source, target['ORDER_DETAIL_ID'] == source['ORDER_DETAIL_ID'], \\\n                        [F.when_matched().update(updates), F.when_not_matched().insert(updates)])\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EAgain, for more details about the Snowpark Python DataFrame API, please check out our \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes.html\"\u003EWorking with DataFrames in Snowpark Python\u003C/a\u003E page.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EDaily City Metrics Update Sproc\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be creating and deploying our second Snowpark Python sproc to Snowflake. This sproc will join the \u003Ccode\u003EHARMONIZED.ORDERS\u003C/code\u003E data with the Weather Source data to create a final, aggregated table for analysis named \u003Ccode\u003EANALYTICS.DAILY_CITY_METRICS\u003C/code\u003E. We will process the data incrementally from the \u003Ccode\u003EHARMONIZED.ORDERS\u003C/code\u003E table using another Snowflake Stream. And we will again use the Snowpark DataFrame \u003Ccode\u003Emerge()\u003C/code\u003E method to merge/upsert the data. To put this in context, we are on step \u003Cstrong\u003E#7\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ERunning the Sproc Locally\u003C/h3\u003E\n","\u003Cp\u003ETo test the procedure locally, you will execute the \u003Ccode\u003Esteps/07_daily_city_metrics_update_sp/daily_city_metrics_update_sp/procedure.py\u003C/code\u003E script. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/07_daily_city_metrics_update_sp\npython daily_city_metrics_update_sp/procedure.py\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhile you're developing the sproc you can simply run it locally in VS Code. The Python code will run locally on your laptop, but the Snowpark DataFrame code will issue SQL queries to your Snowflake account.\u003C/p\u003E\n","\u003Ch3\u003EDeploying the Sproc to Snowflake\u003C/h3\u003E\n","\u003Cp\u003ETo deploy your sproc to Snowflake we will use the SnowCLI tool. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/07_daily_city_metrics_update_sp\nsnow snowpark build\nsnow snowpark deploy\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\u003C/p\u003E\n","\u003Ch3\u003ERunning the Sproc in Snowflake\u003C/h3\u003E\n","\u003Cp\u003EIn order to run the sproc in Snowflake you have a few options. Any sproc in Snowflake can be invoked through SQL as follows:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECALL DAILY_CITY_METRICS_UPDATE_SP();\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EAnd with the SnowCLI utility you can also invoke the UDF from the terminal in VS Code as follows:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow snowpark execute procedure &quot;daily_city_metrics_update_sp()&quot;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThat will result in the SnowCLI tool generating the SQL query above and running it against your Snowflake account.\u003C/p\u003E\n","\u003Ch3\u003EData Modeling Best Practice\u003C/h3\u003E\n","\u003Cp\u003EWhen modeling data for analysis a best practice has been to clearly define and manage the schema of the table. In step 2, when we loaded raw data from Parquet we took advantage of Snowflake's schema detection feature to create a table with the same schema as the Parquet files. In this step we are explicitly defining the schema in DataFrame syntax and using that to create the table.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Edef create_daily_city_metrics_table(session):\n    SHARED_COLUMNS= [T.StructField(&quot;DATE&quot;, T.DateType()),\n                                        T.StructField(&quot;CITY_NAME&quot;, T.StringType()),\n                                        T.StructField(&quot;COUNTRY_DESC&quot;, T.StringType()),\n                                        T.StructField(&quot;DAILY_SALES&quot;, T.StringType()),\n                                        T.StructField(&quot;AVG_TEMPERATURE_FAHRENHEIT&quot;, T.DecimalType()),\n                                        T.StructField(&quot;AVG_TEMPERATURE_CELSIUS&quot;, T.DecimalType()),\n                                        T.StructField(&quot;AVG_PRECIPITATION_INCHES&quot;, T.DecimalType()),\n                                        T.StructField(&quot;AVG_PRECIPITATION_MILLIMETERS&quot;, T.DecimalType()),\n                                        T.StructField(&quot;MAX_WIND_SPEED_100M_MPH&quot;, T.DecimalType()),\n                                    ]\n    DAILY_CITY_METRICS_COLUMNS = [*SHARED_COLUMNS, T.StructField(&quot;META_UPDATED_AT&quot;, T.TimestampType())]\n    DAILY_CITY_METRICS_SCHEMA = T.StructType(DAILY_CITY_METRICS_COLUMNS)\n\n    dcm = session.create_dataframe([[None]*len(DAILY_CITY_METRICS_SCHEMA.names)], schema=DAILY_CITY_METRICS_SCHEMA) \\\n                        .na.drop() \\\n                        .write.mode('overwrite').save_as_table('ANALYTICS.DAILY_CITY_METRICS')\n    dcm = session.table('ANALYTICS.DAILY_CITY_METRICS')\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EComplex Aggregation Query\u003C/h3\u003E\n","\u003Cp\u003EThe \u003Ccode\u003Emerge_daily_city_metrics()\u003C/code\u003E function contains a complex aggregation query which is used to join together and aggregate the data from our POS and Weather Source. Take a look at the series of complex series of joins and aggregations that are expressed, and how we're even leveraging the Snowpark UDF we created in step #5!\u003C/p\u003E\n","\u003Cp\u003EThe complex aggregation query is then merged into the final analytics table using the Snowpark \u003Ccode\u003Emerge()\u003C/code\u003E method. If you haven't already, check out your Snowflake Query history and see which queries were generated by the Snowpark API. In this case you will see that the Snowpark API took all the complex logic, including the merge and created a single Snowflake query to execute!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EOrchestrate Jobs\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be orchestrating our new Snowpark pipelines with Snowflake's native orchestration feature named Tasks. We will create two tasks, one for each stored procedure, and chain them together. We will then run the tasks. To put this in context, we are on step \u003Cstrong\u003E#8\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ERun the Script\u003C/h3\u003E\n","\u003Cp\u003ESince this is a SQL script we will be using our native VS Code extension to execute it. So simply open the \u003Ccode\u003Esteps/08_orchestrate_jobs.sql\u003C/code\u003E script in VS Code and run the whole thing using the &quot;Execute All Statements&quot; button in the upper right corner of the editor window.\u003C/p\u003E\n","\u003Cp\u003EWhile that is running, please read through the script in VS Code and continue on this page to understand what is happening.\u003C/p\u003E\n","\u003Ch3\u003ERunning the Tasks\u003C/h3\u003E\n","\u003Cp\u003EIn this step we did not create a schedule for our task DAG, so it will not run on its own at this point. So in this script you will notice that we manually execute the DAG, like this:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EEXECUTE TASK ORDERS_UPDATE_TASK;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ETo see what happened when you ran this task just now, highlight and run (using CMD/CTRL+Enter) this commented query in the script:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=&gt;DATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =&gt; 100))\nORDER BY SCHEDULED_TIME DESC\n;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EYou will notice in the task history output that it skipped our task \u003Ccode\u003EORDERS_UPDATE_TASK\u003C/code\u003E. This is correct, because our \u003Ccode\u003EHARMONIZED.POS_FLATTENED_V_STREAM\u003C/code\u003E stream doesn't have any data. We'll add some new data and run them again in the next step.\u003C/p\u003E\n","\u003Ch3\u003EMore on Tasks\u003C/h3\u003E\n","\u003Cp\u003ETasks are Snowflake's native scheduling/orchestration feature. With a task you can execute any one of the following types of SQL code:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESingle SQL statement\u003C/li\u003E\u003Cli\u003ECall to a stored procedure\u003C/li\u003E\u003Cli\u003EProcedural logic using Snowflake Scripting Developer Guide\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EFor this Quickstart we'll call our Snowpark stored procedures. Here is the SQL DDL code to create the second task:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE OR REPLACE TASK DAILY_CITY_METRICS_UPDATE_TASK\nWAREHOUSE = HOL_WH\nAFTER ORDERS_UPDATE_TASK\nWHEN\n  SYSTEM$STREAM_HAS_DATA('ORDERS_STREAM')\nAS\nCALL ANALYTICS.DAILY_CITY_METRICS_UPDATE_SP();\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EA few things to point out. First you specify which Snowflake virtual warehouse to use when running the task with the \u003Ccode\u003EWAREHOUSE\u003C/code\u003E clause. The \u003Ccode\u003EAFTER\u003C/code\u003E clause lets you define the relationship between tasks, and the structure of this relationship is a Directed Acyclic Graph (or DAG) like most orchestration tools provide. The \u003Ccode\u003EAS\u003C/code\u003E clause let's you define what the task should do when it runs, in this case to call our stored procedure.\u003C/p\u003E\n","\u003Cp\u003EThe \u003Ccode\u003EWHEN\u003C/code\u003E clause is really cool. We've already seen how streams work in Snowflake by allowing you to incrementally process data. We've even seen how you can create a stream on a view (which joins many tables together) and create a stream on that view to process its data incrementally! Here in the \u003Ccode\u003EWHEN\u003C/code\u003E clause we're calling a system function \u003Ccode\u003ESYSTEM$STREAM_HAS_DATA()\u003C/code\u003E which returns true if the specified stream has new data. With the \u003Ccode\u003EWHEN\u003C/code\u003E clause in place the virtual warehouse will only be started up when the stream has new data. So if there's no new data when the task runs then your warehouse won't be started up and you won't be charged. You will only be charged when there's new data to process. Pretty cool, huh?\u003C/p\u003E\n","\u003Cp\u003EAs mentioned above we did not define a \u003Ccode\u003ESCHEDULE\u003C/code\u003E for the root task, so this DAG will not run on its own. That's fine for this Quickstart, but in a real situation you would define a schedule. See \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/sql/create-task.html\"\u003ECREATE TASK\u003C/a\u003E for the details.\u003C/p\u003E\n","\u003Cp\u003EAnd for more details on Tasks see \u003Ca href=\"https://docs.snowflake.com/en/user-guide/tasks-intro.html\"\u003EIntroduction to Tasks\u003C/a\u003E.\u003C/p\u003E\n","\u003Ch3\u003ETask Metadata\u003C/h3\u003E\n","\u003Cp\u003ESnowflake keeps metadata for almost everything you do, and makes that metadata available for you to query (and to create any type of process around). Tasks are no different, Snowflake maintains rich metadata to help you monitor your task runs. Here are a few sample SQL queries you can use to monitor your tasks runs:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Get a list of tasks\nSHOW TASKS;\n\n-- Task execution history in the past day\nSELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=&gt;DATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =&gt; 100))\nORDER BY SCHEDULED_TIME DESC\n;\n\n-- Scheduled task runs\nSELECT\n    TIMESTAMPDIFF(SECOND, CURRENT_TIMESTAMP, SCHEDULED_TIME) NEXT_RUN,\n    SCHEDULED_TIME,\n    NAME,\n    STATE\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())\nWHERE STATE = 'SCHEDULED'\nORDER BY COMPLETED_TIME DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EMonitoring Tasks\u003C/h3\u003E\n","\u003Cp\u003ESo while you're free to create any operational or monitoring process you wish, Snowflake provides some rich task observability features in our Snowsight UI. Try it out for yourself by following these steps:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EIn the Snowsight navigation menu, click \u003Cstrong\u003EData\u003C/strong\u003E &raquo; \u003Cstrong\u003EDatabases\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003EIn the right pane, using the object explorer, navigate to a database and schema.\u003C/li\u003E\u003Cli\u003EFor the selected schema, select and expand \u003Cstrong\u003ETasks\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003ESelect a task. Task information is displayed, including \u003Cstrong\u003ETask Details\u003C/strong\u003E, \u003Cstrong\u003EGraph\u003C/strong\u003E, and \u003Cstrong\u003ERun History\u003C/strong\u003E sub-tabs.\u003C/li\u003E\u003Cli\u003ESelect the \u003Cstrong\u003EGraph\u003C/strong\u003E tab. The task graph appears, displaying a hierarchy of child tasks.\u003C/li\u003E\u003Cli\u003ESelect a task to view its details.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EHere's what the task graph looks like:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/ui-snowsight-task-graph.png\" alt=\"assets/ui-snowsight-task-graph.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EAnd here's an example of the task run history:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/ui-snowsight-task-run-history.png\" alt=\"assets/ui-snowsight-task-run-history.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EFor more details, and to learn about viewing account level task history, please check out our \u003Ca href=\"https://docs.snowflake.com/en/user-guide/ui-snowsight-tasks.html\"\u003EViewing Task History\u003C/a\u003E documentation.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EProcess Incrementally\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be adding new data to our POS order tables and then running our entire end-to-end pipeline to process the new data. And this entire pipeline will be processing data incrementally thanks to Snowflake's advanced stream/CDC capabilities. To put this in context, we are on step \u003Cstrong\u003E#9\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ERun the Script\u003C/h3\u003E\n","\u003Cp\u003ESince this is a SQL script we will be using our native VS Code extension to execute it. So simply open the \u003Ccode\u003Esteps/09_process_incrementally.sql\u003C/code\u003E script in VS Code and run the whole thing using the &quot;Execute All Statements&quot; button in the upper right corner of the editor window.\u003C/p\u003E\n","\u003Cp\u003EWhile that is running, let's briefly discuss what's happening. As in step #2, we're going to load data from Parquet into our raw POS tables. In step #2 we loaded all the order data except for the 2022 data for \u003Ccode\u003EORDER_HEADER\u003C/code\u003E and \u003Ccode\u003EORDER_DETAIL\u003C/code\u003E. So now we're going to load the remaining data.\u003C/p\u003E\n","\u003Cp\u003EThis time we will be doing the data loading through SQL instead of Python, but the process is the same. We'll resize the warehouse, scaling up so that we can load the data faster and then scaling back down after when we're done. After the new data is loaded we will also run the task DAG again. And this time both tasks will run and process the new data.\u003C/p\u003E\n","\u003Ch3\u003EViewing the Task History\u003C/h3\u003E\n","\u003Cp\u003ELike the in the previous step, to see what happened when you ran this task DAG, highlight and run (using CMD/CTRL+Enter) this commented query in the script:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=&gt;DATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =&gt; 100))\nORDER BY SCHEDULED_TIME DESC\n;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis time you will notice that the \u003Ccode\u003EORDERS_UPDATE_TASK\u003C/code\u003E task will not be skipped, since the \u003Ccode\u003EHARMONIZED.POS_FLATTENED_V_STREAM\u003C/code\u003E stream has new data. In a few minutes you should see that both the \u003Ccode\u003EORDERS_UPDATE_TASK\u003C/code\u003E task and the \u003Ccode\u003EDAILY_CITY_METRICS_UPDATE_TASK\u003C/code\u003E task completed successfully.\u003C/p\u003E\n","\u003Ch3\u003EQuery History for Tasks\u003C/h3\u003E\n","\u003Cp\u003EOne important thing to understand about tasks, is that the queries which get executed by the task won't show up with the default Query History UI settings. In order to see the queries that just ran you need to do the following:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ERemove filters at the top of this table, including your username, as later scheduled tasks will run as &quot;System&quot;:\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/query_history_remove_filter1.png\" alt=\"\"\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EClick &quot;Filter&quot;, and add filter option 'Queries executed by user tasks' and click &quot;Apply Filters&quot;:\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/query_history_remove_filter2.png\" alt=\"\"\u003E\u003C/p\u003E\n","\u003Cp\u003EYou should now see all the queries run by your tasks! Take a look at each of the MERGE commands in the Query History to see how many records were processed by each task. And don't forget to notice that we processed the whole pipeline just now, and did so incrementally!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EDeploy Via CI/CD\u003C/h2\u003E\n","\u003Cp\u003EDuring this step we will be making a change to our \u003Ccode\u003EFAHRENHEIT_TO_CELSIUS_UDF()\u003C/code\u003E UDF and then deploying it via a CI/CD pipeline. We will be updating the \u003Ccode\u003EFAHRENHEIT_TO_CELSIUS_UDF()\u003C/code\u003E UDF to use a third-party Python package, pushing it to your forked GitHub repo, and finally deploying it using the SnowCLI in a GitHub Actions workflow! To put this in context, we are on step \u003Cstrong\u003E#10\u003C/strong\u003E in our data flow overview:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EUpdate the Fahrenheit to Celsius UDF\u003C/h3\u003E\n","\u003Cp\u003EWe will be replacing our hard-coded temperature conversion with a package from \u003Ccode\u003Escipy\u003C/code\u003E. First we will make a few changes to the \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/fahrenheit_to_celsius_udf/function.py\u003C/code\u003E script. In this file we will be adding an \u003Ccode\u003Eimport\u003C/code\u003E command and replacing the body of the \u003Ccode\u003Emain()\u003C/code\u003E function. So open the \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/fahrenheit_to_celsius_udf/function.py\u003C/code\u003E script in VS Code and replace this section:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Eimport sys\n\ndef main(temp_f: float) -&gt; float:\n    return (float(temp_f) - 32) * (5/9)\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWith this:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Eimport sys\nfrom scipy.constants import convert_temperature\n\ndef main(temp_f: float) -&gt; float:\n    return convert_temperature(float(temp_f), 'F', 'C')\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDon't forget to save your changes.\u003C/p\u003E\n","\u003Cp\u003EThe second change we need to make is to add \u003Ccode\u003Escipy\u003C/code\u003E to our \u003Ccode\u003Erequirements.txt\u003C/code\u003E file. Open the \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/requirements.txt\u003C/code\u003E file in VS Code, add a newline with \u003Ccode\u003Escipy\u003C/code\u003E on it and save it.\u003C/p\u003E\n","\u003Ch3\u003ETest your Changes Locally\u003C/h3\u003E\n","\u003Cp\u003ETo test the UDF locally, you will execute the \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/fahrenheit_to_celsius_udf/function.py\u003C/code\u003E script. Like we did in previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your \u003Ccode\u003Esnowflake-demo\u003C/code\u003E conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/05_fahrenheit_to_celsius_udf\npip install -r requirements.txt\npython fahrenheit_to_celsius_udf/function.py 35\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ENotice that this time we're also running pip install to make sure that our dependent packages are installed. Once your function runs successfully we'll be ready to deploy it via CI/CD!\u003C/p\u003E\n","\u003Ch3\u003EConfiguring Your Forked GitHub Project\u003C/h3\u003E\n","\u003Cp\u003EIn order for your GitHub Actions workflow to be able to connect to your Snowflake account you will need to store your Snowflake credentials in GitHub. Action Secrets in GitHub are used to securely store values/variables which will be used in your CI/CD pipelines. In this step we will create secrets for each of the parameters used by SnowCLI.\u003C/p\u003E\n","\u003Cp\u003EFrom the repository, click on the \u003Ccode\u003ESettings\u003C/code\u003E tab near the top of the page. From the Settings page, click on the \u003Ccode\u003ESecrets and variables\u003C/code\u003E then \u003Ccode\u003EActions\u003C/code\u003E tab in the left hand navigation. The \u003Ccode\u003EActions\u003C/code\u003E secrets should be selected. For each secret listed below click on \u003Ccode\u003ENew repository secret\u003C/code\u003E near the top right and enter the name given below along with the appropriate value (adjusting as appropriate).\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ESecret name\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ESecret value\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWFLAKE_ACCOUNT\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Emyaccount\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWFLAKE_USER\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Emyusername\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWFLAKE_PASSWORD\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Emypassword\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWFLAKE_ROLE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EHOL_ROLE\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWFLAKE_WAREHOUSE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EHOL_WH\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWFLAKE_DATABASE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EHOL_DB\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETip\u003C/strong\u003E - For more details on how to structure the account name in SNOWFLAKE_ACCOUNT, see the account name discussion in \u003Ca href=\"https://docs.snowflake.com/en/user-guide/python-connector-install.html#step-2-verify-your-installation\"\u003Ethe Snowflake Python Connector install guide\u003C/a\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EWhen you&rsquo;re finished adding all the secrets, the page should look like this:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/github-actions-secrets.png\" alt=\"assets/github-actions-secrets.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETip\u003C/strong\u003E - For an even better solution to managing your secrets, you can leverage \u003Ca href=\"https://docs.github.com/en/actions/reference/environments\"\u003EGitHub Actions Environments\u003C/a\u003E. Environments allow you to group secrets together and define protection rules for each of your environments.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EPush Changes to Forked Repository\u003C/h3\u003E\n","\u003Cp\u003ENow that we have a changes ready and tested, and our Snowflake credentials stored in GitHub, let's commit them to our local repository and then push them to your forked repository. This can certainly be done from the command line, but in this step we'll do so through VS Code to make it easy.\u003C/p\u003E\n","\u003Cp\u003EStart by opening the &quot;Source Control&quot; extension in the left hand nav bar, you should see two files with changes. Click the \u003Ccode\u003E+\u003C/code\u003E (plus) sign at the right of each file name to stage the changes. Then enter a message in the &quot;Message&quot; box and click the blue \u003Ccode\u003ECommit\u003C/code\u003E button to commit the changes locally. Here's what it should look like before you click the button:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/vs_code_repo_commit.png\" alt=\"assets/vs_code_repo_commit.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EAt this point those changes are only committed locally and have not yet been pushed to your forked repository in GitHub. To do that, simply click the blue \u003Ccode\u003ESync Changes\u003C/code\u003E button to push these commits to GitHub. Here's what it should look like before you click the button:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/vs_code_repo_push.png\" alt=\"assets/vs_code_repo_push.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EViewing GitHub Actions Workflow\u003C/h3\u003E\n","\u003Cp\u003EThis repository is already set up with a very simple GitHub Actions CI/CD pipeline. You can review the code for the workflow by opening the \u003Ccode\u003E.github/workflows/build_and_deploy.yaml\u003C/code\u003E file in VS Code.\u003C/p\u003E\n","\u003Cp\u003EAs soon as you pushed the changes to your GitHub forked repo the workflow kicked off. To view the results go back to the homepage for your GitHub repository and do the following:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EFrom the repository, click on the \u003Ccode\u003EActions\u003C/code\u003E tab near the top middle of the page\u003C/li\u003E\u003Cli\u003EIn the left navigation bar click on the name of the workflow \u003Ccode\u003EDeploy Snowpark Apps\u003C/code\u003E\u003C/li\u003E\u003Cli\u003EClick on the name of most recent specific run (which should match the comment you entered)\u003C/li\u003E\u003Cli\u003EFrom the run overview page click on the \u003Ccode\u003Edeploy\u003C/code\u003E job and then browse through the output from the various steps. In particular you might want to review the output from the \u003Ccode\u003EDeploy Snowpark apps\u003C/code\u003E step.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/github-actions-run-summary.png\" alt=\"assets/github-actions-run-summary.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EThe output of the \u003Ccode\u003EDeploy Snowpark apps\u003C/code\u003E step should be familiar to you by now, and should be what you saw in the terminal in VS Code when you ran SnowCLI in previous steps. The one thing that may be different is the order of the output, but you should be able to see what's happening.\u003C/p\u003E\n","\u003Ch2\u003ETeardown\u003C/h2\u003E\n","\u003Cp\u003EOnce you're finished with the Quickstart and want to clean things up, you can simply run the \u003Ccode\u003Esteps/11_teardown.sql\u003C/code\u003E script. Since this is a SQL script we will be using our native VS Code extension to execute it. So simply open the \u003Ccode\u003Esteps/11_teardown.sql\u003C/code\u003E script in VS Code and run the whole thing using the &quot;Execute All Statements&quot; button in the upper right corner of the editor window.\u003C/p\u003E\n","\u003Ch2\u003EConclusion\u003C/h2\u003E\n","\u003Cp\u003EWow, we have covered a lot of ground during this Quickstart! By now you have built a robust data engineering pipeline using Snowpark Python stored procedures. This pipeline processes data incrementally, is orchestrated with Snowflake tasks, and is deployed via a CI/CD pipeline. You also learned how to use Snowflake's new developer CLI tool and Visual Studio Code extension! Here's a quick visual recap:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EBut we've really only just scratched the surface of what's possible with Snowpark. Hopefully you now have the building blocks, and examples, you need to get started building your own data engineering pipeline with Snowpark Python. So, what will you build now?\u003C/p\u003E\n","\u003Ch3\u003EWhat we've covered\u003C/h3\u003E\n","\u003Cp\u003EWe've covered a ton in this Quickstart, and here are the highlights:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowflake's Table Format\u003C/li\u003E\u003Cli\u003EData ingestion with COPY\u003C/li\u003E\u003Cli\u003ESchema inference\u003C/li\u003E\u003Cli\u003EData sharing/marketplace (instead of ETL)\u003C/li\u003E\u003Cli\u003EStreams for incremental processing (CDC)\u003C/li\u003E\u003Cli\u003EStreams on views\u003C/li\u003E\u003Cli\u003EPython UDFs (with third-party packages)\u003C/li\u003E\u003Cli\u003EPython Stored Procedures\u003C/li\u003E\u003Cli\u003ESnowpark DataFrame API\u003C/li\u003E\u003Cli\u003ESnowpark Python programmability\u003C/li\u003E\u003Cli\u003EWarehouse elasticity (dynamic scaling)\u003C/li\u003E\u003Cli\u003EVisual Studio Code Snowflake native extension (PuPr, Git integration)\u003C/li\u003E\u003Cli\u003ESnowCLI (PuPr)\u003C/li\u003E\u003Cli\u003ETasks (with Stream triggers)\u003C/li\u003E\u003Cli\u003ETask Observability\u003C/li\u003E\u003Cli\u003EGitHub Actions (CI/CD) integration\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003ERelated Resources\u003C/h3\u003E\n","\u003Cp\u003EAnd finally, here's a quick recap of related resources:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://developers.snowflake.com/demos/data-engineering-pipelines/\"\u003EFull Demo on Snowflake Demo Hub\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python\"\u003ESource Code on GitHub\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowpark/python/index.html\"\u003ESnowpark Developer Guide for Python\u003C/a\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/udf/python/udf-python.html\"\u003EWriting Python UDFs\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/stored-procedures-python.html\"\u003EWriting Stored Procedures in Snowpark (Python)\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes.html\"\u003EWorking with DataFrames in Snowpark Python\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python?_fsi=TNKw8Mx5&amp;_fsi=TNKw8Mx5\"\u003EFork Repo on GitHub\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"/content/dam/snowflake-site/developers/2024/04/Data-Engineering-Pipelines-with-Snowpark-in-Snowflake-Notebooks.pdf\"\u003EDownload Reference Architecture\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://medium.com/snowflake/building-data-engineering-pipelines-with-snowpark-python-e14f2b525510\"\u003ERead the Blog\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://youtu.be/mpstEt0fU8U?list=TLGGTh02wdk5rsQyMjA5MjAyNQ\"\u003EWatch the Demo\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ERelated Tools\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://marketplace.visualstudio.com/items?itemName=snowflake.snowflake-vsc\"\u003ESnowflake Visual Studio Code Extension\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/snowcli\"\u003ESnowCLI Tool\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E"],"description":"Build robust data engineering pipelines with Snowpark Python for ELT, CDC processing, and data transformations.","title":"Data Engineering Pipelines with Snowpark Python","isDeveloperGuidesPage":false,":type":"snowflake-site/components/contentfragment",":items":{},":itemsOrder":[],"elements":{"quickstartArticleBody":{"dataType":"string","title":"Quickstart Article Body","value":"## Overview \n\n\u003E \"Data engineers are focused primarily on building and maintaining data pipelines that transport data through different steps and put it into a usable state ... The data engineering process encompasses the overall effort required to create **data pipelines** that automate the transfer of data from place to place and transform that data into a specific format for a certain type of analysis. In that sense, data engineering isn’t something you do once. It’s an ongoing practice that involves collecting, preparing, transforming, and delivering data. A data pipeline helps automate these tasks so they can be reliably repeated. It’s a practice more than a specific technology.\" (From Cloud Data Engineering for Dummies, Snowflake Special Edition)\n\nAre you interested in unleashing the power of Snowpark Python to build data engineering pipelines? Well then, this Quickstart is for you! The focus here will be on building data engineering pipelines with Python, and not on data science. For examples of doing data science with Snowpark Python please check out our [Machine Learning with Snowpark Python: - Credit Card Approval Prediction](/en/developers/guides/getting-started-snowpark-machine-learning/) Quickstart.\n\nThis Quickstart will cover a lot of ground, and by the end you will have built a robust data engineering pipeline using Snowpark Python stored procedures. That pipeline will process data incrementally, be orchestrated with Snowflake tasks, and be deployed via a CI/CD pipeline. You'll also learn how to use Snowflake's new developer CLI tool and Visual Studio Code extension! Here's a quick visual overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n\nSo buckle up and get ready!\n\n\n### Prerequisites\n* Familiarity with Python\n* Familiarity with the DataFrame API\n* Familiarity with Snowflake\n* Familiarity with Git repositories and GitHub\n\n### What You’ll Learn\nYou will learn about the following Snowflake features during this Quickstart:\n\n* Snowflake's Table Format\n* Data ingestion with COPY\n* Schema inference\n* Data sharing/marketplace (instead of ETL)\n* Streams for incremental processing (CDC)\n* Streams on views\n* Python UDFs (with third-party packages)\n* Python Stored Procedures\n* Snowpark DataFrame API\n* Snowpark Python programmability\n* Warehouse elasticity (dynamic scaling)\n* Visual Studio Code Snowflake native extension (PuPr, Git integration)\n* SnowCLI (PuPr)\n* Tasks (with Stream triggers)\n* Task Observability\n* GitHub Actions (CI/CD) integration\n\n### What You’ll Need\nYou will need the following things before beginning:\n\n* Snowflake account\n    * **A Snowflake Account**\n    * **A Snowflake user created with ACCOUNTADMIN permissions**. This user will be used to get things setup in Snowflake.\n    * **Anaconda Terms & Conditions accepted**. See Getting Started section in [Third-Party Packages](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-packages.html#getting-started).\n* GitHub account\n    * **A GitHub account**. If you don't already have a GitHub account you can create one for free. Visit the [Join GitHub](https://github.com/signup) page to get started.\n\n### What You’ll Build\nDuring this Quickstart you will accomplish the following things:\n\n* Load Parquet data to Snowflake using schema inference\n* Setup access to Snowflake Marketplace data\n* Create a Python UDF to convert temperature\n* Create a data engineering pipeline with Python stored procedures to incrementally process data\n* Orchestrate the pipelines with tasks\n* Monitor the pipelines with Snowsight\n* Deploy the Snowpark Python stored procedures via a CI/CD pipeline\n\n\n\u003C!-- ------------------------ --\u003E\n## Quickstart Setup\n\n### Fork the Quickstart Repository and Enable GitHub Actions\nYou'll need to create a fork of the repository for this Quickstart in your GitHub account. Visit the [Data Engineering Pipelines with Snowpark Python associated GitHub Repository](https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python) and click on the \"Fork\" button near the top right. Complete any required fields and click \"Create Fork\".\n\nBy default GitHub Actions disables any workflows (or CI/CD pipelines) defined in the forked repository. This repository contains a workflow to deploy your Snowpark Python UDF and stored procedures, which we'll use later on. So for now enable this workflow by opening your forked repository in GitHub, clicking on the `Actions` tab near the top middle of the page, and then clicking on the `I understand my workflows, go ahead and enable them` green button.\n\n![assets/github-actions-activate.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/github-actions-activate.png)\n\n### Create GitHub Codespace\nFor this Quickstart we will be using [GitHub Codespaces](https://docs.github.com/en/codespaces/overview) for our development environment. Codespaces offer a hosted development environment with a hosted, web-based VS Code environment. GitHub currently offers [60 hours for free each month](https://github.com/features/codespaces) when using a 2 node environment, which should be more than enough for this lab.\n\nTo create a GitHub Codespace, click on the green `\u003C\u003E Code` button from the GitHub repository homepage. In the Code popup, click on the `Codespaces` tab and then on the green `Create codespace on main`.\n\n![assets/codespace_setup.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/codespace_setup.png)\n\nThis will open a new tab and begin setting up your codespace. This will take a few minutes as it sets up the entire environment for this Quickstart. Here is what is being done for you:\n\n* Creating a container for your environment\n* Installing Anaconda (miniconda)\n* Creating a directory and default config files\n* Anaconda setup\n    * Creating the Anaconda environment\n    * Installing the Snowpark Python library\n    * Installing the SnowCLI Python CLI\n* VS Code setup\n    * Installing VS Code\n    * Configuring VS Code for the Python Anaconda environment\n    * Installing the Snowflake VS Code extension\n* Starting a hosted, web-based VS Code editor\n\nOnce the codepsace has been created and started you should see a hosted web-based version of VS Code with your forked repository set up! Just a couple more things and we're ready to start.\n\n### Configure Snowflake Credentials\nBoth the [Snowflake Connector for Python](https://docs.snowflake.com/en/developer-guide/python-connector/python-connector) and the SnowCLI tool use the same configuration files, which can be found in the `~/.snowflake` folder. Default configuration files were created for you during the codespace setup.\n\nFor this Quickstart you'll only need to edit the `~/.snowflake/connections.toml` file. The easiest way to edit the default `~/.snowflake/connections.toml` file is directly from VS Code in your codespace. Type `Command-P`, type (or paste) `~/.snowflake/connections.toml` and hit return. The config file should now be open. You just need to edit the file and replace the `account`, `user`, and `password` with your values. Then save and close the file.\n\n**Note:** The SnowCLI tool (and by extension this Quickstart) currently does not work with Key Pair authentication. It simply grabs your username and password details from the config file.\n\n### Verify Your Anaconda Environment is Activated\nDuring the codespace setup we created an Anaconda environment named `snowflake-demo`. And when VS Code started up it should have automatically activated the environment in your terminal. You should see something like this in the terminal, and in particular you should see `(snowflake-demo)` before your bash prompt.\n\n![assets/vscode-terminal-conda.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/vscode-terminal-conda.png)\n\nIf for some reason it wasn't activiated simply run `conda activate snowflake-demo` in your terminal.\n\n\n\u003C!-- ------------------------ --\u003E\n## Setup Snowflake\n\n### Snowflake Extensions for VS Code\nYou can run SQL queries against Snowflake in many different ways (through the Snowsight UI, SnowSQL, etc.) but for this Quickstart we'll be using the Snowflake extension for VS Code. For a brief overview of Snowflake's native extension for VS Code, please check out our [VS Code Marketplace Snowflake extension page](https://marketplace.visualstudio.com/items?itemName=snowflake.snowflake-vsc).\n\n### Run the Script\nTo set up all the objects we'll need in Snowflake for this Quickstart you'll need to run the `steps/01_setup_snowflake.sql` script.\n\nStart by clicking on the Snowflake extension in the left navigation bar in VS Code. Then login to your Snowflake account with a user that has ACCOUNTADMIN permissions. Once logged in to Snowflake, open the `steps/01_setup_snowflake.sql` script in VS Code by going back to the file Explorer in the left navigation bar.\n\nTo run all the queries in this script, use the \"Execute All Statements\" button in the upper right corner of the editor window. Or, if you want to run them in chunks, you can highlight the ones you want to run and press CMD/CTRL+Enter. \n\n\n\u003C!-- ------------------------ --\u003E\n## Load Raw\n\nDuring this step we will be loading the raw Tasty Bytes POS and Customer loyalty data from raw Parquet files in `s3://sfquickstarts/data-engineering-with-snowpark-python/` to our `RAW_POS` and `RAW_CUSTOMER` schemas in Snowflake. And you are going to be orchestrating this process from your laptop in Python using the Snowpark Python API. To put this in context, we are on step **#2** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Run the Script\nTo load the raw data, execute the `steps/02_load_raw.py` script. This can be done a number of ways in VS Code, from a terminal or directly by VS Code. For this demo you will need to execute the Python scripts from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps\npython 02_load_raw.py\n```\n\nWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\n\n### Running Snowpark Python Locally\nIn this step you will be running the Snowpark Python code locally from your laptop. At the bottom of the script is a block of code that is used for local debugging (under the `if __name__ == \"__main__\":` block):\n\n```python\n# For local debugging\nif __name__ == \"__main__\":\n    # Create a local Snowpark session\n    with Session.builder.getOrCreate() as session:\n        load_all_raw_tables(session)\n#        validate_raw_tables(session)\n```\n\nA few things to point out here. First, the Snowpark session is being created with the `Session.builder.getOrCreate()` statement. And the connection details used by the Snowpark library are pulled from the standard `~/.snowflake/connections.toml` configuration file (which you configured in step 2).\n\nThen after getting the Snowpark session it calls the `load_all_raw_tables(session)` method which does the heavy lifting. The next few sections will point out the key parts.\n\nFinally, almost all of the Python scripts in this Quickstart include a local debugging block. Later on we will create Snowpark Python stored procedures and UDFs and those Python scripts will have a similar block. So this pattern is important to understand.\n\n### Viewing What Happened in Snowflake\nThe [Query History](https://docs.snowflake.com/en/user-guide/ui-snowsight-activity.html#query-history) in Snowflake is a very power feature, that logs every query run against your Snowflake account, no matter which tool or process initiated it. And this is especially helpful when working with client tools and APIs.\n\nThe Python script you just ran did a small amount of work locally, basically just orchestrating the process by looping through each table and issuing the command to Snowflake to load the data. But all of the heavy lifting ran inside Snowflake! This push-down is a hallmark of the Snowpark API and allows you to leverage the scalability and compute power of Snowflake!\n\nLog in to your Snowflake account and take a quick look at the SQL that was generated by the Snowpark API. This will help you better understand what the API is doing and will help you debug any issues you may run into.\n\n![assets/query_history_sproc.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/query_history_sproc.png)\n\n\n### Schema Inference\nOne very helpful feature in Snowflake is the ability to infer the schema of files in a stage that you wish to work with. This is accomplished in SQL with the [`INFER_SCHEMA()`](https://docs.snowflake.com/en/sql-reference/functions/infer_schema.html) function. The Snowpark Python API does this for you automatically when you call the `session.read()` method. Here is the code snippet:\n\n```python\n    # we can infer schema using the parquet read option\n    df = session.read.option(\"compression\", \"snappy\") \\\n                            .parquet(location)\n```\n\n### Data Ingestion with COPY\nIn order to load the data into a Snowflake table we will use the `copy_into_table()` method on a DataFrame. This method will create the target table in Snowflake using the inferred schema (if it doesn't exist), and then call the highly optimized Snowflake [`COPY INTO \u003Ctable\u003E` Command](https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html). Here is the code snippet:\n\n```python\n    df.copy_into_table(\"{}\".format(tname))\n```\n\n### Snowflake's Table Format\nOne of the major advantages of Snowflake is being able to eliminate the need to manage a file-based data lake. And Snowflake was designed for this purpose from the beginning. In the step we are loading the raw data into a structured Snowflake managed table. But Snowflake tables can natively support structured and semi-structured data, and are stored in Snowflake's mature cloud table format (which predates Hudi, Delta or Iceberg).\n\nOnce loaded into Snowflake the data will be securely stored and managed, without the need to worry about securing and managing raw files. Additionally the data, whether raw or structured, can be transformed and queried in Snowflake using SQL or the language of your choice, without needing to manage separate compute services like Spark.\n\nThis is a huge advantage for Snowflake customers.\n\n\n### Warehouse Elasticity (Dynamic Scaling)\nWith Snowflake there is only one type of user defined compute cluster, the [Virtual Warehouse](https://docs.snowflake.com/en/user-guide/warehouses.html), regardless of the language you use to process that data (SQL, Python, Java, Scala, Javascript, etc.). This makes working with data much simpler in Snowflake. And governance of the data is completely separated from the compute cluster, in other words there is no way to get around Snowflake governance regardless of the warehouse settings or language being used.\n\nAnd these virtual warehouses can be dynamically scaled, in under a second for most sized warehouses! This means that in your code you can dynamically resize the compute environment to increase the amount of capacity to run a section of code in a fraction of the time, and then dynamically resized again to reduce the amount of capacity. And because of our per-second billing (with a sixty second minimum) you won't pay any extra to run that section of code in a fraction of the time!\n\nLet's see how easy that is done. Here is the code snippet:\n\n```python\n    _ = session.sql(\"ALTER WAREHOUSE HOL_WH SET WAREHOUSE_SIZE = XLARGE WAIT_FOR_COMPLETION = TRUE\").collect()\n\n    # Some data processing code\n\n    _ = session.sql(\"ALTER WAREHOUSE HOL_WH SET WAREHOUSE_SIZE = XSMALL\").collect()\n```\n\nPlease also note that we included the `WAIT_FOR_COMPLETION` parameter in the first `ALTER WAREHOUSE` statement. Setting this parameter to `TRUE` will block the return of the `ALTER WAREHOUSE` command until the resize has finished provisioning all its compute resources. This way we make sure that the full cluster is available before processing any data with it.\n\nWe will use this pattern a few more times during this Quickstart, so it's important to understand.\n\n\n\u003C!-- ------------------------ --\u003E\n## Load Weather\n\nDuring this step we will be \"loading\" the raw weather data to Snowflake. But \"loading\" is the really the wrong word here. Because we're using Snowflake's unique data sharing capability we don't actually need to copy the data to our Snowflake account with a custom ETL process. Instead we can directly access the weather data shared by Weather Source in the Snowflake Marketplace. To put this in context, we are on step **#3** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Snowflake Marketplace\nWeather Source is a leading provider of global weather and climate data and their OnPoint Product Suite provides businesses with the necessary weather and climate data to quickly generate meaningful and actionable insights for a wide range of use cases across industries. Let's connect to the `Weather Source LLC: frostbyte` feed from Weather Source in the Snowflake Marketplace by following these steps:\n\n* Login to Snowsight\n* Click on the `Marketplace` link in the left navigation bar\n* Enter \"Weather Source LLC: frostbyte\" in the search box and click return\n* Click on the \"Weather Source LLC: frostbyte\" listing tile\n* Click the blue \"Get\" button\n    * Expand the \"Options\" dialog\n    * Change the \"Database name\" to read \"FROSTBYTE_WEATHERSOURCE\" (all capital letters)\n    * Select the \"HOL_ROLE\" role to have access to the new database\n* Click on the blue \"Get\" button\n\nThat's it... we don't have to do anything from here to keep this data updated. The provider will do that for us and data sharing means we are always seeing whatever they have published. How amazing is that? Just think of all the things you didn't have do here to get access to an always up-to-date, third-party dataset!\n\n### Run the Script\nOpen the `steps/03_load_weather.sql` script in VS Code from the file Explorer in the left navigation bar, and run the script. Notice how easy it is to query data shared through the Snowflake Marketplace! You access it just like any other table or view in Snowflake:\n\n```sql\nSELECT * FROM FROSTBYTE_WEATHERSOURCE.ONPOINT_ID.POSTAL_CODES LIMIT 100;\n```\n\n\n\u003C!-- ------------------------ --\u003E\n## Create POS View\n\nDuring this step we will be creating a view to simplify the raw POS schema by joining together 6 different tables and picking only the columns we need. But what's really cool is that we're going to define that view with the Snowpark DataFrame API! Then we're going to create a Snowflake stream on that view so that we can incrementally process changes to any of the POS tables. To put this in context, we are on step **#4** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Run the Script\nTo create the view and stream, execute the `steps/04_create_pos_view.py` script. Like we did in step 2, let's execute it from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps\npython 04_create_pos_view.py\n```\n\nWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\n\n### Snowpark DataFrame API\nThe first thing you'll notice in the `create_pos_view()` function is that we define the Snowflake view using the Snowpark DataFrame API. After defining the final DataFrame, which captures all the logic we want in the view, we can simply call the Snowpark `create_or_replace_view()` method. Here's the final line from the `create_pos_view()` function:\n\n```python\n    final_df.create_or_replace_view('POS_FLATTENED_V')\n```\n\nFor more details about the Snowpark Python DataFrame API, please check out our [Working with DataFrames in Snowpark Python](https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes.html) page.\n\n### Streams for Incremental Processing (CDC)\nSnowflake makes processing data incrementally very easy. Traditionally the data engineer had to keep track of a high watermark (usually a datetime column) in order to process only new records in a table. This involved tracking and persisting that watermark somewhere and then using it in any query against the source table. But with Snowflake streams all the heavy lifting is done for you by Snowflake. For more details please check out our [Change Tracking Using Table Streams](https://docs.snowflake.com/en/user-guide/streams.html) user guide.\n\nAll you need to do is create a [`STREAM`](https://docs.snowflake.com/en/sql-reference/sql/create-stream.html) object in Snowflake against your base table or view, then query that stream just like any table in Snowflake. The stream will return only the changed records since the last DML option your performed. To help you work with the changed records, Snowflake streams will supply the following metadata columns along with the base table or view columns:\n\n* METADATA$ACTION\n* METADATA$ISUPDATE\n* METADATA$ROW_ID\n\nFor more details about these stream metadata columns please check out the [Stream Columns](https://docs.snowflake.com/en/user-guide/streams-intro.html#stream-columns) section in our documentation.\n\n### Streams on views\nWhat's really cool about Snowflake's incremental/CDC stream capability is the ability to create a stream on a view! In this example we are creating a stream on a view which joins together 6 of the raw POS tables. Here is the code to do that:\n\n```python\ndef create_pos_view_stream(session):\n    session.use_schema('HARMONIZED')\n    _ = session.sql('CREATE OR REPLACE STREAM POS_FLATTENED_V_STREAM \\\n                        ON VIEW POS_FLATTENED_V \\\n                        SHOW_INITIAL_ROWS = TRUE').collect()\n```\n\nNow when we query the `POS_FLATTENED_V_STREAM` stream to find changed records, Snowflake is actually looking for changed records in any of the 6 tables included in the view. For those who have tried to build incremental/CDC processes around denormalized schemas like this, you will appreciate the incredibly powerful feature that Snowflake provides here.\n\nFor more details please check out the [Streams on Views](https://docs.snowflake.com/en/user-guide/streams-intro.html#streams-on-views) section in our documentation.\n\n\n\u003C!-- ------------------------ --\u003E\n## Fahrenheit to Celsius UDF\n\nDuring this step we will be creating and deploying our first Snowpark Python object to Snowflake, a user-defined function (or UDF). To begin with the UDF will be very basic, but in a future step we'll update it to include a third-party Python package. Also in this step you will be introduced to the new SnowCLI, a new developer command line tool. SnowCLI makes building and deploying Snowpark Python objects to Snowflake a consistent experience for the developer. More details below on SnowCLI. To put this in context, we are on step **#5** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Running the UDF Locally\nTo test the UDF locally, you will execute the `steps/05_fahrenheit_to_celsius_udf/fahrenheit_to_celsius_udf/function.py` script. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps/05_fahrenheit_to_celsius_udf\npython fahrenheit_to_celsius_udf/function.py 35\n```\n\nWhile you're developing the UDF you can simply run it locally in VS Code. And if your UDF doesn't need to query data from Snowflake, this process will be entirely local.\n\n### Deploying the UDF to Snowflake\nTo deploy your UDF to Snowflake we will use the SnowCLI tool. The SnowCLI tool will do all the heavy lifting of packaging up your application, copying it to a Snowflake stage, and creating the object in Snowflake. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps/05_fahrenheit_to_celsius_udf\nsnow snowpark build\nsnow snowpark deploy\n```\n\nWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\n\n### Running the UDF in Snowflake\nIn order to run the UDF in Snowflake you have a few options. Any UDF in Snowflake can be invoked through SQL as follows:\n\n```sql\nSELECT ANALYTICS.FAHRENHEIT_TO_CELSIUS_UDF(35);\n```\n\nAnd with the SnowCLI utility you can also invoke the UDF from the terminal in VS Code as follows:\n\n```bash\nsnow snowpark execute function \"fahrenheit_to_celsius_udf(35)\"\n```\n\nThat will result in the SnowCLI tool generating the SQL query above and running it against your Snowflake account.\n\n### Overview of the SnowCLI Tool\nThe [SnowCLI](https://github.com/Snowflake-Labs/snowcli) tool is a command line tool for developers, and is executed as `snow` from the command line. \n\n\u003E **Note** - Do not confuse this with the [SnowSQL](https://docs.snowflake.com/en/user-guide/snowsql.html) command line tool which is a client for connecting to Snowflake to execute SQL queries and perform all DDL and DML operations, and is executed as `snowsql` from the command line.\n\nSnowCLI simplifies the development and deployment of the following Snowflake objects:\n\n* Snowpark Python UDFs\n* Snowpark Python Stored Procedures\n* Streamlit Applications\n\nFor this Quickstart we will be focused on the first two. And for Snowpark Python UDFs and sprocs in particular, the SnowCLI does all the heavy lifting of deploying the objects to Snowflake. Here's a brief summary of the steps the SnowCLI deploy command does for you:\n\n* Dealing with third-party packages\n    * For packages that can be accessed directly from our Anaconda channel it will add them to the `PACKAGES` list in the `CREATE PROCEDURE` or `CREATE FUNCTION` SQL command\n    * For packages which are not currently available in our Anaconda channel it will download the code and include them in the project zip file\n* Creating a zip file of everything in your project\n* Copying that project zip file to your Snowflake stage\n* Creating the Snowflake function or stored procedure object\n\nThis also allows you to develop and test your Python application without having to worry about wrapping it in a corresponding Snowflake database object.\n\n### More on Snowpark Python UDFs\nIn this step we deployed a very simple Python UDF to Snowflake. In a future step will update it to use a third-party package. And because we deployed it to Snowflake with the SnowCLI command you didn't have to worry about the SQL DDL Syntax to create the object in Snowflake. But for reference please check out our [Writing Python UDFs](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python.html) developer guide.\n\nHere is the SQL query that the SnowCLI tool generated to deploy the function:\n\n```sql\ncreate or replace function HOL_DB.ANALYTICS.FAHRENHEIT_TO_CELSIUS_UDF(temp_f float)\nreturns float\nlanguage python\nruntime_version=3.10\nimports=('@HOL_DB.ANALYTICS.DEPLOYMENT/hol/fahrenheit_to_celsius_udf.zip')\nhandler='function.main'\npackages=('snowflake-snowpark-python')\n```\n\n\n\u003C!-- ------------------------ --\u003E\n## Orders Update Sproc\n\nDuring this step we will be creating and deploying our first Snowpark Python stored procedure (or sproc) to Snowflake. This sproc will merge changes from the `HARMONIZED.POS_FLATTENED_V_STREAM` stream into our target `HARMONIZED.ORDERS` table. To put this in context, we are on step **#6** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Running the Sproc Locally\nTo test the procedure locally, you will execute the `steps/06_orders_update_sp/orders_update_sp/procedure.py` script. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps/06_orders_update_sp\npython orders_update_sp/procedure.py\n```\n\nWhile you're developing the sproc you can simply run it locally in VS Code. The Python code will run locally on your laptop, but the Snowpark DataFrame code will issue SQL queries to your Snowflake account.\n\n### Deploying the Sproc to Snowflake\nTo deploy your sproc to Snowflake we will use the SnowCLI tool. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps/06_orders_update_sp\nsnow snowpark build\nsnow snowpark deploy\n```\n\nWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\n\n### Running the Sproc in Snowflake\nIn order to run the sproc in Snowflake you have a few options. Any sproc in Snowflake can be invoked through SQL as follows:\n\n```sql\nCALL ORDERS_UPDATE_SP();\n```\n\nAnd with the SnowCLI utility you can also invoke the UDF from the terminal in VS Code as follows:\n\n```bash\nsnow snowpark execute procedure \"harmonized.orders_update_sp()\"\n```\n\nThat will result in the SnowCLI tool generating the SQL query above and running it against your Snowflake account.\n\n### More on Snowpark Python Sprocs\nIn this step we deployed a Python sproc to Snowflake. And because we deployed it to Snowflake with the SnowCLI command you didn't have to worry about the SQL DDL Syntax to create the object in Snowflake. But for reference please check out our [Writing Stored Procedures in Snowpark (Python)](https://docs.snowflake.com/en/sql-reference/stored-procedures-python.html) guide.\n\nHere is the SQL query that the SnowCLI tool generated to deploy the procedure:\n\n```sql\ncreate or replace procedure HOL_DB.HARMONIZED.ORDERS_UPDATE_SP()\nreturns string\nlanguage python\nruntime_version=3.10\nimports=('@HOL_DB.HARMONIZED.DEPLOYMENT/hol/orders_update_sp.zip')\nhandler='procedure.main'\npackages=('snowflake-snowpark-python')\n```\n\n### More on the Snowpark API\nIn this step we're starting to really use the Snowpark DataFrame API for data transformations. The Snowpark API provides the same functionality as the [Spark SQL API](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/index.html). To begin with you need to create a Snowpark session object. Like PySpark, this is accomplished with the `Session.builder.configs().create()` methods. When running locally, we use the `Session.builder.getOrCreate()` method to create the session object for us. But when deployed to Snowflake, the session object is provisioned for you automatically by Snowflake. And when building a Snowpark Python sproc the contract is that the first argument to the entry point (or handler) function is a Snowpark session.\n\nThe first thing you'll notice in the `steps/06_orders_update_sp/orders_update_sp/procedure.py` script is that we have some functions which use SQL to create objects in Snowflake and to check object status. To issue a SQL statement to Snowflake with the Snowpark API you use the `session.sql()` function, like you'd expect. Here's one example:\n\n```python\ndef create_orders_stream(session):\n    _ = session.sql(\"CREATE STREAM IF NOT EXISTS HARMONIZED.ORDERS_STREAM ON TABLE HARMONIZED.ORDERS \\\n                    SHOW_INITIAL_ROWS = TRUE;\").collect()\n```\n\nThe second thing to point out is how we're using DataFrames to merge changes from the source view to the target table. The Snowpark DataFrame API provides a `merge()` method which will ultimately generate a `MERGE` command in Snowflake.\n\n```python\n    source = session.table('HARMONIZED.POS_FLATTENED_V_STREAM')\n    target = session.table('HARMONIZED.ORDERS')\n\n    # TODO: Is the if clause supposed to be based on \"META_UPDATED_AT\"?\n    cols_to_update = {c: source[c] for c in source.schema.names if \"METADATA\" not in c}\n    metadata_col_to_update = {\"META_UPDATED_AT\": F.current_timestamp()}\n    updates = {**cols_to_update, **metadata_col_to_update}\n\n    # merge into DIM_CUSTOMER\n    target.merge(source, target['ORDER_DETAIL_ID'] == source['ORDER_DETAIL_ID'], \\\n                        [F.when_matched().update(updates), F.when_not_matched().insert(updates)])\n```\n\nAgain, for more details about the Snowpark Python DataFrame API, please check out our [Working with DataFrames in Snowpark Python](https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes.html) page.\n\n\n\u003C!-- ------------------------ --\u003E\n## Daily City Metrics Update Sproc\n\nDuring this step we will be creating and deploying our second Snowpark Python sproc to Snowflake. This sproc will join the `HARMONIZED.ORDERS` data with the Weather Source data to create a final, aggregated table for analysis named `ANALYTICS.DAILY_CITY_METRICS`. We will process the data incrementally from the `HARMONIZED.ORDERS` table using another Snowflake Stream. And we will again use the Snowpark DataFrame `merge()` method to merge/upsert the data. To put this in context, we are on step **#7** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Running the Sproc Locally\nTo test the procedure locally, you will execute the `steps/07_daily_city_metrics_update_sp/daily_city_metrics_update_sp/procedure.py` script. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps/07_daily_city_metrics_update_sp\npython daily_city_metrics_update_sp/procedure.py\n```\n\nWhile you're developing the sproc you can simply run it locally in VS Code. The Python code will run locally on your laptop, but the Snowpark DataFrame code will issue SQL queries to your Snowflake account.\n\n### Deploying the Sproc to Snowflake\nTo deploy your sproc to Snowflake we will use the SnowCLI tool. Like we did in the previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps/07_daily_city_metrics_update_sp\nsnow snowpark build\nsnow snowpark deploy\n```\n\nWhile that is running, please open the script in VS Code and continue on this page to understand what is happening.\n\n### Running the Sproc in Snowflake\nIn order to run the sproc in Snowflake you have a few options. Any sproc in Snowflake can be invoked through SQL as follows:\n\n```sql\nCALL DAILY_CITY_METRICS_UPDATE_SP();\n```\n\nAnd with the SnowCLI utility you can also invoke the UDF from the terminal in VS Code as follows:\n\n```bash\nsnow snowpark execute procedure \"daily_city_metrics_update_sp()\"\n```\n\nThat will result in the SnowCLI tool generating the SQL query above and running it against your Snowflake account.\n\n### Data Modeling Best Practice\nWhen modeling data for analysis a best practice has been to clearly define and manage the schema of the table. In step 2, when we loaded raw data from Parquet we took advantage of Snowflake's schema detection feature to create a table with the same schema as the Parquet files. In this step we are explicitly defining the schema in DataFrame syntax and using that to create the table.\n\n```python\ndef create_daily_city_metrics_table(session):\n    SHARED_COLUMNS= [T.StructField(\"DATE\", T.DateType()),\n                                        T.StructField(\"CITY_NAME\", T.StringType()),\n                                        T.StructField(\"COUNTRY_DESC\", T.StringType()),\n                                        T.StructField(\"DAILY_SALES\", T.StringType()),\n                                        T.StructField(\"AVG_TEMPERATURE_FAHRENHEIT\", T.DecimalType()),\n                                        T.StructField(\"AVG_TEMPERATURE_CELSIUS\", T.DecimalType()),\n                                        T.StructField(\"AVG_PRECIPITATION_INCHES\", T.DecimalType()),\n                                        T.StructField(\"AVG_PRECIPITATION_MILLIMETERS\", T.DecimalType()),\n                                        T.StructField(\"MAX_WIND_SPEED_100M_MPH\", T.DecimalType()),\n                                    ]\n    DAILY_CITY_METRICS_COLUMNS = [*SHARED_COLUMNS, T.StructField(\"META_UPDATED_AT\", T.TimestampType())]\n    DAILY_CITY_METRICS_SCHEMA = T.StructType(DAILY_CITY_METRICS_COLUMNS)\n\n    dcm = session.create_dataframe([[None]*len(DAILY_CITY_METRICS_SCHEMA.names)], schema=DAILY_CITY_METRICS_SCHEMA) \\\n                        .na.drop() \\\n                        .write.mode('overwrite').save_as_table('ANALYTICS.DAILY_CITY_METRICS')\n    dcm = session.table('ANALYTICS.DAILY_CITY_METRICS')\n```\n\n### Complex Aggregation Query\nThe `merge_daily_city_metrics()` function contains a complex aggregation query which is used to join together and aggregate the data from our POS and Weather Source. Take a look at the series of complex series of joins and aggregations that are expressed, and how we're even leveraging the Snowpark UDF we created in step #5!\n\nThe complex aggregation query is then merged into the final analytics table using the Snowpark `merge()` method. If you haven't already, check out your Snowflake Query history and see which queries were generated by the Snowpark API. In this case you will see that the Snowpark API took all the complex logic, including the merge and created a single Snowflake query to execute!\n\n\n\u003C!-- ------------------------ --\u003E\n## Orchestrate Jobs\n\nDuring this step we will be orchestrating our new Snowpark pipelines with Snowflake's native orchestration feature named Tasks. We will create two tasks, one for each stored procedure, and chain them together. We will then run the tasks. To put this in context, we are on step **#8** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Run the Script\nSince this is a SQL script we will be using our native VS Code extension to execute it. So simply open the `steps/08_orchestrate_jobs.sql` script in VS Code and run the whole thing using the \"Execute All Statements\" button in the upper right corner of the editor window.\n\nWhile that is running, please read through the script in VS Code and continue on this page to understand what is happening.\n\n### Running the Tasks\nIn this step we did not create a schedule for our task DAG, so it will not run on its own at this point. So in this script you will notice that we manually execute the DAG, like this:\n\n```sql\nEXECUTE TASK ORDERS_UPDATE_TASK;\n```\n\nTo see what happened when you ran this task just now, highlight and run (using CMD/CTRL+Enter) this commented query in the script:\n\n```sql\nSELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=\u003EDATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =\u003E 100))\nORDER BY SCHEDULED_TIME DESC\n;\n```\n\nYou will notice in the task history output that it skipped our task `ORDERS_UPDATE_TASK`. This is correct, because our `HARMONIZED.POS_FLATTENED_V_STREAM` stream doesn't have any data. We'll add some new data and run them again in the next step.\n\n### More on Tasks\nTasks are Snowflake's native scheduling/orchestration feature. With a task you can execute any one of the following types of SQL code:\n\n* Single SQL statement\n* Call to a stored procedure\n* Procedural logic using Snowflake Scripting Developer Guide\n\nFor this Quickstart we'll call our Snowpark stored procedures. Here is the SQL DDL code to create the second task:\n\n```sql\nCREATE OR REPLACE TASK DAILY_CITY_METRICS_UPDATE_TASK\nWAREHOUSE = HOL_WH\nAFTER ORDERS_UPDATE_TASK\nWHEN\n  SYSTEM$STREAM_HAS_DATA('ORDERS_STREAM')\nAS\nCALL ANALYTICS.DAILY_CITY_METRICS_UPDATE_SP();\n```\n\nA few things to point out. First you specify which Snowflake virtual warehouse to use when running the task with the `WAREHOUSE` clause. The `AFTER` clause lets you define the relationship between tasks, and the structure of this relationship is a Directed Acyclic Graph (or DAG) like most orchestration tools provide. The `AS` clause let's you define what the task should do when it runs, in this case to call our stored procedure.\n\nThe `WHEN` clause is really cool. We've already seen how streams work in Snowflake by allowing you to incrementally process data. We've even seen how you can create a stream on a view (which joins many tables together) and create a stream on that view to process its data incrementally! Here in the `WHEN` clause we're calling a system function `SYSTEM$STREAM_HAS_DATA()` which returns true if the specified stream has new data. With the `WHEN` clause in place the virtual warehouse will only be started up when the stream has new data. So if there's no new data when the task runs then your warehouse won't be started up and you won't be charged. You will only be charged when there's new data to process. Pretty cool, huh?\n\nAs mentioned above we did not define a `SCHEDULE` for the root task, so this DAG will not run on its own. That's fine for this Quickstart, but in a real situation you would define a schedule. See [CREATE TASK](https://docs.snowflake.com/en/sql-reference/sql/create-task.html) for the details.\n\nAnd for more details on Tasks see [Introduction to Tasks](https://docs.snowflake.com/en/user-guide/tasks-intro.html).\n\n### Task Metadata\nSnowflake keeps metadata for almost everything you do, and makes that metadata available for you to query (and to create any type of process around). Tasks are no different, Snowflake maintains rich metadata to help you monitor your task runs. Here are a few sample SQL queries you can use to monitor your tasks runs:\n\n```sql\n-- Get a list of tasks\nSHOW TASKS;\n\n-- Task execution history in the past day\nSELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=\u003EDATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =\u003E 100))\nORDER BY SCHEDULED_TIME DESC\n;\n\n-- Scheduled task runs\nSELECT\n    TIMESTAMPDIFF(SECOND, CURRENT_TIMESTAMP, SCHEDULED_TIME) NEXT_RUN,\n    SCHEDULED_TIME,\n    NAME,\n    STATE\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())\nWHERE STATE = 'SCHEDULED'\nORDER BY COMPLETED_TIME DESC;\n```\n\n### Monitoring Tasks\nSo while you're free to create any operational or monitoring process you wish, Snowflake provides some rich task observability features in our Snowsight UI. Try it out for yourself by following these steps:\n\n1. In the Snowsight navigation menu, click **Data** » **Databases**.\n1. In the right pane, using the object explorer, navigate to a database and schema.\n1. For the selected schema, select and expand **Tasks**.\n1. Select a task. Task information is displayed, including **Task Details**, **Graph**, and **Run History** sub-tabs.\n1. Select the **Graph** tab. The task graph appears, displaying a hierarchy of child tasks.\n1. Select a task to view its details.\n\nHere's what the task graph looks like:\n\n![assets/ui-snowsight-task-graph.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/ui-snowsight-task-graph.png)\n\nAnd here's an example of the task run history:\n\n![assets/ui-snowsight-task-run-history.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/ui-snowsight-task-run-history.png)\n\nFor more details, and to learn about viewing account level task history, please check out our [Viewing Task History](https://docs.snowflake.com/en/user-guide/ui-snowsight-tasks.html) documentation.\n\n\n\u003C!-- ------------------------ --\u003E\n## Process Incrementally\n\nDuring this step we will be adding new data to our POS order tables and then running our entire end-to-end pipeline to process the new data. And this entire pipeline will be processing data incrementally thanks to Snowflake's advanced stream/CDC capabilities. To put this in context, we are on step **#9** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Run the Script\nSince this is a SQL script we will be using our native VS Code extension to execute it. So simply open the `steps/09_process_incrementally.sql` script in VS Code and run the whole thing using the \"Execute All Statements\" button in the upper right corner of the editor window.\n\nWhile that is running, let's briefly discuss what's happening. As in step #2, we're going to load data from Parquet into our raw POS tables. In step #2 we loaded all the order data except for the 2022 data for `ORDER_HEADER` and `ORDER_DETAIL`. So now we're going to load the remaining data.\n\nThis time we will be doing the data loading through SQL instead of Python, but the process is the same. We'll resize the warehouse, scaling up so that we can load the data faster and then scaling back down after when we're done. After the new data is loaded we will also run the task DAG again. And this time both tasks will run and process the new data.\n\n### Viewing the Task History\nLike the in the previous step, to see what happened when you ran this task DAG, highlight and run (using CMD/CTRL+Enter) this commented query in the script:\n\n```sql\nSELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=\u003EDATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =\u003E 100))\nORDER BY SCHEDULED_TIME DESC\n;\n```\n\nThis time you will notice that the `ORDERS_UPDATE_TASK` task will not be skipped, since the `HARMONIZED.POS_FLATTENED_V_STREAM` stream has new data. In a few minutes you should see that both the `ORDERS_UPDATE_TASK` task and the `DAILY_CITY_METRICS_UPDATE_TASK` task completed successfully.\n\n### Query History for Tasks\nOne important thing to understand about tasks, is that the queries which get executed by the task won't show up with the default Query History UI settings. In order to see the queries that just ran you need to do the following:\n\n* Remove filters at the top of this table, including your username, as later scheduled tasks will run as \"System\":\n\n![](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/query_history_remove_filter1.png)\n\n* Click \"Filter\", and add filter option 'Queries executed by user tasks' and click \"Apply Filters\":\n\n![](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/query_history_remove_filter2.png)\n\nYou should now see all the queries run by your tasks! Take a look at each of the MERGE commands in the Query History to see how many records were processed by each task. And don't forget to notice that we processed the whole pipeline just now, and did so incrementally!\n\n\n\u003C!-- ------------------------ --\u003E\n## Deploy Via CI/CD\n\nDuring this step we will be making a change to our `FAHRENHEIT_TO_CELSIUS_UDF()` UDF and then deploying it via a CI/CD pipeline. We will be updating the `FAHRENHEIT_TO_CELSIUS_UDF()` UDF to use a third-party Python package, pushing it to your forked GitHub repo, and finally deploying it using the SnowCLI in a GitHub Actions workflow! To put this in context, we are on step **#10** in our data flow overview:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\n### Update the Fahrenheit to Celsius UDF\nWe will be replacing our hard-coded temperature conversion with a package from `scipy`. First we will make a few changes to the `steps/05_fahrenheit_to_celsius_udf/fahrenheit_to_celsius_udf/function.py` script. In this file we will be adding an `import` command and replacing the body of the `main()` function. So open the `steps/05_fahrenheit_to_celsius_udf/fahrenheit_to_celsius_udf/function.py` script in VS Code and replace this section:\n\n```python\nimport sys\n\ndef main(temp_f: float) -\u003E float:\n    return (float(temp_f) - 32) * (5/9)\n```\n\nWith this:\n\n```python\nimport sys\nfrom scipy.constants import convert_temperature\n\ndef main(temp_f: float) -\u003E float:\n    return convert_temperature(float(temp_f), 'F', 'C')\n```\n\nDon't forget to save your changes.\n\nThe second change we need to make is to add `scipy` to our `requirements.txt` file. Open the `steps/05_fahrenheit_to_celsius_udf/requirements.txt` file in VS Code, add a newline with `scipy` on it and save it.\n\n### Test your Changes Locally\nTo test the UDF locally, you will execute the `steps/05_fahrenheit_to_celsius_udf/fahrenheit_to_celsius_udf/function.py` script. Like we did in previous steps, we'll execute it from the terminal. So go back to the terminal in VS Code, make sure that your `snowflake-demo` conda environment is active, then run the following commands (which assume that your terminal has the root of your repository open):\n\n```bash\ncd steps/05_fahrenheit_to_celsius_udf\npip install -r requirements.txt\npython fahrenheit_to_celsius_udf/function.py 35\n```\n\nNotice that this time we're also running pip install to make sure that our dependent packages are installed. Once your function runs successfully we'll be ready to deploy it via CI/CD!\n\n### Configuring Your Forked GitHub Project\nIn order for your GitHub Actions workflow to be able to connect to your Snowflake account you will need to store your Snowflake credentials in GitHub. Action Secrets in GitHub are used to securely store values/variables which will be used in your CI/CD pipelines. In this step we will create secrets for each of the parameters used by SnowCLI.\n\nFrom the repository, click on the `Settings` tab near the top of the page. From the Settings page, click on the `Secrets and variables` then `Actions` tab in the left hand navigation. The `Actions` secrets should be selected. For each secret listed below click on `New repository secret` near the top right and enter the name given below along with the appropriate value (adjusting as appropriate).\n\n| Secret name | Secret value |\n|-------------|--------------|\n| SNOWFLAKE_ACCOUNT | myaccount |\n| SNOWFLAKE_USER | myusername |\n| SNOWFLAKE_PASSWORD | mypassword |\n| SNOWFLAKE_ROLE | HOL_ROLE |\n| SNOWFLAKE_WAREHOUSE | HOL_WH |\n| SNOWFLAKE_DATABASE | HOL_DB |\n\n\n\u003E  **Tip** - For more details on how to structure the account name in SNOWFLAKE_ACCOUNT, see the account name discussion in [the Snowflake Python Connector install guide](https://docs.snowflake.com/en/user-guide/python-connector-install.html#step-2-verify-your-installation).\n\nWhen you’re finished adding all the secrets, the page should look like this:\n\n![assets/github-actions-secrets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/github-actions-secrets.png)\n\n\n\u003E  **Tip** - For an even better solution to managing your secrets, you can leverage [GitHub Actions Environments](https://docs.github.com/en/actions/reference/environments). Environments allow you to group secrets together and define protection rules for each of your environments.\n\n\n### Push Changes to Forked Repository\nNow that we have a changes ready and tested, and our Snowflake credentials stored in GitHub, let's commit them to our local repository and then push them to your forked repository. This can certainly be done from the command line, but in this step we'll do so through VS Code to make it easy.\n\nStart by opening the \"Source Control\" extension in the left hand nav bar, you should see two files with changes. Click the `+` (plus) sign at the right of each file name to stage the changes. Then enter a message in the \"Message\" box and click the blue `Commit` button to commit the changes locally. Here's what it should look like before you click the button:\n\n![assets/vs_code_repo_commit.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/vs_code_repo_commit.png)\n\nAt this point those changes are only committed locally and have not yet been pushed to your forked repository in GitHub. To do that, simply click the blue `Sync Changes` button to push these commits to GitHub. Here's what it should look like before you click the button:\n\n![assets/vs_code_repo_push.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/vs_code_repo_push.png)\n\n### Viewing GitHub Actions Workflow\nThis repository is already set up with a very simple GitHub Actions CI/CD pipeline. You can review the code for the workflow by opening the `.github/workflows/build_and_deploy.yaml` file in VS Code.\n\nAs soon as you pushed the changes to your GitHub forked repo the workflow kicked off. To view the results go back to the homepage for your GitHub repository and do the following:\n\n* From the repository, click on the `Actions` tab near the top middle of the page\n* In the left navigation bar click on the name of the workflow `Deploy Snowpark Apps`\n* Click on the name of most recent specific run (which should match the comment you entered)\n* From the run overview page click on the `deploy` job and then browse through the output from the various steps. In particular you might want to review the output from the `Deploy Snowpark apps` step.\n\n![assets/github-actions-run-summary.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/github-actions-run-summary.png)\n\nThe output of the `Deploy Snowpark apps` step should be familiar to you by now, and should be what you saw in the terminal in VS Code when you ran SnowCLI in previous steps. The one thing that may be different is the order of the output, but you should be able to see what's happening.\n\n\n## Teardown\n\nOnce you're finished with the Quickstart and want to clean things up, you can simply run the `steps/11_teardown.sql` script. Since this is a SQL script we will be using our native VS Code extension to execute it. So simply open the `steps/11_teardown.sql` script in VS Code and run the whole thing using the \"Execute All Statements\" button in the upper right corner of the editor window.\n\n\n## Conclusion\n\nWow, we have covered a lot of ground during this Quickstart! By now you have built a robust data engineering pipeline using Snowpark Python stored procedures. This pipeline processes data incrementally, is orchestrated with Snowflake tasks, and is deployed via a CI/CD pipeline. You also learned how to use Snowflake's new developer CLI tool and Visual Studio Code extension! Here's a quick visual recap:\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python/data_pipeline_overview.png)\n\nBut we've really only just scratched the surface of what's possible with Snowpark. Hopefully you now have the building blocks, and examples, you need to get started building your own data engineering pipeline with Snowpark Python. So, what will you build now?\n\n### What we've covered\nWe've covered a ton in this Quickstart, and here are the highlights:\n\n* Snowflake's Table Format\n* Data ingestion with COPY\n* Schema inference\n* Data sharing/marketplace (instead of ETL)\n* Streams for incremental processing (CDC)\n* Streams on views\n* Python UDFs (with third-party packages)\n* Python Stored Procedures\n* Snowpark DataFrame API\n* Snowpark Python programmability\n* Warehouse elasticity (dynamic scaling)\n* Visual Studio Code Snowflake native extension (PuPr, Git integration)\n* SnowCLI (PuPr)\n* Tasks (with Stream triggers)\n* Task Observability\n* GitHub Actions (CI/CD) integration\n\n### Related Resources\nAnd finally, here's a quick recap of related resources:\n\n* [Full Demo on Snowflake Demo Hub](https://developers.snowflake.com/demos/data-engineering-pipelines/)\n* [Source Code on GitHub](https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python)\n* [Snowpark Developer Guide for Python](https://docs.snowflake.com/en/developer-guide/snowpark/python/index.html)\n    * [Writing Python UDFs](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python.html)\n    * [Writing Stored Procedures in Snowpark (Python)](https://docs.snowflake.com/en/sql-reference/stored-procedures-python.html)\n    * [Working with DataFrames in Snowpark Python](https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes.html)\n* [Fork Repo on GitHub](https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python?_fsi=TNKw8Mx5&amp;_fsi=TNKw8Mx5)\n* [Download Reference Architecture](/content/dam/snowflake-site/developers/2024/04/Data-Engineering-Pipelines-with-Snowpark-in-Snowflake-Notebooks.pdf)\n* [Read the Blog](https://medium.com/snowflake/building-data-engineering-pipelines-with-snowpark-python-e14f2b525510)\n* [Watch the Demo](https://youtu.be/mpstEt0fU8U?list=TLGGTh02wdk5rsQyMjA5MjAyNQ)\n  \n* Related Tools\n    * [Snowflake Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=snowflake.snowflake-vsc)\n    * [SnowCLI Tool](https://github.com/Snowflake-Labs/snowcli)\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-8263c1748c","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-19b4594c6b",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_last_modi":{"id":"quickstart-last-modified-c1fda03c6f","icon":{"id":"icon","icon":"calendar",":type":"snowflake-site/components/icon","appliedCssClassNames":"snowflake-icon-blue"},"lastModifiedDatePrefix":"Updated","lastModifiedDate":"2026-02-12",":type":"snowflake-site/components/quickstart/quickstart-last-modified","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"},"text":{"id":"text-03f15e3882","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"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-88abb2cc03",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{},":itemsOrder":[]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["contentfragment","flexible_column_cont"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-0c0018b21e",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_table_of_":{"layout":"SIMPLE","id":"container-90ca00e3e4","isDeveloperGuidesPage":false,":type":"snowflake-site/components/quickstart/quickstart-table-of-content/quickstart-table-of-content-container",":items":{"quickstart_table_of_":{"id":"quickstart-table-of-content-373df18bfa","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/data-engineering-pipelines-with-snowpark-python",":type":"snowflake-site/components/quickstart/quickstart-table-of-content","headings":["\u003Ch2\u003EOverview\u003C/h2\u003E","\u003Ch2\u003EQuickstart Setup\u003C/h2\u003E","\u003Ch2\u003ESetup Snowflake\u003C/h2\u003E","\u003Ch2\u003ELoad Raw\u003C/h2\u003E","\u003Ch2\u003ELoad Weather\u003C/h2\u003E","\u003Ch2\u003ECreate POS View\u003C/h2\u003E","\u003Ch2\u003EFahrenheit to Celsius UDF\u003C/h2\u003E","\u003Ch2\u003EOrders Update Sproc\u003C/h2\u003E","\u003Ch2\u003EDaily City Metrics Update Sproc\u003C/h2\u003E","\u003Ch2\u003EOrchestrate Jobs\u003C/h2\u003E","\u003Ch2\u003EProcess Incrementally\u003C/h2\u003E","\u003Ch2\u003EDeploy Via CI/CD\u003C/h2\u003E","\u003Ch2\u003ETeardown\u003C/h2\u003E","\u003Ch2\u003EConclusion\u003C/h2\u003E"]},"quickstart_button":{"id":"quickstart-button-cb3ee15257","cta":{"id":"button-50c33d0a9b","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://app.snowflake.com/templates?template=data_engineering_pipelines_snowpark_python&utm_source=build&utm_medium=templates&utm_campaign=guides&utm_content=nov25"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Open in Snowflake"},"fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/data-engineering-pipelines-with-snowpark-python",":type":"snowflake-site/components/quickstart/quickstart-button","appliedCssClassNames":"snowflake-responsive-component-top-padding-none"}},":itemsOrder":["quickstart_table_of_","quickstart_button"]}},":itemsOrder":["quickstart_table_of_"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"},"markup_editor":{"id":"markup-editor-5d54c65c18","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-1e2b62f666",":type":"snowflake-site/components/modal/modal-container",":items":{},":itemsOrder":[]},"experiencefragment-footer":{"id":"experiencefragment-16ddc55ea9","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"additionalClasses":"sf-footer","layout":"SIMPLE","id":"container-97bb0cb73e",":type":"snowflake-site/components/container",":items":{"container_copy":{"additionalClasses":"sf-footer__inner","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-49b87ef2e9",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-cd8ae19cab","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-fe4bcedebc",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer-grid__inner","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"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-5e573eabc5",":type":"snowflake-site/components/container",":items":{"container_1622723482":{"additionalClasses":"sf-footer__column","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-bc53c736e2",":type":"snowflake-site/components/container",":items":{"container":{"additionalClasses":"sf-footer__newsletter-group","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12","marketo_v2":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-8137f36815",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-e57bd37630","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-de4f12ac3e","marketoForm":{"edit":false,"successUrl":null,"formId":"45871","hidden":null,"script":null,"values":null},"marketoConfigured":true,"formConfigured":true,"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com",":type":"snowflake-site/components/form/marketo-v2"}},":itemsOrder":["text","marketo_v2"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container":{"columnClassNames":{"text_copy":"aem-GridColumn aem-GridColumn--default--12","text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-fe856440c8",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-107a376ad6","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-4a1536ac34","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"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-medium"},"container_copy_copy":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-3999fdb3d0",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-390072e5a1","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"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-d8f1ef9425",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-bf1e8a3166","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"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy_copy_":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-545089e789",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-5a0f1e6acb","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"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container_1622723482","container","container_copy_copy","container_copy","container_copy_copy_"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"},"container_573483281_":{"additionalClasses":"sf-footer__bottom","columnClassNames":{"container_112062425":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-316638c7fc",":type":"snowflake-site/components/container",":items":{"container_112062425":{"columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-2833822d42",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-bbc08cd14b","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-6c9814d705",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer__legal-container","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"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-588e195a14",":type":"snowflake-site/components/container",":items":{"container":{"columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-07aeee61b8",":type":"snowflake-site/components/container",":items":{"image":{"id":"image-bcf27c5397","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,":type":"snowflake-site/components/image"}},":itemsOrder":["image"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"text_copy_copy_16360":{"id":"text-d71710d820","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-a95aa66f59","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"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container_112062425"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"},"markup_editor_copy":{"id":"markup-editor-df5ebf8bee","title":"New css","cssContent":"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}.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"]}},":itemsOrder":["root"],"classNames":"aem-xf"},"markup_editor":{"id":"markup-editor-7a42aa6710","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"],"locale":"en"}
  