{"allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"templateName":"quickstart-page-template","clientlibsAsync":false,"dataLayerClientlibIncluded":true,"dataLayerName":"adobeDataLayer","cssClassNames":"page basicpage summit-page","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"],"lastModifiedDate":1778085603620,"language":"en","title":"Lakehouse Transformations: Build Production Pipelines for your Iceberg Tables","tags":["snowflake-site:taxonomy/product/analytics","snowflake-site:taxonomy/product/data-engineering","snowflake-site:taxonomy/solution-center/certification/quickstart"],"analyticsPageType":"quickstart-page-template","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,"isPasswordProtected":false,"analyticsContentTags":["snowflake-site:taxonomy/product/analytics","snowflake-site:taxonomy/product/data-engineering","snowflake-site:taxonomy/solution-center/certification/quickstart"],"analyticsEnabled":true,"coveoConfig":{"pipeline":"snowflake.com","searchHub":"snowflake.com","organizationId":"snowflakecomputingproduction8neljofn","apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d"},"analyticsDebugMode":false,"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"quickstart-page-template","templateName":"quickstart-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/developers/guides/lakehouse-iceberg-production-pipelines","language":"en","category":"general","pageName":"Lakehouse Transformations: Build Production Pipelines for your Iceberg Tables","contentTags":["snowflake-site:taxonomy/product/analytics","snowflake-site:taxonomy/product/data-engineering","snowflake-site:taxonomy/solution-center/certification/quickstart"]},":mappedPath":"/en/developers/guides/lakehouse-iceberg-production-pipelines/",":type":"snowflake-site/components/structure/page",":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"markup_editor_1950346551":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-banner":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-header":"aem-GridColumn aem-GridColumn--default--12","responsivegrid":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-footer":"aem-GridColumn aem-GridColumn--default--12","modal_container":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"columnCount":12,":items":{"experiencefragment-banner":{"id":"experiencefragment-bbc0b27c5a","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"pushdown_banner_copy":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-07cf9a10e9",":type":"snowflake-site/components/container",":items":{"pushdown_banner_copy":{"id":"pushdown-banner-675e9495a5","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-29d435777c","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":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"mega_header":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-5d881dbe01",":type":"snowflake-site/components/container",":items":{"markup_editor":{"id":"markup-editor-31f1dd9866","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-11c619fe41","appliedCssClassNames":"snowflake-header-container white",":type":"snowflake-site/components/mega-header",":items":{"nav_mega":{"activeItem":"item_1719963657751_c_663444255","id":"tabs-eb1c87a778",":type":"snowflake-site/components/nav/nav-mega",":items":{"item_1719963657751_c_663444255":{"id":"nav-dropdown-menu-836f5e0e35","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-2198eb8a43",":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-8ffda2ab94",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-9f746c7749","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-e8d6d8d052","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-d256632a5e","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-f16bd31e28","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-b991f35eb1","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-b405ed7019","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-a3c0d4b2cd","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-16205dc72c",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_212715":{"id":"nav-item-b77010acde","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-24b0d16cec","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-c2b42ea0c4","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-a522211845","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-12536cc20a","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-8036359ba2",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_660590_1739526127":{"id":"nav-item-3232723259","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-b97de5bcdf","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-deec97924f","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-35c6b31ffe","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-197f305a73","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-c74b1dad16",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-6fa6d4a296","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-c2ac3baff5","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-d4434cd660","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-1f080a84ae","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-9b41951574","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-7af5b90fac","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-6c584a640a",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"navColumnTitle":"INDUSTRIES","numberOfSubColumns":"one-column","minWidth":"280","layout":"SIMPLE","id":"container-bba644916f","appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_361384_2056203141":{"id":"nav-item-2f57b5f8c4","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-51f3fcbdc1","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-512feea668","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-361583ae90","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-cee6ee8b63","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-b55fbaa6f3","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-cb968b9112","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-722bd0c73a","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-b52c615c1e","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-ce4bd92fbc","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"]},"nav_column_copy":{"navColumnTitle":"DEPARTMENTS","numberOfSubColumns":"one-column","minWidth":"160","layout":"SIMPLE","id":"container-7ebb5d4a6a",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-e9d6520931","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-a4b9728cf6","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-73bf9628ad","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-3504248c4b",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_107772":{"id":"nav-item-6797158208","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-7397999d06","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","lazyEnabled":true,"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",":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-678b4e87b1",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-5fbf45e7b0","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-7938a86084","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-6bbd7a6c4f","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","lazyEnabled":true,"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",":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-b3ba05a12a","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-cb18b8e6d6",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-c7e76b9e05",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-64ee69e318","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-0361b071c0",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-aeaf83ba4d","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-5dde8eb70b","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-c9fbe3bb80","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-91280c9c14","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565_903555964":{"id":"nav-item-6adc4b9827","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","lazyEnabled":true,"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",":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-4e010d7d3b","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-4496a48667",":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-e7428dcbbb",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-115d593c92","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-f9e5b6d9c0","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-19dac05854","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-934c287140","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-a0efbc1368",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-5ab47cc6a0","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-880ef89d07","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_1984107859":{"id":"nav-item-85da64a2b8","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1438098918":{"id":"nav-item-2ac6b0482f","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_143809":{"id":"nav-item-7e8dfeec75","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890638":{"id":"nav-item-01acd1e70c","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945":{"id":"nav-item-41c648f7c8","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890":{"id":"nav-item-e5e29f0755","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890_930852828":{"id":"nav-item-ed8610bc85","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","lazyEnabled":true,"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",":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-d60edb9ac0","experience_fragment_1":{"id":"experiencefragment-53920af34e","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":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-db497dd453",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-f99773db9f","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","lazyEnabled":true,"alt":"dev day","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--de231e36-6645-4550-abd9-0f8de758ac66/web-dev-day-26-960x540-1x.png?preferwebp=true&quality=85","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-201e8dcd17","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":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-aca522e2c9",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-ed0b4fa970","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","lazyEnabled":true,"alt":"roi of gen ai and agents","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--0c15edae-1a97-4739-8b16-c7f3941a6d9e/web-roi-of-gen-ai-and-agents-2026-r02-960x540.png?preferwebp=true&quality=85","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-6e36552cb1","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":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-e60563c0ba",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-64b1be9f13","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","lazyEnabled":true,"alt":"alt","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--a320b404-dca1-4477-b033-c79708538657/web-startup-2026-960x540.png?preferwebp=true&quality=85","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-544e2be2d6","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-df52c49b95",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy_copy":{"navColumnTitle":"Build","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-3164f79798",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-d057b0d169","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-44653aa5eb","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-2a9b946639","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","lazyEnabled":true,"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",":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-528e9c6708",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-57316531b7","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-b0cc9d18e7","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-4e61ed8d2d","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","lazyEnabled":true,"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",":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-a7b00c3efa",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-2df940d6c9","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","lazyEnabled":true,"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",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-0047581280","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","lazyEnabled":true,"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",":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-3778bb3bfc","experience_fragment_1":{"id":"experiencefragment-728fc53e1e","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":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-ea91dab65e",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-a7497629a9","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","lazyEnabled":true,"alt":"alt","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--dc7e334a-c38b-4283-b1de-fcf829952eef/nav-promo-first-notebook.jpg?preferwebp=true&quality=85","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-e987ee9aa7","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":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-838720c5c8",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-defac8287f","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","lazyEnabled":true,"alt":"Snowflake Northstar logo","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--14341ced-bc5e-4a29-9762-b7857f6cadfc/nav-promo-northstar.jpg?preferwebp=true&quality=85","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-8fa637ddca","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-b418de610a","languageNavItems":[{"title":"English","path":"/en/developers/guides/lakehouse-iceberg-production-pipelines/","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-d95ec6c7dc","heapButtonClasses":["mega-nav__sign-in"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://app.snowflake.com/"},"linkTargetContentType":"GENERIC","appliedCssClassNames":"snowflake-button-link snowflake-button-black snowflake-button-compact","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Sign in"},"button":{"id":"button-7e6ebf9239","heapButtonClasses":["contact_nav","heap-nav-contact"],"showOutboundIcon":true,"buttonLink":{"valid":true,"url":"/en/contact-sales/"},"linkTargetContentType":"GENERIC","appliedCssClassNames":"snowflake-button-secondary snowflake-button-blue snowflake-button-compact","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"CONTACT SALES"},"button_288358396":{"id":"button-5a8cc781f2","heapButtonClasses":["start_for_free_nav","heap-nav-start-for-free"],"showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://signup.snowflake.com/"},"linkTargetContentType":"GENERIC","appliedCssClassNames":"snowflake-button-primary snowflake-button-blue snowflake-button-compact","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"start for free"}},":itemsOrder":["nav_mega","languagenavigation","button_1177328691","button","button_288358396"]}},":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-46db058dbc","title":" ","cssContent":".snowflake-markdown-table code[class*=language-],.snowflake-markdown-table code[class*=language-],.snowflake-markdown .snowflake-text code[class*=language-],.snowflake-markdown .snowflake-text pre[class*=language-]{background-color:rgba(var(--ui-12-rgb),.5);color:var(--text-01);text-shadow:none;padding:var(--spacing-00);border-radius:var(--spacing-00);font-size:smaller}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"responsivegrid":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"quickstart_hero":"aem-GridColumn aem-GridColumn--default--12","flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"columnCount":12,":items":{"quickstart_hero":{"id":"quickstart-hero-0505d6476e","isDeveloperGuidesPage":false,"quickstartHeroFirstCertifiedTag":{"tagText":"Quickstart","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/solution-center/certification/quickstart","tagIcon":""},"quickstartHeroTitle":{"lines":["Lakehouse Transformations: Build Production Pipelines for your Iceberg Tables"],"type":"heading2",":type":"snowflake-site/components/title-v2"},"quickstartHeroAuthor":"Kamesh Sampath, Gilberto Hernandez","quickstartHeroForkRepoLink":{"id":"button-bc24db62d4","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://github.com/Snowflake-Labs/sfquickstarts/tree/master/site/sfguides/src/lakehouse-iceberg-production-pipelines"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Fork Repo"},"quickstartHeroBreadcrumbs":[{"title":"Lakehouse Transformations: Build Production Pipelines for your Iceberg Tables","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides/lakehouse-iceberg-production-pipelines","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/lakehouse-iceberg-production-pipelines",":type":"snowflake-site/components/quickstart/quickstart-hero"},"flexible_column_cont":{"id":"flexible-column-container-41c2e1d2d8","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-7b7e5df4b2",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"contentfragment":{"id":"contentfragment-abaf67803b","paragraphs":["&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EOverview\u003C/h2\u003E\n","\u003Cp\u003EThis quickstart shows how to build a bronze-to-silver Iceberg pipeline with AWS and Snowflake &mdash; without copying data into a second storage system. You prepare a bronze Iceberg landing zone in AWS (Glue catalog, S3 warehouse, and optional S3 Tables), connect Snowflake to the same catalog using Catalog Linked Databases, build Snowflake-managed Dynamic Iceberg Tables that refresh into silver storage you control, and visualize results using Streamlit in Snowflake. A final chapter queries the same silver tables from DuckDB via Snowflake's Horizon Iceberg REST Catalog.\u003C/p\u003E\n","\u003Cp\u003EThe guide is bronze-first: each layer is verified before the next one starts, so any failure is easy to isolate.\u003C/p\u003E\n","\u003Ch3\u003EWhat You'll Learn\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EHow to prepare a bronze layer in AWS using Glue, S3, Lake Formation, and task-driven automation\u003C/li\u003E\u003Cli\u003EHow Snowflake uses a catalog integration and Catalog Linked Databases to query externally managed Iceberg metadata without ETL duplication\u003C/li\u003E\u003Cli\u003EHow Dynamic Iceberg Tables transform bronze JSON into production-ready silver aggregates while preserving Iceberg format and multi-engine access\u003C/li\u003E\u003Cli\u003EHow to make your silver data AI-ready with a Semantic View for natural-language querying via Snowflake CoWork\u003C/li\u003E\u003Cli\u003EHow to build a live Streamlit in Snowflake dashboard over silver Dynamic Tables\u003C/li\u003E\u003Cli\u003EHow to query Snowflake-managed Iceberg tables from DuckDB via the Horizon Iceberg REST Catalog\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EWhat You'll Build\u003C/h3\u003E\n","\u003Cp\u003EA repeatable lakehouse workflow: bronze Iceberg tables loaded in AWS, consumed and transformed in Snowflake via a Catalog Linked Database and Dynamic Iceberg Tables, surfaced as a Streamlit in Snowflake dashboard, and queried from DuckDB. Every layer is auditable and every file stays in open Iceberg format.\u003C/p\u003E\n","\u003Ch3\u003EPrerequisites\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EAccess to a \u003Ca href=\"https://signup.snowflake.com/?utm_source=snowflake-devrel&amp;utm_medium=developer-guides&amp;utm_cta=developer-guides\"\u003ESnowflake account\u003C/a\u003E\u003C/li\u003E\u003Cli\u003EAccess to an AWS account with permissions for Glue, S3, Lake Formation, and IAM\u003C/li\u003E\u003Cli\u003ELocal workstation with required CLIs &mdash; see \u003Cstrong\u003ELocal Toolchain\u003C/strong\u003E in the next section\u003C/li\u003E\u003Cli\u003EA configured Snowflake CLI connection; verify with \u003Cstrong\u003Esnow connection test\u003C/strong\u003E before any \u003Cstrong\u003Esnow sql\u003C/strong\u003E steps (\u003Ca href=\"https://docs.snowflake.com/developer-guide/snowflake-cli/installation/installation\"\u003ESnowflake CLI installation\u003C/a\u003E)\u003C/li\u003E\u003C/ul\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EUse Case and Architecture\u003C/h2\u003E\n","\u003Ch3\u003EThe Balloon Game\u003C/h3\u003E\n","\u003Cp\u003EThe lab uses a balloon-popping game as the sample workload. A Python generator simulates players popping balloons of different colors, producing a stream of game events. Each event is a JSON object with these fields:\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EField\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EType\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Eplayer\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Estring\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPlayer identifier\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Eballoon_color\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Estring\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EColor of the popped balloon\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Escore\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Einteger\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPoints scored for this pop\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Epage_id\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Estring\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGame page where the pop occurred\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Efavorite_color_bonus\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Eboolean\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWhether a scoring bonus was applied\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Eevent_ts\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Etimestamp\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EEvent time\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Cp\u003EEvents land as raw JSON strings in a single \u003Cstrong\u003Eevent\u003C/strong\u003E column in the bronze Iceberg table \u003Cstrong\u003Eballoon_game_events\u003C/strong\u003E. The silver layer uses \u003Cstrong\u003EPARSE_JSON\u003C/strong\u003E to project and aggregate these fields into five production-ready tables.\u003C/p\u003E\n","\u003Ch3\u003EArchitecture\u003C/h3\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/architecture.png?v=5fdfcbf6\" alt=\"Architecture\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ELab Layers\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ELayer\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETechnology\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWhat it does\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EBronze\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGlue + S3 + PyIceberg\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELoads raw game events as Iceberg in AWS\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECatalog\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESnowflake Catalog Integration\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EConnects Snowflake to Glue Iceberg REST with SigV4 + LF vended credentials\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECLD\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECatalog-Linked Database\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EMirrors Glue namespaces and tables as Snowflake schemas &mdash; no data copy\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESilver\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDynamic Iceberg Tables\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETransforms JSON bronze into 5 aggregation tables; writes Iceberg back to S3\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EAI-Ready\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESnowflake CoWork\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESemantic View over silver DTs enables natural-language querying via Cortex Analyst\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDashboard\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EStreamlit in Snowflake\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELive dashboard over silver DTs; zero local server\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECross-engine\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDuckDB via HIRC\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EQueries silver Iceberg tables through Snowflake's Horizon REST Catalog\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ETools and Prerequisites\u003C/h2\u003E\n","\u003Ch3\u003EClone Repository\u003C/h3\u003E\n","\u003Cp\u003EThis quickstart's narrative lives on Snowflake Quickstarts; all automation lives in the companion repository. Clone it and use the repo root as your working directory for every \u003Cstrong\u003Etask\u003C/strong\u003E, \u003Cstrong\u003Euv run\u003C/strong\u003E, and path reference.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Egit clone https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines.git\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd sfguide-lakehouse-iceberg-production-pipelines\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ERepository: \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines\"\u003ESnowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines\u003C/a\u003E\u003C/p\u003E\n","\u003Ch3\u003EAccounts and Permissions\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EAWS account with a named profile (\u003Cstrong\u003EAWS_PROFILE\u003C/strong\u003E) that can create and update Glue databases, manage IAM roles, and access S3\u003C/li\u003E\u003Cli\u003ESnowflake account with \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E or a role with \u003Cstrong\u003ECREATE INTEGRATION\u003C/strong\u003E, \u003Cstrong\u003ECREATE DATABASE\u003C/strong\u003E, and \u003Cstrong\u003ECREATE STREAMLIT\u003C/strong\u003E privileges\u003C/li\u003E\u003Cli\u003ESnowflake CLI connection configured for that account &mdash; \u003Cstrong\u003Esnow connection list\u003C/strong\u003E and \u003Cstrong\u003Esnow connection test\u003C/strong\u003E both succeed\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003ERequired Tools\u003C/h3\u003E\n","\u003Cp\u003EThis repo targets Python 3.12+. \u003Cstrong\u003Euv\u003C/strong\u003E manages the interpreter and all dependencies.\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETool\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ERole\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EmacOS\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ELinux (Debian/Ubuntu)\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWindows\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EGit\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EClone the companion repository\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Ebrew install git\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Esudo apt install git\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://git-scm.com/download/win\"\u003EGit for Windows\u003C/a\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Euv\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPython deps and \u003Cem\u003Euv run\u003C/em\u003E entrypoints\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Ebrew install uv\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.astral.sh/uv/getting-started/installation/\"\u003EAstral installer\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.astral.sh/uv/getting-started/installation/\"\u003EPowerShell installer\u003C/a\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ETask\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Etask bronze:*\u003C/em\u003E, \u003Cem\u003Etask check-tools\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Ebrew install go-task\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://taskfile.dev/installation/\"\u003EInstall script\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Escoop install task\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EAWS CLI v2\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGlue, S3, STS; S3 Tables needs v2.34+\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Ebrew install awscli\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html\"\u003EAWS bundled installer\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html\"\u003EAWS MSI\u003C/a\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESnowflake CLI\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESnowflake steps; also available via \u003Cem\u003Euv sync\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/developer-guide/snowflake-cli/installation/installation\"\u003ESnowflake CLI docs\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/developer-guide/snowflake-cli/installation/installation\"\u003ESnowflake CLI docs\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/developer-guide/snowflake-cli/installation/installation\"\u003ESnowflake CLI docs\u003C/a\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Eenvsubst\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERenders IAM policy templates (gettext package)\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Ebrew install gettext\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Esudo apt install gettext-base\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWSL2 recommended\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ejq\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EJSON checks at the shell\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Ebrew install jq\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Esudo apt install jq\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Escoop install jq\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Cp\u003EAfter \u003Cstrong\u003Euv sync\u003C/strong\u003E, use \u003Cstrong\u003Euv run snow &hellip;\u003C/strong\u003E from the repo root, or add \u003Cstrong\u003E.venv/bin\u003C/strong\u003E (macOS/Linux) or \u003Cstrong\u003E.venv\\Scripts\u003C/strong\u003E (Windows) to your PATH.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWindows note:\u003C/strong\u003E If \u003Cstrong\u003Etask check-tools\u003C/strong\u003E fails only on \u003Cstrong\u003Eenvsubst\u003C/strong\u003E, use WSL2 or run \u003Cstrong\u003Euv run bronze-cli render-iam\u003C/strong\u003E (the Python path) instead.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ERecommended Tools\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETool\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWhy\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EmacOS\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ELinux (Debian/Ubuntu)\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWindows\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edirenv\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EAuto-loads \u003Cem\u003E.env\u003C/em\u003E when you \u003Cem\u003Ecd\u003C/em\u003E into the repo\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Ebrew install direnv\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Esudo apt install direnv\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWSL2\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ecurl\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EScripts and health checks\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Epre-installed\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Epre-installed\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://curl.se/download.html\"\u003Ecurl.se\u003C/a\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Eopenssl\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETLS and common crypto one-liners\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Epre-installed\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Epre-installed\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://wiki.openssl.org/index.php/Binaries\"\u003EOpenSSL binaries\u003C/a\u003E\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Ch3\u003EVerify Installation\u003C/h3\u003E\n","\u003Cp\u003ERun the one-time bootstrap to install Python deps and create \u003Cstrong\u003E.env\u003C/strong\u003E from the template (if it does not exist yet):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask setup\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EConfigure your AWS profile and run the prerequisite check. The check will report errors for any missing required binaries, provide warnings for recommended (but not required) tools, and use \u003Cstrong\u003Eaws sts get-caller-identity\u003C/strong\u003E to validate your AWS session. Address any missing tools or credential issues, then rerun the check until you see \u003Cstrong\u003EAll required tools are available.\u003C/strong\u003E\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Eexport AWS_PROFILE=your-profile\ntask check-tools\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EEnvironment Inputs\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003Etask setup\u003C/strong\u003E copies \u003Cstrong\u003E.env.example\u003C/strong\u003E to \u003Cstrong\u003E.env\u003C/strong\u003E on first run. Edit \u003Cstrong\u003E.env\u003C/strong\u003E and fill in your values.\u003C/p\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003E.env.example\u003C/strong\u003E is organized by lab phase. Key sections and variables:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# =============================================================\n# Phase 1 &mdash; AWS (bronze landing)\n# =============================================================\nAWS_PROFILE=                    # AWS named profile\nAWS_REGION=                     # e.g. us-west-2\n\n# Shared workshop: set this for per-participant bucket/database name derivation.\n# Leave BRONZE_BUCKET_NAME empty when LAB_USERNAME is set.\n# LAB_USERNAME=\n\n# =============================================================\n# Phase 1 &mdash; Iceberg warehouse (Glue + PyIceberg)\n# =============================================================\nBRONZE_BUCKET_NAME=             # Globally unique S3 bucket name\n# GLUE_DATABASE=balloon_pops    # Derived from LAB_USERNAME when unset\n# BRONZE_LOAD_DURATION_MINUTES=5\n\n# =============================================================\n# Phase 1 &mdash; Amazon S3 Tables (optional, AWS CLI 2.34+)\n# =============================================================\nBRONZE_S3TABLES_BUCKET_NAME=\nS3TABLES_NAMESPACE=balloon_pops\n\n# =============================================================\n# Phase 2 &mdash; Snowflake CLI / SQL\n# =============================================================\n# SNOWFLAKE_DEFAULT_CONNECTION_NAME=devrel-ent\n# SNOWFLAKE_ROLE=ACCOUNTADMIN\n# SNOWFLAKE_WAREHOUSE=COMPUTE_WH\n\n# =============================================================\n# Phase 2 &mdash; Dynamic Iceberg Tables (task dt:generate-sql)\n# =============================================================\n# SNOWFLAKE_SILVER_DATABASE=balloon_silver\n# SNOWFLAKE_SILVER_SCHEMA=silver\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EKey variables:\u003C/strong\u003E\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EVariable\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EPhase\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDefault\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ENotes\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EAWS_PROFILE\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E1\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Erequired\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EAWS named profile for all bronze tasks\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EAWS_REGION\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E1\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Erequired\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EKeeps all API calls in one region\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ELAB_USERNAME\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E1\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Enone\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWorkshop shared accounts &mdash; drives bucket/database name derivation\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EBRONZE_BUCKET_NAME\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E1\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Ederived\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ES3 warehouse bucket; \u003Cem\u003Eiceberg/\u003C/em\u003E becomes the Glue warehouse URI\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESNOWFLAKE_DEFAULT_CONNECTION_NAME\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Esnow default\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EOverride when using a non-default \u003Cem\u003Esnow\u003C/em\u003E connection\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESNOWFLAKE_ROLE\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EACCOUNTADMIN\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERole for catalog integration and CLD commands\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESNOWFLAKE_SILVER_DATABASE\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Eballoon_silver\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ENative Snowflake database for DT objects\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESNOWFLAKE_SILVER_SCHEMA\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Esilver\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESchema for silver Dynamic Iceberg Tables\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESNOWFLAKE_APPS_SCHEMA\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Eapps\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESchema for Streamlit app deployment (SiS chapter)\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EBronze Landing Zone\u003C/h2\u003E\n","\u003Cp\u003EThis is the first hands-on chapter. All downstream Snowflake steps assume the bronze Iceberg tables exist in AWS Glue and that the bronze ARNs and Glue metadata are ready.\u003C/p\u003E\n","\u003Ch3\u003ESet Up and Load\u003C/h3\u003E\n","\u003Cp\u003EPreview any setup step without making changes (optional but recommended first):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:render-iam-dry-run\ntask bronze:glue-setup-dry-run\ntask bronze:s3tables-setup-dry-run\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ERender the IAM policy template (optional &mdash; run first if attaching a new IAM role):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:render-iam\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ECreate the Glue database and register the S3 warehouse:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:glue-setup\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EProvision the S3 Tables control plane (optional &mdash; requires AWS CLI 2.34+):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:s3tables-setup\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ELoad sample balloon game events into the Glue Iceberg table:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:load\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EOr run all three setup steps and load in one shot:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:all\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EWhat Gets Created\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EGlue database\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETable\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ESchema\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EGLUE_DATABASE\u003C/strong\u003E (e.g. \u003Cem\u003Eksampath_balloon_pops\u003C/em\u003E)\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Eballoon_game_events\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Eevent\u003C/strong\u003E &mdash; STRING, one JSON object per row\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Cp\u003EEach JSON object contains: \u003Cstrong\u003Eplayer\u003C/strong\u003E, \u003Cstrong\u003Eballoon_color\u003C/strong\u003E, \u003Cstrong\u003Escore\u003C/strong\u003E, \u003Cstrong\u003Epage_id\u003C/strong\u003E, \u003Cstrong\u003Efavorite_color_bonus\u003C/strong\u003E, \u003Cstrong\u003Eevent_ts\u003C/strong\u003E. Snowflake Dynamic Iceberg Tables use \u003Cstrong\u003EPARSE_JSON\u003C/strong\u003E and variant paths to project these fields into typed columns.\u003C/p\u003E\n","\u003Cp\u003EPrint a copy-paste sheet of ARNs and exports needed for Snowflake catalog integration SQL:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:snowflake-summary\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003ELake Formation Setup\u003C/h3\u003E\n","\u003Cp\u003EAfter \u003Cstrong\u003Etask bronze:load\u003C/strong\u003E and after completing step 1 of the Snowflake CLD chapter (\u003Cstrong\u003Etask snowflake:create-glue-catalog-read-role\u003C/strong\u003E), configure Lake Formation for vended credentials.\u003C/p\u003E\n","\u003Cp\u003EPreview the Lake Formation setup without any AWS writes:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:lakeformation-setup-dry-run\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EApply Lake Formation grants:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:lakeformation-setup\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis step registers \u003Cstrong\u003EBRONZE_BUCKET_NAME\u003C/strong\u003E with Lake Formation using a dedicated data-access IAM role (\u003Cstrong\u003EHybridAccessEnabled=false\u003C/strong\u003E, \u003Cstrong\u003EWithFederation=false\u003C/strong\u003E), clears the default Glue IAM-only table permissions on \u003Cstrong\u003EGLUE_DATABASE\u003C/strong\u003E, and grants \u003Cstrong\u003ESELECT\u003C/strong\u003E and \u003Cstrong\u003EDESCRIBE\u003C/strong\u003E to your Snowflake SIGV4 role.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EKeep the SIGV4 and LF data-access roles separate.\u003C/strong\u003E Using the same role causes credential vending errors &mdash; see the Troubleshooting chapter for error code \u003Cstrong\u003E094120\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch3\u003EVerify in AWS Console\u003C/h3\u003E\n","\u003Cp\u003EUse the same AWS account and \u003Cstrong\u003EAWS_REGION\u003C/strong\u003E as your CLI profile.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EGlue Data Catalog:\u003C/strong\u003E\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EOpen \u003Cstrong\u003EGlue\u003C/strong\u003E &rarr; \u003Cstrong\u003EData catalog\u003C/strong\u003E &rarr; \u003Cstrong\u003EDatabases\u003C/strong\u003E and confirm \u003Cstrong\u003EGLUE_DATABASE\u003C/strong\u003E exists.\u003C/li\u003E\u003Cli\u003EOpen that database &rarr; \u003Cstrong\u003ETables\u003C/strong\u003E &rarr; confirm \u003Cstrong\u003Eballoon_game_events\u003C/strong\u003E is listed.\u003C/li\u003E\u003Cli\u003EOpen \u003Cstrong\u003Eballoon_game_events\u003C/strong\u003E and confirm \u003Cstrong\u003EApache Iceberg\u003C/strong\u003E as the table format.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/bronze-glue-databases.png?v=5fdfcbf6\" alt=\"Glue Data Catalog &mdash; databases including GLUE_DATABASE\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/bronze-glue-database-detail.png?v=5fdfcbf6\" alt=\"Glue &mdash; database details showing Location URI\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/bronze-glue-tables-list.png?v=5fdfcbf6\" alt=\"Glue &mdash; tables list showing balloon_game_events\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/bronze-glue-table-iceberg-detail.png?v=5fdfcbf6\" alt=\"Glue &mdash; Iceberg table detail for balloon_game_events\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ES3 Warehouse:\u003C/strong\u003E\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EOpen \u003Cstrong\u003ES3\u003C/strong\u003E &rarr; \u003Cstrong\u003EBuckets\u003C/strong\u003E &rarr; \u003Cstrong\u003EBRONZE_BUCKET_NAME\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003EOpen the \u003Cstrong\u003Eiceberg/\u003C/strong\u003E prefix &mdash; expect \u003Cstrong\u003Emetadata/\u003C/strong\u003E and \u003Cstrong\u003Edata/\u003C/strong\u003E style keys after load.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003ES3 Tables (optional):\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EOpen \u003Cstrong\u003ES3 Tables\u003C/strong\u003E &rarr; \u003Cstrong\u003ETable buckets\u003C/strong\u003E and confirm \u003Cstrong\u003EBRONZE_S3TABLES_BUCKET_NAME\u003C/strong\u003E appears.\u003C/p\u003E\n","\u003Ch3\u003EOptional: Query in Athena\u003C/h3\u003E\n","\u003Cp\u003EUse data source \u003Cstrong\u003EAwsDataCatalog\u003C/strong\u003E, database \u003Cstrong\u003EGLUE_DATABASE\u003C/strong\u003E, and table \u003Cstrong\u003Eballoon_game_events\u003C/strong\u003E. Do \u003Cstrong\u003Enot\u003C/strong\u003E select the \u003Cstrong\u003Es3tables/&lt;table-bucket&gt;\u003C/strong\u003E federated catalog entry &mdash; that path is an empty shell until a separate writer commits metadata.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESnowflake Catalog Linked Database (CLD)\u003C/h2\u003E\n","\u003Cp\u003EThis chapter creates the Glue Iceberg REST catalog integration, tightens IAM trust, creates the catalog linked database (CLD), and runs discovery and read queries against \u003Cstrong\u003Eballoon_game_events\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBefore starting:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EBronze tables are loaded; \u003Cstrong\u003E.aws-config/glue-database.json\u003C/strong\u003E was written by \u003Cstrong\u003Etask bronze:glue-setup\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003Esnow connection test\u003C/strong\u003E succeeds\u003C/li\u003E\u003Cli\u003ELake Formation is configured for \u003Cstrong\u003EVENDED_CREDENTIALS\u003C/strong\u003E (see \u003Cstrong\u003ELake Formation Setup\u003C/strong\u003E in the Bronze chapter)\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EEasy Path &mdash; Interactive Notebook\u003C/h3\u003E\n","\u003Cp\u003EOpen \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/cld_lab_guide.ipynb\"\u003Ecld_lab_guide.ipynb\u003C/a\u003E in Snowflake Notebooks for an interactive walkthrough. The notebook uses:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E\u003Ccode\u003EENABLED = FALSE\u003C/code\u003E\u003C/strong\u003E on the catalog integration to break the IAM chicken-egg dependency &mdash; trust policy values are generated without connecting to Glue\u003C/li\u003E\u003Cli\u003EA companion \u003Cstrong\u003ECloudFormation template\u003C/strong\u003E (\u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/cfn-snowflake-cld.yaml\"\u003Ecfn-snowflake-cld.yaml\u003C/a\u003E) that deploys all IAM roles, Lake Formation registration, and permissions in a single stack\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESnowflake CoCo prompts\u003C/strong\u003E embedded in each step &mdash; use Cmd+K or the chat sidebar to generate SQL and CLI commands from natural language\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E\u003Ccode\u003ESYSTEM$VERIFY_CATALOG_INTEGRATION\u003C/code\u003E\u003C/strong\u003E to validate connectivity before creating the CLD\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EFollow the \u003Cstrong\u003EDetailed Path\u003C/strong\u003E below for step-by-step shell commands.\u003C/p\u003E\n","\u003Ch3\u003EDetailed Path\u003C/h3\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERole requirement:\u003C/strong\u003E The commands in this chapter require \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E or a role with \u003Cstrong\u003ECREATE INTEGRATION\u003C/strong\u003E, \u003Cstrong\u003ECREATE DATABASE\u003C/strong\u003E, and \u003Cstrong\u003EGRANT\u003C/strong\u003E privileges. The lab defaults to \u003Cstrong\u003ESNOWFLAKE_ROLE\u003C/strong\u003E = \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E set in \u003Cstrong\u003E.env\u003C/strong\u003E. Confirm this before running any \u003Cstrong\u003Esnow sql\u003C/strong\u003E commands.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003ECreate IAM Role\u003C/h4\u003E\n","\u003Cp\u003ECreate the Snowflake SIGV4 IAM role that Snowflake uses to sign Glue REST requests:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:create-glue-catalog-read-role\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis writes the IAM role ARN to \u003Cstrong\u003E.aws-config/snowflake-glue-catalog-iam-role-arn.txt\u003C/strong\u003E. All subsequent lab tools read it automatically &mdash; no env var override needed.\u003C/p\u003E\n","\u003Cp\u003EAfter this step, return to the Bronze chapter and run \u003Cstrong\u003Etask bronze:lakeformation-setup\u003C/strong\u003E to grant the SIGV4 role access via Lake Formation before proceeding.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENotebook path (CloudFormation):\u003C/strong\u003E The interactive notebook uses a single CloudFormation template instead of individual \u003Cstrong\u003Etask\u003C/strong\u003E commands for IAM and Lake Formation setup. It creates the catalog integration as \u003Cstrong\u003EENABLED = FALSE\u003C/strong\u003E first, extracts trust values from \u003Cstrong\u003EDESC INTEGRATION\u003C/strong\u003E, and passes them as stack parameters &mdash; eliminating the manual trust-render-apply cycle. See the notebook for details.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EGenerate SQL\u003C/h4\u003E\n","\u003Cp\u003EGenerate runnable SQL from your \u003Cstrong\u003E.aws-config/\u003C/strong\u003E artifacts:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:generate-lab-sql\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis writes two files to \u003Cstrong\u003Esnowflake/lab/generated/\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E01_catalog_integration.generated.sql\u003C/strong\u003E &mdash; CREATE CATALOG INTEGRATION\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E02_cld_verify.generated.sql\u003C/strong\u003E &mdash; CREATE DATABASE + SHOW + SELECT\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003ETo preview the SQL without writing files:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:generate-lab-sql-stdout\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003ECreate Catalog Integration\u003C/h4\u003E\n","\u003Cp\u003EApply the generated catalog integration SQL:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow sql --filename snowflake/lab/generated/01_catalog_integration.generated.sql\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThe generated SQL creates \u003Cstrong\u003Eglue_rest_catalog_int\u003C/strong\u003E (default name) with these settings:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ECATALOG_SOURCE = ICEBERG_REST\u003C/strong\u003E, \u003Cstrong\u003ETABLE_FORMAT = ICEBERG\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ECATALOG_URI\u003C/strong\u003E = https://glue.&lt;region&gt;.amazonaws.com/iceberg\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ECATALOG_API_TYPE = AWS_GLUE\u003C/strong\u003E, \u003Cstrong\u003EACCESS_DELEGATION_MODE = VENDED_CREDENTIALS\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ECATALOG_NAME\u003C/strong\u003E = your 12-digit AWS account ID (Glue Data Catalog default)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ECATALOG_NAMESPACE\u003C/strong\u003E = \u003Cstrong\u003EGLUE_DATABASE\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESIGV4_IAM_ROLE\u003C/strong\u003E = ARN from \u003Cstrong\u003E.aws-config/snowflake-glue-catalog-iam-role-arn.txt\u003C/strong\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETip: Breaking the chicken-egg dependency.\u003C/strong\u003E The notebook creates the catalog integration with \u003Cstrong\u003EENABLED = FALSE\u003C/strong\u003E. This generates \u003Cstrong\u003EAPI_AWS_IAM_USER_ARN\u003C/strong\u003E and \u003Cstrong\u003EAPI_AWS_EXTERNAL_ID\u003C/strong\u003E immediately without requiring the IAM role to exist yet. After deploying the CloudFormation stack with the real trust values, the integration is enabled via \u003Cstrong\u003EALTER CATALOG INTEGRATION &hellip; SET ENABLED = TRUE\u003C/strong\u003E. This avoids a two-pass trust policy update.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EDescribe and Capture Trust Fields\u003C/h4\u003E\n","\u003Cp\u003EPrint catalog integration properties including the Snowflake-generated trust fields:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:describe-catalog-integration\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EOr run the SQL directly:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EDESC CATALOG INTEGRATION glue_rest_catalog_int;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ENote \u003Cstrong\u003EAPI_AWS_IAM_USER_ARN\u003C/strong\u003E and \u003Cstrong\u003EAPI_AWS_EXTERNAL_ID\u003C/strong\u003E from the output &mdash; these are needed to tighten the trust policy on the SIGV4 IAM role.\u003C/p\u003E\n","\u003Ch4\u003EApply IAM Trust\u003C/h4\u003E\n","\u003Cp\u003ERender the trust document using the \u003Cstrong\u003EDESC\u003C/strong\u003E output:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:render-glue-catalog-trust\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EApply the rendered trust policy to the SIGV4 IAM role:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:apply-glue-catalog-trust-from-rendered\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis updates the IAM role's trust policy to scope access to Snowflake's specific IAM user ARN and external ID. Alternatively, paste the rendered JSON from \u003Cstrong\u003E.aws-config/snowflake-glue-catalog-trust-policy.rendered.json\u003C/strong\u003E directly in the IAM console under \u003Cstrong\u003ETrust relationships\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003EVerify Catalog Integration\u003C/h4\u003E\n","\u003Cp\u003EAfter applying the trust policy, verify the integration can connect to Glue:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('glue_rest_catalog_int');\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EExpect \u003Ccode\u003E&quot;success&quot;: true\u003C/code\u003E in the JSON response. If it fails, check that the trust policy values match \u003Cstrong\u003EDESC INTEGRATION\u003C/strong\u003E output exactly and that IAM propagation is complete (up to 30 seconds).\u003C/p\u003E\n","\u003Ch4\u003ECreate Catalog-Linked Database\u003C/h4\u003E\n","\u003Cp\u003EApply the generated CLD and verify script:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow sql --filename snowflake/lab/generated/02_cld_verify.generated.sql\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis creates \u003Cstrong\u003Eballoon_game_events\u003C/strong\u003E as a Catalog-Linked Database and runs initial discovery. To create it manually instead:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE OR REPLACE DATABASE balloon_game_events\n  COMMENT = 'CLD: Glue bronze Iceberg'\n  LINKED_CATALOG = (\n    CATALOG = 'glue_rest_catalog_int'\n  );\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote:\u003C/strong\u003E Any change to Lake Formation permissions or IAM trust after a link failure requires re-creating the CLD. After fixing the LF/IAM settings, re-run \u003Cstrong\u003ECREATE OR REPLACE DATABASE &hellip; LINKED_CATALOG = (&hellip;)\u003C/strong\u003E and re-apply \u003Cstrong\u003EGRANT USAGE ON INTEGRATION glue_rest_catalog_int TO ROLE &lt;your_role&gt;\u003C/strong\u003E. See \u003Cem\u003EPrivileges Lost After CLD Recreate\u003C/em\u003E in Troubleshooting.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EOptional status checks:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT SYSTEM$CATALOG_LINK_STATUS('balloon_game_events');\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT SYSTEM$GET_CATALOG_LINKED_DATABASE_CONFIG('balloon_game_events');\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003EDiscover and Query\u003C/h4\u003E\n","\u003Cp\u003EList remote namespaces discovered from Glue:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESHOW SCHEMAS IN DATABASE balloon_game_events;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EList Iceberg tables in the discovered namespace:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Replace &lt;remote_schema&gt; with your GLUE_DATABASE name in lowercase\nSHOW ICEBERG TABLES IN SCHEMA balloon_game_events.&quot;&lt;remote_schema&gt;&quot;;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ERead raw events and project fields using \u003Cstrong\u003EPARSE_JSON\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT\n  PARSE_JSON(event):player::STRING         AS player,\n  PARSE_JSON(event):balloon_color::STRING  AS balloon_color,\n  PARSE_JSON(event):score::INTEGER         AS score,\n  PARSE_JSON(event):event_ts::TIMESTAMP_TZ AS event_ts\nFROM balloon_game_events.&quot;&lt;remote_schema&gt;&quot;.&quot;balloon_game_events&quot;\nLIMIT 10;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003ELake Formation Console Checks\u003C/h4\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhen to check:\u003C/strong\u003E Run these checks only if \u003Cstrong\u003ESYSTEM$CATALOG_LINK_STATUS('balloon_game_events')\u003C/strong\u003E reports failures. A healthy link returns:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-json\"\u003E{&quot;failureDetails&quot;:[],&quot;executionState&quot;:&quot;RUNNING&quot;,&quot;lastLinkAttemptStartTime&quot;:&quot;...&quot;}\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EIf \u003Cstrong\u003Etask bronze:lakeformation-setup\u003C/strong\u003E ran successfully, skip this. Otherwise verify these four settings manually.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENotebook users:\u003C/strong\u003E The interactive notebook includes the same four checks with annotated screenshots in \u003Cstrong\u003EStep 2c: Verify Lake Formation Settings\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003E1. Database mode:\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EOpen \u003Cstrong\u003ELake Formation\u003C/strong\u003E &rarr; \u003Cstrong\u003EData catalog\u003C/strong\u003E &rarr; \u003Cstrong\u003EDatabases\u003C/strong\u003E &rarr; open \u003Cstrong\u003EGLUE_DATABASE\u003C/strong\u003E &rarr; \u003Cstrong\u003EEdit\u003C/strong\u003E. Confirm \u003Cstrong\u003EUse only IAM access control for new tables\u003C/strong\u003E is unchecked.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/aws_lf_database_settings.png?v=5fdfcbf6\" alt=\"Lake Formation &mdash; edit database, Lake Formation mode for new tables\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003E2. Data lake location:\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EOpen \u003Cstrong\u003EPermissions\u003C/strong\u003E &rarr; \u003Cstrong\u003EData lake locations\u003C/strong\u003E. Confirm \u003Cstrong\u003Es3://&lt;BRONZE_BUCKET_NAME&gt;/iceberg/\u003C/strong\u003E is registered with \u003Cstrong\u003EHybridAccessEnabled=false\u003C/strong\u003E and \u003Cstrong\u003EWithFederation=false\u003C/strong\u003E using a dedicated LF data-access role that is \u003Cstrong\u003Edifferent\u003C/strong\u003E from the SIGV4 role.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/aws_lf_data_lake_settings.png?v=5fdfcbf6\" alt=\"Lake Formation &mdash; data lake storage settings\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003E3. Data permissions:\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EOpen \u003Cstrong\u003EPermissions\u003C/strong\u003E &rarr; \u003Cstrong\u003EData permissions\u003C/strong\u003E. Confirm the SIGV4 role has \u003Cstrong\u003EDESCRIBE\u003C/strong\u003E on the database and \u003Cstrong\u003ESELECT\u003C/strong\u003E, \u003Cstrong\u003EDESCRIBE\u003C/strong\u003E on the table wildcard.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/aws_lf_data_permissions.png?v=5fdfcbf6\" alt=\"Lake Formation &mdash; data permissions for the Snowflake catalog role\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003E4. Application integration settings:\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EOpen \u003Cstrong\u003ELake Formation\u003C/strong\u003E &rarr; \u003Cstrong\u003EAdministration\u003C/strong\u003E &rarr; \u003Cstrong\u003EApplication integration settings\u003C/strong\u003E. Confirm \u003Cstrong\u003EAllow external engines to access data in Amazon S3 locations with full table access\u003C/strong\u003E is enabled. This setting is mandatory for Snowflake's vended-credentials flow &mdash; without it, Lake Formation will not issue temporary credentials to the SIGV4 role.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/aws-lf-app-int-settings.png?v=5fdfcbf6\" alt=\"Lake Formation &mdash; application integration settings\"\u003E\u003C/p\u003E\n","\u003Ch4\u003EFull Reference Sequence\u003C/h4\u003E\n","\u003Cp\u003EEnd-to-end Snowflake command sequence (assumes tools verified and bronze loaded):\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ECommand\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWhat it does\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Etask bronze:snowflake-summary\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint bucket/DB/ARNs needed for Snowflake catalog SQL\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Etask snowflake:create-glue-catalog-read-role\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate SIGV4 IAM role; write ARN to \u003Cstrong\u003E.aws-config/\u003C/strong\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003E(return to Bronze)\u003C/em\u003E \u003Cstrong\u003Etask bronze:lakeformation-setup\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGrant SIGV4 role access via Lake Formation\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Etask snowflake:generate-lab-sql\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGenerate \u003Cstrong\u003E01_catalog_integration\u003C/strong\u003E and \u003Cstrong\u003E02_cld_verify\u003C/strong\u003E SQL\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnow sql --filename snowflake/lab/generated/01_catalog_integration.generated.sql\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate the catalog integration in Snowflake\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Etask snowflake:describe-catalog-integration\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint trust fields (API_AWS_IAM_USER_ARN + external ID)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Etask snowflake:render-glue-catalog-trust\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERender trust JSON using those fields\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Etask snowflake:apply-glue-catalog-trust-from-rendered\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EApply rendered trust to SIGV4 IAM role\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('glue_rest_catalog_int')\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EVerify integration connects to Glue (expect \u003Ccode\u003E&quot;success&quot;: true\u003C/code\u003E)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnow sql --filename snowflake/lab/generated/02_cld_verify.generated.sql\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate CLD and run discovery queries\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENotebook alternative (ENABLED=FALSE flow):\u003C/strong\u003E\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EStep\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ECommand\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWhat it does\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2a\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ECREATE CATALOG INTEGRATION &hellip; ENABLED = FALSE\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGenerate trust values without connecting to Glue\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2b\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EDESC INTEGRATION\u003C/strong\u003E &rarr; \u003Cstrong\u003Eaws cloudformation deploy\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EExtract trust values and deploy IAM + LF via CFN\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2c\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EVerify Lake Formation settings in AWS Console\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EConfirm CFN deployed correctly\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2d\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EALTER CATALOG INTEGRATION &hellip; SET ENABLED = TRUE\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EEnable and verify with \u003Cstrong\u003ESYSTEM$VERIFY_CATALOG_INTEGRATION\u003C/strong\u003E\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EDynamic Iceberg Tables\u003C/h2\u003E\n","\u003Cp\u003EWith bronze readable through the CLD, add \u003Ca href=\"https://docs.snowflake.com/en/user-guide/dynamic-tables-create-iceberg\"\u003EDynamic Iceberg Tables\u003C/a\u003E that write silver Iceberg data. It uses \u003Ca href=\"https://docs.snowflake.com/en/user-guide/tables-iceberg-internal-storage\"\u003ESnowflake Managed Storage\u003C/a\u003E for Iceberg. The silver pipeline frequency is controlled on a declared \u003Cstrong\u003ETARGET_LAG\u003C/strong\u003E. Five aggregation tables refresh automatically and remain readable by any Iceberg-compatible engine.\u003C/p\u003E\n","\u003Ch3\u003EFive Silver Tables\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETable\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWhat it aggregates\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt_player_leaderboard\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPer-player total score, bonus pops, last event\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt_balloon_color_stats\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPer-player, per-color breakdown (pops, points, bonuses)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt_realtime_scores\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E15-second windowed scores per player\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt_balloon_colored_pops\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E15-second windows by player and balloon color\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt_color_performance_trends\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EAverage score per pop by color over 15-second windows\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Ch3\u003EEasy Path &mdash; Interactive Notebook\u003C/h3\u003E\n","\u003Cp\u003EOpen \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/dt_lab_guide.ipynb\"\u003Edt_lab_guide.ipynb\u003C/a\u003E in Snowflake Notebooks for an interactive walkthrough. The notebook builds on the CLD Lab Guide and includes:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ECLD recap\u003C/strong\u003E &mdash; summarizes what was built in the previous chapter before diving into silver\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E&quot;Why Dynamic Iceberg Tables?&quot;\u003C/strong\u003E &mdash; callout explaining DIT vs regular Dynamic Tables, TARGET_LAG, and Iceberg interoperability\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESnowflake CoCo prompts\u003C/strong\u003E &mdash; generate the first DT SQL via Cmd+K, check refresh status via chat, and explore silver data with intent-driven prompts\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETeachable moment\u003C/strong\u003E &mdash; the Snowflake CoCo prompt for \u003Ccode\u003Edt_player_leaderboard\u003C/code\u003E may generate \u003Ccode\u003ETIMESTAMP_TZ\u003C/code\u003E, which Iceberg doesn't support &mdash; workshoppers debug and fix it live\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E&quot;What Just Happened?&quot;\u003C/strong\u003E &mdash; architecture summary of the bronze&rarr;silver pipeline\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ECleanup\u003C/strong\u003E &mdash; single \u003Ccode\u003EDROP DATABASE\u003C/code\u003E to tear down all DTs\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EUse the \u003Cstrong\u003EDetailed Path\u003C/strong\u003E below for step-by-step shell commands.\u003C/p\u003E\n","\u003Ch3\u003EDetailed Path\u003C/h3\u003E\n","\u003Ch4\u003EConfigure Environment\u003C/h4\u003E\n","\u003Cp\u003ESet these variables in \u003Cstrong\u003E.env\u003C/strong\u003E before generating SQL:\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EVariable\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDefault\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ENotes\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESNOWFLAKE_SILVER_DATABASE\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Eballoon_silver\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ENative Snowflake database for DT objects\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESNOWFLAKE_SILVER_SCHEMA\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Esilver\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESchema for all silver DTs\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESNOWFLAKE_WAREHOUSE\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003ECOMPUTE_WH\u003C/em\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWarehouse for DT refresh compute\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Cp\u003EPrint current environment hints:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:print-env-hints\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EDynamic Iceberg Tables use Snowflake Managed Storage &mdash; no external volume setup is required.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIceberg type limitation:\u003C/strong\u003E Iceberg tables do not support \u003Ccode\u003ETIMESTAMP_TZ\u003C/code\u003E. Use \u003Ccode\u003ETIMESTAMP_LTZ\u003C/code\u003E (maps to Iceberg \u003Ccode\u003Etimestamptz\u003C/code\u003E) or \u003Ccode\u003ETIMESTAMP_NTZ\u003C/code\u003E (maps to Iceberg \u003Ccode\u003Etimestamp\u003C/code\u003E). If generated SQL uses \u003Ccode\u003ETIMESTAMP_TZ\u003C/code\u003E, change it to \u003Ccode\u003ETIMESTAMP_LTZ(6)\u003C/code\u003E or \u003Ccode\u003ETIMESTAMP_NTZ\u003C/code\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EGenerate and Apply DT SQL\u003C/h4\u003E\n","\u003Cp\u003EGenerate the silver DT SQL from your env and \u003Cstrong\u003E.aws-config/\u003C/strong\u003E artifacts:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask dt:generate-sql\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis writes \u003Cstrong\u003Esnowflake/lab/generated/03_dt_pipelines.generated.sql\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003EApply the generated SQL:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow sql --filename snowflake/lab/generated/03_dt_pipelines.generated.sql\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThe unedited scaffold for manual editing lives at \u003Cstrong\u003Esnowflake/lab/03_dt_pipelines.sql\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003EVerify\u003C/h4\u003E\n","\u003Cp\u003ECheck DT status after creation:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EUSE DATABASE balloon_silver;\nUSE SCHEMA silver;\nSHOW DYNAMIC TABLES LIKE 'dt_%' IN SCHEMA;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWait for an initial refresh (check Snowsight &rarr; \u003Cstrong\u003EData\u003C/strong\u003E &rarr; \u003Cstrong\u003EDynamic Tables\u003C/strong\u003E, or inspect \u003Cstrong\u003ESCHEDULING_STATE\u003C/strong\u003E in the \u003Cstrong\u003ESHOW\u003C/strong\u003E output), then query:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Top players by score\nSELECT player, total_score, bonus_pops, last_event_ts\nFROM balloon_silver.silver.dt_player_leaderboard\nORDER BY total_score DESC NULLS LAST\nLIMIT 15;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- 15-second windowed scores\nSELECT player, total_score, window_start, window_end\nFROM balloon_silver.silver.dt_realtime_scores\nORDER BY window_start DESC, player\nLIMIT 20;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ERun all verification queries at once:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow sql --filename snowflake/lab/04_dt_verify_sample_queries.sql\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003EQuick Teardown\u003C/h4\u003E\n","\u003Cp\u003ETo remove all silver DTs and their refresh schedules:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EDROP DATABASE IF EXISTS balloon_silver;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDT refreshes stop automatically when the database is dropped. The external volume and S3 data are \u003Cstrong\u003Enot\u003C/strong\u003E deleted &mdash; remove those separately if needed.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESnowflake CoWork\u003C/h2\u003E\n","\u003Cp\u003EYour silver Dynamic Iceberg Tables are now \u003Cstrong\u003EAI-ready\u003C/strong\u003E. By creating a \u003Ca href=\"https://docs.snowflake.com/en/user-guide/views-semantic\"\u003ESemantic View\u003C/a\u003E over the five silver tables, you enable natural-language querying via \u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-intelligence\"\u003ESnowflake CoWork\u003C/a\u003E and the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst\"\u003ECortex Analyst\u003C/a\u003E API &mdash; no additional ETL, no model training, no external tools.\u003C/p\u003E\n","\u003Cp\u003EA Semantic View defines the business meaning of your tables, columns, and metrics in YAML. Once created, users (and AI agents) can ask questions like:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003E&quot;Who is the top-scoring player?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Which balloon color gives the highest average points?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Show me score trends over the last hour&quot;\u003C/em\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E&hellip;and get accurate SQL-backed answers grounded in your silver data.\u003C/p\u003E\n","\u003Ch3\u003EEasy Path &mdash; Interactive Notebook\u003C/h3\u003E\n","\u003Cp\u003EOpen \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/si_lab_guide.ipynb\"\u003Esi_lab_guide.ipynb\u003C/a\u003E in Snowflake Notebooks for a guided walkthrough. The notebook uses the same environment variables as the DT Lab Guide and includes a \u003Cstrong\u003ESnowflake CoCo prompt\u003C/strong\u003E to auto-generate the Semantic View, plus step-by-step instructions for configuring the Intelligence agent.\u003C/p\u003E\n","\u003Ch3\u003EDetailed Path\u003C/h3\u003E\n","\u003Ch4\u003ECreate the Semantic View\u003C/h4\u003E\n","\u003Cp\u003ECreate a Semantic View that describes all five silver tables with their business context. Replace \u003Cstrong\u003Eballoon_silver\u003C/strong\u003E with your \u003Cstrong\u003ESNOWFLAKE_SILVER_DATABASE\u003C/strong\u003E if different:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE OR REPLACE SEMANTIC VIEW summit26_ar103_balloon_silver.silver.balloon_game_semantic_view\n\n  TABLES (\n    player_leaderboard AS summit26_ar103_balloon_silver.silver.dt_player_leaderboard\n      PRIMARY KEY (player)\n      WITH SYNONYMS ('leaderboard', 'rankings', 'top players')\n      COMMENT = 'Aggregated player scores: total score, bonus pops, last event timestamp per player',\n\n    color_stats AS summit26_ar103_balloon_silver.silver.dt_balloon_color_stats\n      UNIQUE (player, balloon_color)\n      WITH SYNONYMS ('color breakdown', 'player colors', 'color scores')\n      COMMENT = 'Per-player breakdown by balloon color: pops, points, and bonus hits',\n\n    realtime_scores AS summit26_ar103_balloon_silver.silver.dt_realtime_scores\n      WITH SYNONYMS ('live scores', 'recent scores', 'hot streaks')\n      COMMENT = '15-second windowed score totals per player for time-series analysis',\n\n    colored_pops AS summit26_ar103_balloon_silver.silver.dt_balloon_colored_pops\n      WITH SYNONYMS ('detailed pops', 'player color windows')\n      COMMENT = 'Most granular view: per-player, per-color pops in 15-second time windows',\n\n    color_trends AS summit26_ar103_balloon_silver.silver.dt_color_performance_trends\n      WITH SYNONYMS ('color trends', 'color performance', 'best colors')\n      COMMENT = 'Average score per pop and total pops by balloon color over 15-second windows'\n  )\n\n  RELATIONSHIPS (\n    color_stats_to_leaderboard AS\n      color_stats (player) REFERENCES player_leaderboard,\n    realtime_to_leaderboard AS\n      realtime_scores (player) REFERENCES player_leaderboard,\n    colored_pops_to_leaderboard AS\n      colored_pops (player) REFERENCES player_leaderboard,\n    colored_pops_to_color_stats AS\n      colored_pops (player, balloon_color) REFERENCES color_stats\n  )\n\n  FACTS (\n    player_leaderboard.total_score AS player_leaderboard.total_score\n      WITH SYNONYMS = ('total score', 'overall score', 'total points')\n      COMMENT = 'Cumulative score across all balloon pops',\n    player_leaderboard.bonus_pops AS player_leaderboard.bonus_pops\n      WITH SYNONYMS = ('bonus pops', 'bonuses', 'bonus count')\n      COMMENT = 'Number of pops where player hit their favorite color',\n    color_stats.balloon_pops AS color_stats.balloon_pops\n      WITH SYNONYMS = ('pops', 'pop count', 'times popped')\n      COMMENT = 'Number of times this player popped this color',\n    color_stats.points_by_color AS color_stats.points_by_color\n      WITH SYNONYMS = ('points by color', 'color points', 'color score')\n      COMMENT = 'Total points earned from popping this color',\n    color_stats.bonus_hits AS color_stats.bonus_hits\n      WITH SYNONYMS = ('bonus hits', 'color bonuses')\n      COMMENT = 'Number of favorite-color bonus pops for this color',\n    realtime_scores.window_score AS realtime_scores.total_score\n      WITH SYNONYMS = ('window score', 'live score', 'current score')\n      COMMENT = 'Sum of scores within the 15-second window',\n    colored_pops.window_pops AS colored_pops.balloon_pops\n      COMMENT = 'Pop count for this player+color in this window',\n    colored_pops.window_points AS colored_pops.points_by_color\n      COMMENT = 'Points for this player+color in this window',\n    colored_pops.window_bonus AS colored_pops.bonus_hits\n      COMMENT = 'Bonus pops for this player+color in this window',\n    color_trends.avg_score_per_pop AS color_trends.avg_score_per_pop\n      WITH SYNONYMS = ('efficiency', 'points per pop', 'scoring rate', 'best value')\n      COMMENT = 'Average points earned per pop of this color in this window',\n    color_trends.total_pops AS color_trends.total_pops\n      WITH SYNONYMS = ('volume', 'popularity', 'total pops')\n      COMMENT = 'Total pops of this color in this window'\n  )\n\n  DIMENSIONS (\n    player_leaderboard.player_name AS player_leaderboard.player\n      WITH SYNONYMS = ('player', 'gamer', 'username', 'who')\n      COMMENT = 'Unique player identifier',\n    player_leaderboard.last_active AS player_leaderboard.last_event_ts\n      WITH SYNONYMS = ('last active', 'last seen', 'last played')\n      COMMENT = 'Timestamp of the most recent game event for this player',\n    color_stats.cs_player AS color_stats.player\n      COMMENT = 'Player identifier in color stats',\n    color_stats.color AS color_stats.balloon_color\n      WITH SYNONYMS = ('balloon color', 'color', 'balloon type')\n      COMMENT = 'Color of the balloon (red, blue, green, yellow, etc.)',\n    color_stats.cs_last_event AS color_stats.last_event_ts\n      COMMENT = 'Most recent pop of this color by this player',\n    realtime_scores.rs_player AS realtime_scores.player\n      COMMENT = 'Player identifier in realtime scores',\n    realtime_scores.window_start AS realtime_scores.window_start\n      WITH SYNONYMS = ('start time', 'window start')\n      COMMENT = 'Start of the 15-second time window',\n    realtime_scores.window_end AS realtime_scores.window_end\n      WITH SYNONYMS = ('end time', 'window end')\n      COMMENT = 'End of the 15-second time window',\n    colored_pops.cp_player AS colored_pops.player\n      COMMENT = 'Player identifier in colored pops',\n    colored_pops.cp_color AS colored_pops.balloon_color\n      COMMENT = 'Balloon color in the detailed window view',\n    colored_pops.cp_window_start AS colored_pops.window_start\n      COMMENT = 'Start of the time window',\n    colored_pops.cp_window_end AS colored_pops.window_end\n      COMMENT = 'End of the time window',\n    color_trends.ct_color AS color_trends.balloon_color\n      WITH SYNONYMS = ('trending color', 'color trend')\n      COMMENT = 'Balloon color for performance trend analysis',\n    color_trends.ct_window_start AS color_trends.window_start\n      COMMENT = 'Start of the trend analysis window',\n    color_trends.ct_window_end AS color_trends.window_end\n      COMMENT = 'End of the trend analysis window'\n  )\n\n  METRICS (\n    player_leaderboard.m_total_score AS SUM(player_leaderboard.total_score)\n      WITH SYNONYMS = ('total points', 'combined score')\n      COMMENT = 'Total cumulative score across all players',\n    player_leaderboard.m_total_bonus_pops AS SUM(player_leaderboard.bonus_pops)\n      WITH SYNONYMS = ('bonus total', 'all bonuses')\n      COMMENT = 'Total bonus pops across all players',\n    player_leaderboard.m_player_count AS COUNT(player_leaderboard.player)\n      WITH SYNONYMS = ('number of players', 'how many players')\n      COMMENT = 'Count of players on the leaderboard',\n    color_stats.m_total_pops_by_color AS SUM(color_stats.balloon_pops)\n      WITH SYNONYMS = ('total balloon pops', 'all pops')\n      COMMENT = 'Total balloon pops aggregated across players for a given color',\n    color_stats.m_total_points_by_color AS SUM(color_stats.points_by_color)\n      WITH SYNONYMS = ('color points total', 'total color points')\n      COMMENT = 'Total points aggregated across players for a given color',\n    color_stats.m_avg_points_per_pop AS AVG(color_stats.points_by_color / NULLIF(color_stats.balloon_pops, 0))\n      WITH SYNONYMS = ('efficiency', 'scoring rate', 'points per pop')\n      COMMENT = 'Average points per pop across colors',\n    realtime_scores.m_max_window_score AS MAX(realtime_scores.window_score)\n      WITH SYNONYMS = ('best window', 'peak score', 'hottest moment')\n      COMMENT = 'Highest score in any single 15-second window',\n    realtime_scores.m_avg_window_score AS AVG(realtime_scores.window_score)\n      WITH SYNONYMS = ('average window score', 'typical window')\n      COMMENT = 'Average score per 15-second window',\n    color_trends.m_avg_efficiency AS AVG(color_trends.avg_score_per_pop)\n      WITH SYNONYMS = ('trend efficiency', 'color efficiency')\n      COMMENT = 'Weighted average score per pop across time windows',\n    color_trends.m_total_pops AS SUM(color_trends.total_pops)\n      WITH SYNONYMS = ('color popularity', 'total color pops')\n      COMMENT = 'Total balloon pops across all colors and time windows'\n  )\n\n  COMMENT = 'AI-ready semantic layer over balloon game silver Dynamic Iceberg Tables'\n\n  AI_SQL_GENERATION 'This is a balloon popping game. Players pop colored balloons to earn points. Some pops are bonus pops worth extra. The leaderboard has overall rankings by total_score. Color stats show which colors each player pops most and points per color. Realtime scores show 15-second windows of activity. Color trends show which balloon colors give the best points-per-pop over time. When asked about the top player, use the leaderboard total_score. When asked which color scores best, use color_trends avg_score_per_pop. When asked who is hot right now, use realtime_scores with the most recent window_start.';\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003EVerify the Semantic View\u003C/h4\u003E\n","\u003Cp\u003ECheck the view was created and inspect its structure:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESHOW SEMANTIC VIEWS IN SCHEMA balloon_silver.silver;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EDESC SEMANTIC VIEW balloon_silver.silver.balloon_game_semantic_view;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003EConfigure Snowflake CoWork with the Semantic View\u003C/h4\u003E\n","\u003Cp\u003EWith the Semantic View created, set up a Snowflake CoWork \u003Cstrong\u003Eagent\u003C/strong\u003E that uses it as a tool for natural-language querying. This follows the same pattern as the official \u003Ca href=\"https://www.snowflake.com/en/developers/guides/getting-started-with-snowflake-intelligence/\"\u003EGetting Started with Snowflake CoWork\u003C/a\u003E guide &mdash; but since we already have a Semantic View (not a YAML file), setup is simpler.\u003C/p\u003E\n","\u003Ch5\u003ERequired Privileges\u003C/h5\u003E\n","\u003Cp\u003ELab users running as \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E already have the necessary permissions &mdash; no additional grants are needed. ACCOUNTADMIN inherits all privileges including Cortex AI access and ownership of objects you create.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EProduction note:\u003C/strong\u003E In a production environment, you would grant \u003Ccode\u003ESNOWFLAKE.CORTEX_USER\u003C/code\u003E and \u003Ccode\u003EREFERENCES\u003C/code\u003E + \u003Ccode\u003ESELECT\u003C/code\u003E on the Semantic View to consumer roles:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EGRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE &lt;consumer_role&gt;;\nGRANT REFERENCES, SELECT ON SEMANTIC VIEW balloon_silver.silver.balloon_game_semantic_view\n  TO ROLE &lt;consumer_role&gt;;\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/blockquote\u003E\n","\u003Ch5\u003ECreate the Agent\u003C/h5\u003E\n","\u003Cp\u003E\u003Cstrong\u003E1. Navigate to the Agent admin page\u003C/strong\u003E &mdash; In Snowsight, go to \u003Cstrong\u003EAI &amp; ML &rarr; Agents\u003C/strong\u003E. Confirm your role is set to \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E (top-right role selector).\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003E2. Create a new agent:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EClick \u003Cstrong\u003E+ Create agent\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EAgent object name:\u003C/strong\u003E \u003Ccode\u003Eballoon_game_agent\u003C/code\u003E (internal identifier)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDisplay name:\u003C/strong\u003E \u003Ccode\u003EBalloon Game Analytics\u003C/code\u003E (shown to users in the chat UI)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDescription:\u003C/strong\u003E \u003Cem\u003E&quot;Ask questions about balloon game player scores, color stats, and performance trends from the silver lakehouse tables.&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003EClick \u003Cstrong\u003ECreate agent\u003C/strong\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003E3. Add the Cortex Analyst tool (Semantic View):\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESelect the \u003Cstrong\u003ETools\u003C/strong\u003E tab in the agent editor\u003C/li\u003E\u003Cli\u003EFind \u003Cstrong\u003ECortex Analyst\u003C/strong\u003E and click \u003Cstrong\u003E+ Add\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EChoose \u003Cstrong\u003ESemantic View\u003C/strong\u003E (not &quot;Semantic model file&quot; &mdash; we already have a view, not a YAML on a stage)\u003C/li\u003E\u003Cli\u003ESelect database: \u003Ccode\u003Eballoon_silver\u003C/code\u003E, schema: \u003Ccode\u003Esilver\u003C/code\u003E, view: \u003Ccode\u003Eballoon_game_semantic_view\u003C/code\u003E\u003C/li\u003E\u003Cli\u003EFor \u003Cstrong\u003EDescription\u003C/strong\u003E, click \u003Cstrong\u003EGenerate with Cortex\u003C/strong\u003E to auto-generate a tool description from your semantic metadata &mdash; or write your own, e.g.: \u003Cem\u003E&quot;Queries structured balloon game data including player leaderboards, color stats, real-time scores, and performance trends. Use for any question about players, scores, colors, or time-based patterns.&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003ESet the \u003Cstrong\u003EWarehouse\u003C/strong\u003E to your lab warehouse (e.g. \u003Ccode\u003EKAMESH_DEMOS_S\u003C/code\u003E or your assigned warehouse)\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003E4. (Optional) Add the Email tool:\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EIf you want the agent to send query results or insights via email (e.g. \u003Cem\u003E&quot;Email me the top 5 players leaderboard&quot;\u003C/em\u003E), first create the notification integration and stored procedure in your silver database:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Notification integration for email delivery\nCREATE OR REPLACE NOTIFICATION INTEGRATION email_integration\n  TYPE = EMAIL\n  ENABLED = TRUE\n  DEFAULT_SUBJECT = 'Balloon Game Analytics';\n\n-- Stored procedure that the agent calls to send emails\nCREATE OR REPLACE PROCEDURE balloon_silver.silver.send_email(\n    recipient_email VARCHAR,\n    subject VARCHAR,\n    body VARCHAR\n)\nRETURNS VARCHAR\nLANGUAGE SQL\nAS\nBEGIN\n    CALL SYSTEM$SEND_EMAIL(\n        'email_integration',\n        :recipient_email,\n        :subject,\n        :body,\n        'text/html'\n    );\n    RETURN 'Email sent successfully to ' || :recipient_email;\nEND;\n\n-- Grant execute to your role (ACCOUNTADMIN already has it)\nGRANT USAGE ON PROCEDURE balloon_silver.silver.send_email(VARCHAR, VARCHAR, VARCHAR)\n  TO ROLE ACCOUNTADMIN;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESource:\u003C/strong\u003E Adapted from the \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-getting-started-with-snowflake-intelligence/blob/main/setup.sql#L160-L210\"\u003Eofficial Snowflake CoWork setup\u003C/a\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EThen, in the agent editor:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EIn the \u003Cstrong\u003ETools\u003C/strong\u003E tab, find \u003Cstrong\u003ECustom Tools\u003C/strong\u003E and click \u003Cstrong\u003E+ Add\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003ESelect database: \u003Ccode\u003Eballoon_silver\u003C/code\u003E, schema: \u003Ccode\u003Esilver\u003C/code\u003E, procedure: \u003Ccode\u003Esend_email\u003C/code\u003E\u003C/li\u003E\u003Cli\u003EConfigure parameter descriptions (these guide the agent on how to use the tool):\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003Erecipient_email:\u003C/strong\u003E \u003Cem\u003E&quot;If the email is not provided, send it to the current user's email address.&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003Esubject:\u003C/strong\u003E \u003Cem\u003E&quot;If subject is not provided, use 'Balloon Game Analytics'.&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003Ebody:\u003C/strong\u003E \u003Cem\u003E&quot;If body is not provided, summarize the last question and use that as content for the email.&quot;\u003C/em\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EThe agent can now send results via email when prompted\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote:\u003C/strong\u003E The Email tool is optional for this lab. Skip it if you only want to explore data interactively. Your Snowflake user must have a verified email address for delivery to work.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003E5. Add sample questions (recommended):\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESelect the \u003Cstrong\u003EVoice\u003C/strong\u003E tab (or \u003Cstrong\u003EInstructions\u003C/strong\u003E tab depending on your Snowsight version)\u003C/li\u003E\u003Cli\u003EUnder \u003Cstrong\u003ESample questions\u003C/strong\u003E, add examples that help users get started:\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003E&quot;Who are the top 5 players by total score?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Which balloon color gives the best average points per pop?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Show me score trends over the last few time windows&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;How many total bonus pops have all players earned?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Email me a summary of the top 3 players&quot;\u003C/em\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003E6. Set orchestration instructions:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EIn the \u003Cstrong\u003EInstructions\u003C/strong\u003E section, add the following orchestration instruction:\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003E&quot;Whenever you can answer visually with a chart, always choose to generate a chart even if the user didn't specify to.&quot;\u003C/em\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003E7. Save the agent\u003C/strong\u003E &mdash; Click \u003Cstrong\u003ESave\u003C/strong\u003E in the top-right corner. The agent is now live.\u003C/p\u003E\n","\u003Ch5\u003EAccess the Agent\u003C/h5\u003E\n","\u003Cp\u003EOnce saved, users can access the agent in two ways:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESnowflake CoWork chat:\u003C/strong\u003E Navigate to \u003Cstrong\u003EAI &amp; ML &rarr; Snowflake CoWork\u003C/strong\u003E, select \u003Ccode\u003EBalloon Game Analytics\u003C/code\u003E from the agent picker in the chat bar, and start asking questions\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDirect URL:\u003C/strong\u003E Go to \u003Ca href=\"https://ai.snowflake.com\"\u003Eai.snowflake.com\u003C/a\u003E and select the agent\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHow it works:\u003C/strong\u003E When a user asks a question, the agent routes it to Cortex Analyst, which reads the Semantic View's table/column descriptions, relationships, and primary keys to generate accurate SQL. The query executes against your silver Dynamic Iceberg Tables and returns results in the chat &mdash; no SQL knowledge required.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003ETry It with Snowflake CoWork\u003C/h4\u003E\n","\u003Cp\u003EOnce configured, open your Intelligence app and ask natural-language questions about your balloon game data. Intelligence will ground its SQL generation in the semantic context you defined &mdash; table relationships, column descriptions, and metric definitions.\u003C/p\u003E\n","\u003Cp\u003EExample questions to try:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003E&quot;Who are the top 5 players by total score?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;What's the most popular balloon color across all players?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Which color gives the best average points per pop?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Show me how player scores trend over time windows&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Which players have the most bonus pops as a percentage of total pops?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;How many total bonus pops have all players earned?&quot;\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cem\u003E&quot;Email me a summary of the top 3 players&quot;\u003C/em\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhy this matters:\u003C/strong\u003E Your silver data was already queryable by SQL users and BI tools. The Semantic View now makes it queryable by \u003Cstrong\u003Eanyone\u003C/strong\u003E &mdash; business analysts, executives, or automated agents &mdash; using plain English. The same Iceberg data powers dashboards, cross-engine queries (DuckDB), \u003Cstrong\u003Eand\u003C/strong\u003E AI-driven analytics.\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESiS Dashboard\u003C/h2\u003E\n","\u003Cp\u003EAfter the silver Dynamic Tables are live, deploy a Streamlit in Snowflake app that visualizes the balloon game event data. The app runs entirely in your Snowflake account next to your data.\u003C/p\u003E\n","\u003Cp\u003EThis chapter offers \u003Cstrong\u003Etwo paths\u003C/strong\u003E to the same outcome &mdash; choose one (or try both):\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EPath\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EHow\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWhat you'll learn\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EEasy Path: Snowflake CoCo\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDescribe what you want in natural language; AI builds, debugs, and deploys\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EIntent-driven development &mdash; how iterative prompts replace manual coding\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EDetailed Path: CLI\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWrite every file and run every CLI command yourself\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EFull control, traditional workflow\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERecommended:\u003C/strong\u003E Try the Easy Path first. Watch Snowflake CoCo encounter errors (missing packages, unsupported features, permission gaps) and self-heal. Then ask it to generate the &quot;ideal prompt&quot; that would have worked in one shot &mdash; that's the core lesson of \u003Ca href=\"https://blogs.kameshs.dev/intent-driven-development-the-shift-developers-cant-ignore-ef434f94d56c\"\u003EIntent-Driven Development (IDD)\u003C/a\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPrerequisites:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E03_dt_pipelines\u003C/strong\u003E applied and all five \u003Cstrong\u003Edt_\u003C/strong\u003E* tables exist in \u003Cstrong\u003Eballoon_silver.silver\u003C/strong\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EEasy Path: Intent-Driven (Snowflake CoCo)\u003C/h3\u003E\n","\u003Cp\u003EOpen \u003Cstrong\u003ESnowflake CoCo\u003C/strong\u003E from the Snowsight sidebar. This path has three rounds that demonstrate the progression from vague intent to precise specification.\u003C/p\u003E\n","\u003Ch4\u003ERound 1 &mdash; State Your Intent\u003C/h4\u003E\n","\u003Cp\u003E\u003Cem\u003ETell the agent \u003Cstrong\u003Ewhat\u003C/strong\u003E you want, not \u003Cstrong\u003Ehow\u003C/strong\u003E to build it.\u003C/em\u003E\u003C/p\u003E\n","\u003Cp\u003ECopy and paste this into Snowflake CoCo:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003EFirst, ask me the following before you start building:\n\n1. What database.schema has my game's Dynamic Tables?\n2. Where should the Streamlit app and stage be created?\n3. What warehouse should it use?\n\nThen, build me a multi-page Streamlit in Snowflake dashboard for my balloon popper game using the Dynamic Tables from the schema above.\n\nStructure the app in its own directory with a pages/ directory:\n\n- streamlit_app.py &mdash; home page with a game summary and key metrics\n- pages/1_Leaderboard.py &mdash; top 5 player rankings, score gaps, bar chart\n- pages/2_Color_Breakdown.py &mdash; pops by color, avg points per pop, player-color heatmap, players favorite color\n- pages/3_Trends.py &mdash; color value over time, player scores over time\n\nI want to answer: \n  * Who is winning and by how much? \n  * Which colors are most popular? \n  * Which color is worth more points? How are scores trending?\n\nMake it auto-refreshing, clean charts, easy to read at a glance. Handle missing data gracefully. Add a color scheme toggle. Use get_active_session(), wide layout, lowercase column names from Snowpark before passing to pandas. \n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWhen Snowflake CoCo asks you the interactive questions, answer with:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EDynamic Tables schema:\u003C/strong\u003E \u003Cstrong\u003Eballoon_silver.silver\u003C/strong\u003E (or your \u003Cstrong\u003ESNOWFLAKE_SILVER_DATABASE.SNOWFLAKE_SILVER_SCHEMA\u003C/strong\u003E)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EApp schema:\u003C/strong\u003E \u003Cstrong\u003Eballoon_silver.apps\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EWarehouse:\u003C/strong\u003E your \u003Cstrong\u003ESNOWFLAKE_WAREHOUSE\u003C/strong\u003E value\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhat to watch for:\u003C/strong\u003E Snowflake CoCo will likely hit 3&ndash;4 errors and fix each one automatically:\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EExpected error\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ERoot cause\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ECoCo self-heals by&hellip;\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Est.set_page_config\u003C/strong\u003E crash\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Epage_icon\u003C/strong\u003E / \u003Cstrong\u003Epage_title\u003C/strong\u003E unsupported in SiS\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERemoving unsupported params\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EHeatmap import error\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Epx.imshow\u003C/strong\u003E requires \u003Cstrong\u003Escipy\u003C/strong\u003E (not in Snowflake conda)\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESwitching to \u003Cstrong\u003Eplotly.graph_objects.Heatmap\u003C/strong\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Est.rerun()\u003C/strong\u003E not found\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDefault Streamlit version is 1.22; \u003Cstrong\u003Est.rerun\u003C/strong\u003E needs &ge; 1.27\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPinning \u003Cstrong\u003Estreamlit=1.35.0\u003C/strong\u003E in \u003Cstrong\u003Eenvironment.yml\u003C/strong\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESchema does not exist\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Eballoon_silver.apps\u003C/strong\u003E not yet created\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreating the schema automatically\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E&quot;No data available&quot; on all pages\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EApp's owner role lacks SELECT on silver DTs\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDiscovering and granting permissions\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Cp\u003EThat iterative error &rarr; fix loop \u003Cstrong\u003Eis\u003C/strong\u003E the demo. Each failure is an intent gap that Snowflake CoCo closes autonomously.\u003C/p\u003E\n","\u003Ch4\u003ERound 2 &mdash; Ask CoCo to Reflect\u003C/h4\u003E\n","\u003Cp\u003EAfter the dashboard is running, paste this into Snowflake CoCo:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003ELook at the errors you encountered and the fixes you made while\nbuilding this dashboard. Based on that experience, write me the\nprecise, optimized prompt that would have built this app correctly\nin one shot &mdash; no errors, no retries. Include every technical\nconstraint and detail you had to discover along the way.\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ESave the prompt Snowflake CoCo generates &mdash; that's your \u003Cstrong\u003Ebaseline prompt\u003C/strong\u003E. This is the core practice of intent-driven development: start vague, let the agent iterate, then capture the learnings as a precise specification.\u003C/p\u003E\n","\u003Ch4\u003ERound 3 (Optional) &mdash; Prove the Difference\u003C/h4\u003E\n","\u003Cp\u003EWant to see the contrast? Ask Snowflake CoCo to delete the app, start a fresh CoCo session, paste the optimized prompt from Round 2, and watch it build cleanly in one pass &mdash; zero errors, zero retries.\u003C/p\u003E\n","\u003Ch3\u003EDetailed Path (CLI)\u003C/h3\u003E\n","\u003Cp\u003EFollow this path for a traditional, manual deployment using the Snowflake CLI.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAdditional prerequisites for Detailed Path:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowflake CLI 3.14+ installed (via \u003Cstrong\u003Euv sync\u003C/strong\u003E, then use \u003Cstrong\u003Euv run snow\u003C/strong\u003E)\u003C/li\u003E\u003Cli\u003EYour role has \u003Cstrong\u003ESELECT\u003C/strong\u003E on \u003Cstrong\u003Eballoon_silver.silver.\u003C/strong\u003E* and \u003Cstrong\u003ECREATE STREAMLIT\u003C/strong\u003E on \u003Cstrong\u003Eballoon_silver.apps\u003C/strong\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EPrepare the APPS Schema\u003C/h4\u003E\n","\u003Cp\u003ECreate the schema and grant access before deploying:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE SCHEMA IF NOT EXISTS balloon_silver.apps;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EIf your Streamlit app will run under a role other than \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E (e.g. a personal lab role), grant access to the silver data:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EGRANT USAGE ON DATABASE balloon_silver TO ROLE &lt;your_role&gt;;\nGRANT USAGE ON SCHEMA balloon_silver.silver TO ROLE &lt;your_role&gt;;\nGRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE &lt;your_role&gt;;\nGRANT ALL ON SCHEMA balloon_silver.apps TO ROLE &lt;your_role&gt;;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EApp defaults (from \u003Cstrong\u003Esnowflake/sis/snowflake.yml\u003C/strong\u003E):\u003C/strong\u003E\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ESetting\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EValue\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EStreamlit object location\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Eballoon_silver.apps\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESilver data source\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Eballoon_silver.silver\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EQuery warehouse\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003ECOMPUTE_WH\u003C/em\u003E (override via \u003Cstrong\u003ESNOWFLAKE_WAREHOUSE\u003C/strong\u003E)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDeploy task\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cem\u003Etask snowflake:sis-deploy\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003Esnowflake/sis/snowflake.yml\u003C/strong\u003E is the ground truth for deployment defaults. The app's schema (\u003Cstrong\u003ESNOWFLAKE_APPS_SCHEMA\u003C/strong\u003E = \u003Cstrong\u003Eapps\u003C/strong\u003E) is separate from the silver data schema (\u003Cstrong\u003ESNOWFLAKE_SILVER_SCHEMA\u003C/strong\u003E = \u003Cstrong\u003Esilver\u003C/strong\u003E).\u003C/p\u003E\n","\u003Ch4\u003EDeploy the App\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003Etask snowflake:sis-deploy\u003C/strong\u003E creates the target schema, stage, and Streamlit object automatically. Deploy using the task wrapper (recommended &mdash; reads \u003Cstrong\u003ELAB_USERNAME\u003C/strong\u003E, \u003Cstrong\u003ESNOWFLAKE_APPS_SCHEMA\u003C/strong\u003E, \u003Cstrong\u003ESNOWFLAKE_SILVER_DATABASE\u003C/strong\u003E, \u003Cstrong\u003ESNOWFLAKE_SILVER_SCHEMA\u003C/strong\u003E, and \u003Cstrong\u003ESNOWFLAKE_WAREHOUSE\u003C/strong\u003E from \u003Cstrong\u003E.env\u003C/strong\u003E):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:sis-deploy -- --open\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EAdding \u003Cstrong\u003E--open\u003C/strong\u003E launches the app in a browser immediately after deploy.\u003C/p\u003E\n","\u003Cp\u003EAlternatively, deploy directly with Snowflake CLI:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow streamlit deploy balloon_game_dashboard --project snowflake/sis --replace\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EPreview the resolved deploy config without deploying:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Euv run sis-deploy show-config\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EOpen and Share\u003C/h3\u003E\n","\u003Cp\u003EPrint the deployed app URL:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:url\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EOpen the deployed app in Snowsight. Grant access to analyst roles:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EGRANT USAGE ON STREAMLIT balloon_silver.apps.balloon_game_dashboard TO ROLE &lt;analyst_role&gt;;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EIf the account requires it, promote the live version:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EALTER STREAMLIT balloon_silver.apps.balloon_game_dashboard ADD LIVE VERSION FROM LAST;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EApp Pages\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EPage\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EWhat it shows\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EHome\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESummary cards &mdash; total pops, players, top score\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ELeaderboard\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERanked player table from \u003Cstrong\u003Edt_player_leaderboard\u003C/strong\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EColor Analysis\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EBalloon color preference heatmaps from \u003Cstrong\u003Edt_balloon_color_stats\u003C/strong\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EPerformance Trends\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETime-series scoring from \u003Cstrong\u003Edt_color_performance_trends\u003C/strong\u003E\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EDuckDB Integration\u003C/h2\u003E\n","\u003Cp\u003EDuckDB can read Snowflake-managed Iceberg tables directly via the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/tables-iceberg-access-using-external-query-engine-snowflake-horizon\"\u003EHorizon Iceberg REST Catalog (HIRC)\u003C/a\u003E, giving cross-engine access to the same silver data without copying files or converting formats.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPreview feature:\u003C/strong\u003E HIRC is in Public Preview. It works in all Snowflake public regions except government regions. No additional charges apply during preview.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EWhat Is HIRC\u003C/h3\u003E\n","\u003Cp\u003ESnowflake exposes Snowflake-managed Iceberg tables via a standard Iceberg REST endpoint:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003Ehttps://&lt;account&gt;.snowflakecomputing.com/polaris/api/catalog\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDuckDB authenticates using a Programmatic Access Token (PAT). The PAT is exchanged for temporary credentials via the OAuth2 client credentials flow, scoped to a Snowflake role. DuckDB then reads Iceberg metadata and S3 data files directly &mdash; Snowflake does not proxy the data.\u003C/p\u003E\n","\u003Cp\u003ETwo HIRC-specific rules to keep in mind before you start:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EWarehouse name is case-sensitive\u003C/strong\u003E &mdash; the catalog name in \u003Cstrong\u003EATTACH\u003C/strong\u003E must be \u003Cstrong\u003EUPPERCASE\u003C/strong\u003E (e.g. \u003Cstrong\u003E'BALLOON_SILVER'\u003C/strong\u003E). Lowercase returns HTTP 404.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EGRANT ON ALL TABLES skips Dynamic Iceberg Tables\u003C/strong\u003E &mdash; you must use \u003Cstrong\u003EON ALL DYNAMIC TABLES\u003C/strong\u003E and \u003Cstrong\u003EON FUTURE DYNAMIC TABLES\u003C/strong\u003E; the plain \u003Cstrong\u003ETABLES\u003C/strong\u003E variant silently grants nothing.\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EEasy Path &mdash; Interactive Notebook\u003C/h3\u003E\n","\u003Cp\u003EImport \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/duckdb_lab_guide.ipynb\"\u003Educkdb_lab_guide.ipynb\u003C/a\u003E into \u003Ca href=\"https://colab.research.google.com/\"\u003EGoogle Colab\u003C/a\u003E or any Jupyter-compatible environment (JupyterLab, VS Code, etc.) for an interactive walkthrough of external engine integration via HIRC.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBefore running the notebook\u003C/strong\u003E, complete the HIRC setup in Snowflake using \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/05_duckdb_hirc_setup.ipynb\"\u003E05_duckdb_hirc_setup.ipynb\u003C/a\u003E in Snowflake Notebooks. This creates the service account, reader role, network policy, and PAT needed for DuckDB authentication.\u003C/p\u003E\n","\u003Cp\u003EThe DuckDB notebook:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EInstalls the DuckDB Iceberg and HTTPFS extensions\u003C/li\u003E\u003Cli\u003EAuthenticates to Snowflake's HIRC endpoint using the PAT created in the setup notebook\u003C/li\u003E\u003Cli\u003EAttaches the silver database and discovers all five Dynamic Iceberg Tables\u003C/li\u003E\u003Cli\u003ERuns cross-engine queries against the same silver data &mdash; proving multi-engine interoperability without data copies\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETip:\u003C/strong\u003E To open in Google Colab directly, prepend \u003Ccode\u003Ehttps://colab.research.google.com/github/\u003C/code\u003E to the notebook path:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003Ehttps://colab.research.google.com/github/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/duckdb_lab_guide.ipynb\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EFollow the \u003Cstrong\u003EDetailed Path\u003C/strong\u003E below for step-by-step shell commands and raw DuckDB SQL.\u003C/p\u003E\n","\u003Ch3\u003EDetailed Path\u003C/h3\u003E\n","\u003Ch4\u003EQuick Setup\u003C/h4\u003E\n","\u003Cp\u003EThe fastest path: set three env vars, run one task, open the notebook.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003E1. Add to .env\u003C/strong\u003E (substitute your \u003Cstrong\u003ELAB_USERNAME\u003C/strong\u003E prefix &mdash; for example \u003Cstrong\u003Eksampath\u003C/strong\u003E):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003ESNOWFLAKE_ACCOUNT_URL=https://&lt;org&gt;-&lt;account&gt;.snowflakecomputing.com\nSA_USER=${LAB_USERNAME}_duckdb_sa          # e.g. ksampath_duckdb_sa\nSA_ROLE=${LAB_USERNAME}_duckdb_silver_reader\nSNOWFLAKE_SILVER_DATABASE=${LAB_USERNAME}_balloon_silver\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E2. Create the service account, role, and PAT\u003C/strong\u003E (run from the repo root):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:pat-create\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis creates the role, user, and a PAT scoped to that role, then stores the PAT in your OS keyring. No further steps needed for auth.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003E3. Grant Iceberg access\u003C/strong\u003E (run as \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E &mdash; replace \u003Cstrong\u003Eballoon_silver\u003C/strong\u003E with your \u003Cstrong\u003ESNOWFLAKE_SILVER_DATABASE\u003C/strong\u003E):\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECritical:\u003C/strong\u003E \u003Cstrong\u003EGRANT SELECT ON ALL TABLES\u003C/strong\u003E silently skips Dynamic Iceberg Tables. Use \u003Cstrong\u003EON ALL DYNAMIC TABLES\u003C/strong\u003E and \u003Cstrong\u003EON FUTURE DYNAMIC TABLES\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EGRANT USAGE ON DATABASE balloon_silver TO ROLE duckdb_silver_reader;\nGRANT USAGE ON SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\nGRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\nGRANT SELECT ON FUTURE DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E4. Open the notebook:\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/duckdb_lab_guide.ipynb\"\u003Educkdb_lab_guide.ipynb\u003C/a\u003E &mdash; loads the PAT from the OS keyring automatically, installs the DuckDB Iceberg extension, attaches the silver database via HIRC, and queries all five silver DTs.\u003C/p\u003E\n","\u003Ch4\u003EDetailed Walkthrough\u003C/h4\u003E\n","\u003Cp\u003EThis section explains each step in the Quick Setup and shows the raw DuckDB SQL if you prefer to run it outside the notebook.\u003C/p\u003E\n","\u003Ch4\u003EPrerequisites\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003ESilver Dynamic Iceberg Tables created and refreshed at least once\u003C/li\u003E\u003Cli\u003ESnowflake role with \u003Cstrong\u003ECREATE ROLE\u003C/strong\u003E / \u003Cstrong\u003ECREATE USER\u003C/strong\u003E privileges for service account setup\u003C/li\u003E\u003Cli\u003EDuckDB available in the project Python environment &mdash; \u003Cstrong\u003Euv sync\u003C/strong\u003E installs it automatically\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EWhat \u003Cstrong\u003Etask snowflake:pat-create\u003C/strong\u003E does\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003Etask snowflake:pat-create\u003C/strong\u003E calls \u003Cstrong\u003Esfutils-pat create --user SA_USER --role SA_ROLE --db SNOWFLAKE_SILVER_DATABASE\u003C/strong\u003E, which:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003ECreates the role \u003Cstrong\u003ESA_ROLE\u003C/strong\u003E if it does not exist (no hyphens &mdash; HIRC requires underscore-only role names)\u003C/li\u003E\u003Cli\u003ECreates the user \u003Cstrong\u003ESA_USER\u003C/strong\u003E with \u003Cstrong\u003EDEFAULT_ROLE = SA_ROLE\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EGrants \u003Cstrong\u003ESA_ROLE\u003C/strong\u003E to \u003Cstrong\u003ESA_USER\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003ECreates a PAT scoped to \u003Cstrong\u003ESA_ROLE\u003C/strong\u003E and stores it in the OS keyring under \u003Cstrong\u003EHOST:ACCOUNT:USER:SFUTILS-PAT:PAT_NAME\u003C/strong\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EThe PAT never touches \u003Cstrong\u003E.env\u003C/strong\u003E or any tracked file.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESecurity:\u003C/strong\u003E For CI/CD environments, inject the PAT at runtime from a vault or secrets manager.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EGrant Iceberg access (manual SQL)\u003C/h4\u003E\n","\u003Cp\u003EThe task creates the role and user but does not grant table access. Run this once as \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE ROLE IF NOT EXISTS duckdb_silver_reader;\n\nGRANT USAGE ON DATABASE balloon_silver TO ROLE duckdb_silver_reader;\nGRANT USAGE ON SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\nGRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\nGRANT SELECT ON FUTURE DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003EConnect from DuckDB\u003C/h4\u003E\n","\u003Cp\u003EInstall and load the required extensions (once per DuckDB installation):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EINSTALL iceberg;\nLOAD iceberg;\nINSTALL httpfs;\nLOAD httpfs;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ECreate the PAT-based Iceberg secret:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE SECRET iceberg_pat_secret (\n  TYPE iceberg,\n  CLIENT_ID '',\n  CLIENT_SECRET '&lt;your_pat&gt;',\n  OAUTH2_SERVER_URI 'https://&lt;account&gt;.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens',\n  OAUTH2_GRANT_TYPE 'client_credentials',\n  OAUTH2_SCOPE 'session:role:duckdb_silver_reader'\n);\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EAttach the silver database &mdash; warehouse name must be \u003Cstrong\u003EUPPERCASE\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EATTACH 'BALLOON_SILVER' AS balloon_silver (\n  TYPE iceberg,\n  SECRET iceberg_pat_secret,\n  ENDPOINT 'https://&lt;account&gt;.snowflakecomputing.com/polaris/api/catalog',\n  SUPPORT_NESTED_NAMESPACES false\n);\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDiscover tables &mdash; \u003Cstrong\u003ESHOW ALL TABLES\u003C/strong\u003E returns empty for Iceberg REST catalogs; use \u003Cstrong\u003EUSE\u003C/strong\u003E first:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EUSE balloon_silver.SILVER;\nSHOW TABLES;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EQuery the player leaderboard:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT player, total_score, bonus_pops, last_event_ts\nFROM balloon_silver.SILVER.DT_PLAYER_LEADERBOARD\nORDER BY total_score DESC NULLS LAST\nLIMIT 10;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003ELimitations\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EExternal engines can query but cannot write to Iceberg tables via HIRC\u003C/li\u003E\u003Cli\u003EReads work on Iceberg v2 or earlier only\u003C/li\u003E\u003Cli\u003ETables with row access policies or masking policies are not accessible via HIRC\u003C/li\u003E\u003Cli\u003EOnly Snowflake-managed Iceberg tables are supported &mdash; not externally managed, Delta, or Parquet Direct tables\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESHOW ALL TABLES\u003C/strong\u003E and \u003Cstrong\u003Einformation_schema\u003C/strong\u003E are unavailable for attached Iceberg REST catalogs in DuckDB &mdash; use \u003Cstrong\u003EUSE catalog.SCHEMA; SHOW TABLES\u003C/strong\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003ECase-Sensitive Identifiers\u003C/h3\u003E\n","\u003Cp\u003ESnowflake identifiers are UPPERCASE when accessed through HIRC. Always use uppercase schema and table names in DuckDB:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Wrong: lowercase identifiers fail with &quot;table does not exist&quot;\nSELECT * FROM balloon_silver.silver.dt_player_leaderboard;\n\n-- Correct: uppercase matches Snowflake's internal representation\nSELECT * FROM balloon_silver.SILVER.DT_PLAYER_LEADERBOARD;\n\u003C/code\u003E\u003C/pre\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ECleanup\u003C/h2\u003E\n","\u003Cp\u003ERemove lab resources in reverse order of creation.\u003C/p\u003E\n","\u003Ch3\u003ESnowflake Objects\u003C/h3\u003E\n","\u003Cp\u003EDrop Dynamic Tables and the silver database:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EDROP DATABASE IF EXISTS balloon_silver;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDrop the Streamlit app (if deployed). If you used the \u003Cstrong\u003EEasy Path (Snowflake CoCo)\u003C/strong\u003E, the app name may differ &mdash; check \u003Cstrong\u003ESHOW STREAMLITS IN SCHEMA balloon_silver.apps\u003C/strong\u003E first:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESHOW STREAMLITS IN SCHEMA balloon_silver.apps;\nDROP STREAMLIT IF EXISTS balloon_silver.apps.balloon_game_dashboard;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDrop the catalog-linked database:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EDROP DATABASE IF EXISTS balloon_game_events;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDrop the catalog integration:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EDROP CATALOG INTEGRATION IF EXISTS glue_rest_catalog_int;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDrop the DuckDB service account objects (if created):\u003C/p\u003E\n","\u003Cp\u003ERevoke the DuckDB service account PAT before dropping the user:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask snowflake:pat-revoke\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EDROP USER IF EXISTS duckdb_sa;\nDROP ROLE IF EXISTS duckdb_silver_reader;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003ESee \u003Cem\u003EPrivileges Lost After CLD Recreate\u003C/em\u003E in Troubleshooting if you recreate the CLD during teardown and re-setup.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EBronze (AWS)\u003C/h3\u003E\n","\u003Cp\u003EPreview what will be deleted:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:cleanup-dry-run\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ERemove Glue tables, the Glue database, and S3 Tables control-plane resources:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:cleanup\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003Ebronze:cleanup\u003C/strong\u003E removes Glue and S3 Tables metadata only. It does \u003Cstrong\u003Enot\u003C/strong\u003E delete \u003Cstrong\u003EBRONZE_BUCKET_NAME\u003C/strong\u003E or objects under \u003Cstrong\u003Eiceberg/\u003C/strong\u003E in S3. Remove those manually:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Eaws s3 rm &quot;s3://$BRONZE_BUCKET_NAME/iceberg/&quot; --recursive\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ELake Formation registrations and IAM roles created for LF are not removed by \u003Cstrong\u003Ebronze:cleanup\u003C/strong\u003E &mdash; delete those in the AWS console or via CLI as needed.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENotebook users (CloudFormation):\u003C/strong\u003E If you used the notebook's CloudFormation template, a single command removes all IAM roles, policies, Lake Formation registration, and permissions:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Eaws cloudformation delete-stack --stack-name snowflake-cld-iam --region $AWS_REGION\naws cloudformation wait stack-delete-complete --stack-name snowflake-cld-iam --region $AWS_REGION\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EIf deletion fails due to active Lake Formation dependencies, check the CloudFormation \u003Cstrong\u003EEvents\u003C/strong\u003E tab for the failed resource.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EOptional: Delete SIGV4 Lab Role\u003C/h3\u003E\n","\u003Cp\u003EIf \u003Cstrong\u003Etask snowflake:create-glue-catalog-read-role\u003C/strong\u003E created the IAM role, remove it after Snowflake teardown:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:cleanup-dry-run -- --delete-snowflake-catalog-iam-role\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:cleanup -- --yes --delete-snowflake-catalog-iam-role\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis deletes only roles tagged \u003Cstrong\u003Eproject=balloon-popper-demo\u003C/strong\u003E and \u003Cstrong\u003Epurpose=snowflake-glue-catalog-read\u003C/strong\u003E.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ETroubleshooting\u003C/h2\u003E\n","\u003Ch3\u003ECredential Vending Error 094120\u003C/h3\u003E\n","\u003Cp\u003EIf \u003Cstrong\u003ESYSTEM$CATALOG_LINK_STATUS\u003C/strong\u003E returns error code \u003Cstrong\u003E094120\u003C/strong\u003E (&quot;Failed to retrieve credentials from the Catalog&quot;), work through this checklist in order:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ETwo separate IAM roles:\u003C/strong\u003E The SIGV4 role (Snowflake catalog signer) and the LF data-access role passed to \u003Cstrong\u003Eregister-resource --role-arn\u003C/strong\u003E must be different principals. Using the same role causes credential vending failures.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERegister-resource flags:\u003C/strong\u003E The warehouse S3 location must be registered with \u003Cstrong\u003EHybridAccessEnabled=false\u003C/strong\u003E and \u003Cstrong\u003EWithFederation=false\u003C/strong\u003E. Hybrid mode produces unpredictable vending behavior.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EGlue default permissions:\u003C/strong\u003E Run \u003Cstrong\u003Eaws glue update-database\u003C/strong\u003E with empty \u003Cstrong\u003ECreateTableDefaultPermissions\u003C/strong\u003E on \u003Cstrong\u003EGLUE_DATABASE\u003C/strong\u003E so new tables follow Lake Formation mode, not IAM-only defaults.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ELF grants:\u003C/strong\u003E The SIGV4 role must have \u003Cstrong\u003EDESCRIBE\u003C/strong\u003E on the database and \u003Cstrong\u003ESELECT\u003C/strong\u003E, \u003Cstrong\u003EDESCRIBE\u003C/strong\u003E on the table wildcard via Lake Formation \u003Cstrong\u003Egrant-permissions\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERecreate the CLD:\u003C/strong\u003E After fixing any LF or IAM setting, run \u003Cstrong\u003ECREATE OR REPLACE DATABASE &hellip; LINKED_CATALOG = ( &hellip; )\u003C/strong\u003E. \u003Cstrong\u003EALTER DATABASE &hellip; RESUME DISCOVERY\u003C/strong\u003E only retries table/schema discovery &mdash; it does not re-establish the catalog connection.\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003EGlue Schema Not Found\u003C/h3\u003E\n","\u003Cp\u003EGlue database names surface as lowercase schema identifiers in the CLD. Always use double-quoted lowercase:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- See the exact name Snowflake discovered:\nSHOW SCHEMAS IN DATABASE balloon_game_events;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Use it in double quotes:\nSHOW ICEBERG TABLES IN SCHEMA balloon_game_events.&quot;ksampath_balloon_pops&quot;;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EIntegration DISABLED After Trust Apply\u003C/h3\u003E\n","\u003Cp\u003EIAM trust policy changes can take up to 30 seconds to propagate. Wait briefly and re-run \u003Cstrong\u003EDESC CATALOG INTEGRATION\u003C/strong\u003E &mdash; the status should update. If it stays DISABLED, confirm \u003Cstrong\u003EGLUE_AWS_IAM_USER_ARN\u003C/strong\u003E and \u003Cstrong\u003EGLUE_AWS_EXTERNAL_ID\u003C/strong\u003E in the rendered trust JSON match the current \u003Cstrong\u003EDESC\u003C/strong\u003E output exactly.\u003C/p\u003E\n","\u003Cp\u003EUse \u003Cstrong\u003ESYSTEM$VERIFY_CATALOG_INTEGRATION\u003C/strong\u003E to test connectivity explicitly:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('glue_rest_catalog_int');\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThe JSON response includes error details when the trust policy or IAM permissions are misconfigured.\u003C/p\u003E\n","\u003Ch3\u003EEmpty Windowed DTs\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003Edt_realtime_scores\u003C/strong\u003E, \u003Cstrong\u003Edt_balloon_colored_pops\u003C/strong\u003E, and \u003Cstrong\u003Edt_color_performance_trends\u003C/strong\u003E use 15-second \u003Cstrong\u003ETIME_SLICE\u003C/strong\u003E windows. They are empty when all bronze events fall in a single bucket or when DTs have not yet completed an initial refresh.\u003C/p\u003E\n","\u003Cp\u003ELoad additional events:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Etask bronze:load-more\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EWait for \u003Cstrong\u003ETARGET_LAG\u003C/strong\u003E to elapse, then re-query.\u003C/p\u003E\n","\u003Ch3\u003EMissing USAGE on External Volume\u003C/h3\u003E\n","\u003Cp\u003EIf Dynamic Iceberg Table creation fails with a permissions error:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EGRANT USAGE ON EXTERNAL VOLUME &lt;volume_name&gt; TO ROLE &lt;your_role&gt;;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EGRANT USAGE ON WAREHOUSE &lt;warehouse_name&gt; TO ROLE &lt;your_role&gt;;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EPrivileges Lost After CLD Recreate\u003C/h3\u003E\n","\u003Cp\u003EAfter \u003Cstrong\u003ECREATE OR REPLACE DATABASE &hellip; LINKED_CATALOG\u003C/strong\u003E, re-apply integration usage:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EGRANT USAGE ON INTEGRATION glue_rest_catalog_int TO ROLE &lt;your_role&gt;;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ESee the \u003Ca href=\"https://docs.snowflake.com/en/release-notes/bcr-bundles/2025_07/bcr-2114\"\u003EBCR-2114 behavior change\u003C/a\u003E in Snowflake release notes regarding catalog integration usage requirements.\u003C/p\u003E\n","\u003Ch3\u003EDuckDB HIRC: Role Not Found\u003C/h3\u003E\n","\u003Cp\u003EHIRC does not support role names with hyphens. If you see &quot;Role not found&quot;, ensure the role name uses underscores only &mdash; \u003Cstrong\u003Educkdb_silver_reader\u003C/strong\u003E not \u003Cstrong\u003Educkdb-silver-reader\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch3\u003EDuckDB HIRC: Table Does Not Exist\u003C/h3\u003E\n","\u003Cp\u003EIf \u003Cstrong\u003ESHOW ALL TABLES\u003C/strong\u003E returns results but a \u003Cstrong\u003ESELECT\u003C/strong\u003E fails with &quot;table does not exist&quot;, the identifiers are case-sensitive. Use uppercase schema and table names:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT * FROM balloon_silver.SILVER.DT_PLAYER_LEADERBOARD LIMIT 5;\n\u003C/code\u003E\u003C/pre\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ETask References\u003C/h2\u003E\n","\u003Cp\u003EQuick reference for all lab tasks. Run \u003Cstrong\u003Etask --list\u003C/strong\u003E from the repo root to see all available tasks with their current status.\u003C/p\u003E\n","\u003Ch3\u003ERoot Tasks\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETask\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esetup\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EBootstrap: \u003Cstrong\u003Euv sync\u003C/strong\u003E + copy \u003Cstrong\u003E.env.example\u003C/strong\u003E &rarr; \u003Cstrong\u003E.env\u003C/strong\u003E if missing\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Echeck-tools\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EVerify lab CLIs on PATH and run \u003Cem\u003Eaws sts get-caller-identity\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edefault\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EList all available tasks\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edashboard-local\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EOptional dev: run the Streamlit dashboard locally (not the lab outcome)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Egenerator-local\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERun the balloon game data generator locally\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Ch3\u003Ebronze:* Tasks\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETask\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:glue-setup\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate Glue database and register S3 warehouse\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:glue-setup-dry-run\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPreview Glue setup without making changes\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:s3tables-setup\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate S3 Tables table bucket, namespace, and Iceberg table\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:s3tables-setup-dry-run\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPreview S3 Tables setup without creating resources\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:render-iam\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERender IAM policy template to \u003Cem\u003E.aws-config/\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:render-iam-dry-run\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint rendered IAM policy JSON without writing files\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:lakeformation-setup\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate LF data-access role, register S3, grant permissions to SIGV4 role\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:lakeformation-setup-dry-run\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPreview Lake Formation setup without AWS writes\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:load\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELoad sample balloon game events into Glue Iceberg table\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:load-more\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EAppend a second batch of events (different RNG seed)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:snowflake-summary\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint resolved bucket, database, and ARNs for Snowflake catalog setup\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:snowflake-summary-json\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESame as snowflake-summary with JSON output\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:cleanup\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDelete bronze metadata: Glue tables/database and S3 Tables resources\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:cleanup-dry-run\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPreview bronze cleanup without deleting anything\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Ebronze:all\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERun glue-setup, s3tables-setup, and load in sequence\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Ch3\u003Esnowflake:* Tasks\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETask\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:create-glue-catalog-read-role\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate SIGV4 IAM role with Glue/LF permissions; write ARN to \u003Cem\u003E.aws-config/\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:create-glue-catalog-read-role-dry-run\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint IAM trust and permissions JSON without creating AWS resources\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:apply-glue-catalog-trust-from-rendered\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EApply rendered trust policy to the SIGV4 IAM role\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:describe-catalog-integration\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint catalog integration properties from DESC\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:describe-catalog-integration-json\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESame as describe-catalog-integration with JSON output\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:render-glue-catalog-trust\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWrite rendered trust policy JSON from DESC output\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:render-glue-catalog-trust-dry-run\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint rendered trust JSON without writing to \u003Cem\u003E.aws-config/\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:generate-lab-sql\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWrite 01_catalog_integration and 02_cld_verify generated SQL files\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:generate-lab-sql-stdout\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint catalog and CLD SQL to stdout only\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:generate-lab-sql-all\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWrite all three generated SQL files in one shot\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:print-env-hints\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint Snowflake CLD env defaults and SIGV4 hints\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:sis-deploy\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDeploy the Streamlit in Snowflake app to \u003Cem\u003Eballoon_silver.apps\u003C/em\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:url\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint deployed Streamlit in Snowflake app URL\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:pat-create\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate PAT for duckdb_sa and store in OS keychain\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:pat-print\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint PAT value from keychain to stdout\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Esnowflake:pat-revoke\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERevoke and delete PAT from keychain and Snowflake\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Ch3\u003Edt:* Tasks\u003C/h3\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ETask\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:generate-sql\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWrite 03_dt_pipelines.generated.sql with all five silver DTs\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:generate-sql-stdout\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPrint DT SQL to stdout only\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:extvol-help\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EShow sfutils-extvolumes top-level CLI help\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:extvol-create-help\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EShow sfutils-extvolumes create subcommand help\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:extvol-create-dry-run\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPreview S3/IAM/Snowflake external volume creation without changes\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:extvol-create\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECreate S3 bucket, IAM role/policy, and Snowflake external volume\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:extvol-verify\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EVerify connectivity for an existing Snowflake external volume\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:extvol-describe\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDescribe an existing Snowflake external volume\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:extvol-update-trust\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERe-sync IAM trust policy from Snowflake to the IAM role\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003Edt:extvol-delete\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDrop Snowflake external volume and IAM resources\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EConclusion And Resources\u003C/h2\u003E\n","\u003Cp\u003ECongratulations! You have successfully built an end-to-end Iceberg lakehouse pipeline with AWS and Snowflake.\u003C/p\u003E\n","\u003Cp\u003EStarting from a raw event stream in AWS Glue, you connected Snowflake directly to externally managed Iceberg tables without an ETL copy, layered in Dynamic Iceberg Tables that write silver aggregates back to open Iceberg format, shipped a live Streamlit in Snowflake dashboard, and queried the same silver tables from DuckDB via the Horizon Iceberg REST Catalog &mdash; all while keeping every layer in open format and every file in storage you control.\u003C/p\u003E\n","\u003Ch3\u003EWhat You Learned\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EHow to prepare a bronze Iceberg landing zone in AWS using Glue, S3, and Lake Formation with vended credentials configured for Snowflake\u003C/li\u003E\u003Cli\u003EHow to configure a Snowflake Glue Iceberg REST catalog integration with a two-role Lake Formation setup\u003C/li\u003E\u003Cli\u003EHow to create a catalog-linked database that reflects externally managed Iceberg tables without data duplication\u003C/li\u003E\u003Cli\u003EHow to build Dynamic Iceberg Tables that transform bronze JSON into production-ready silver aggregates on a declared target lag\u003C/li\u003E\u003Cli\u003EHow to make your silver data AI-ready by creating a Semantic View that enables natural-language querying via Snowflake CoWork and Cortex Analyst\u003C/li\u003E\u003Cli\u003EHow to deploy a Streamlit in Snowflake dashboard that reads from silver Dynamic Tables\u003C/li\u003E\u003Cli\u003EHow to query Snowflake-managed Iceberg tables from DuckDB via the Horizon REST Catalog using a Programmatic Access Token\u003C/li\u003E\u003Cli\u003EHow intent-driven development with Snowflake CoCo can replace manual coding workflows &mdash; and how refining prompts iteratively captures reusable engineering specifications\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003ERelated Resources\u003C/h3\u003E\n","\u003Cp\u003EDocumentation:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/tables-iceberg\"\u003ESnowflake Iceberg tables\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/tables-iceberg-configure-catalog-integration-rest-glue\"\u003EConfigure a catalog integration for AWS Glue Iceberg REST\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/tables-iceberg-catalog-linked-database\"\u003EUse a catalog-linked database\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/dynamic-tables-create-iceberg\"\u003ECreate dynamic Apache Iceberg tables\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/views-semantic\"\u003ESemantic Views\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-intelligence\"\u003ESnowflake CoWork\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst\"\u003ECortex Analyst\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/streamlit/getting-started/overview\"\u003EGetting started with Streamlit in Snowflake\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/programmatic-access-tokens\"\u003EProgrammatic Access Tokens\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EAWS Documentation:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://docs.aws.amazon.com/glue/latest/dg/connect-glu-iceberg-rest.html\"\u003EAWS Glue: connect using the Iceberg REST endpoint\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html\"\u003EAWS Lake Formation\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-open-source.html\"\u003ES3 Tables: Iceberg REST endpoint for open-source clients\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EAdditional Reading:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines\"\u003ECompanion repository: sfguide-lakehouse-iceberg-production-pipelines\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://github.com/kameshsampath/hirc-duckdb-demo\"\u003EDuckDB HIRC demo: hirc-duckdb-demo\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/sfutils-extvolumes\"\u003Esfutils-extvolumes\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://iceberg.apache.org/spec/#rest-catalog-api\"\u003EApache Iceberg REST Catalog API spec\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E"],"description":"","title":"Lakehouse Transformations: Build Production Pipelines for your Iceberg Tables","isDeveloperGuidesPage":false,":type":"snowflake-site/components/contentfragment",":items":{},":itemsOrder":[],"elements":{"quickstartArticleBody":{"dataType":"string","title":"Quickstart Article Body","value":"\u003C!-- ------------------------ --\u003E\n## Overview\n\nThis quickstart shows how to build a bronze-to-silver Iceberg pipeline with AWS and Snowflake — without copying data into a second storage system. You prepare a bronze Iceberg landing zone in AWS (Glue catalog, S3 warehouse, and optional S3 Tables), connect Snowflake to the same catalog using Catalog Linked Databases, build Snowflake-managed Dynamic Iceberg Tables that refresh into silver storage you control, and visualize results using Streamlit in Snowflake. A final chapter queries the same silver tables from DuckDB via Snowflake's Horizon Iceberg REST Catalog.\n\nThe guide is bronze-first: each layer is verified before the next one starts, so any failure is easy to isolate.\n\n### What You'll Learn\n\n- How to prepare a bronze layer in AWS using Glue, S3, Lake Formation, and task-driven automation\n- How Snowflake uses a catalog integration and Catalog Linked Databases to query externally managed Iceberg metadata without ETL duplication\n- How Dynamic Iceberg Tables transform bronze JSON into production-ready silver aggregates while preserving Iceberg format and multi-engine access\n- How to make your silver data AI-ready with a Semantic View for natural-language querying via Snowflake CoWork\n- How to build a live Streamlit in Snowflake dashboard over silver Dynamic Tables\n- How to query Snowflake-managed Iceberg tables from DuckDB via the Horizon Iceberg REST Catalog\n\n### What You'll Build\n\nA repeatable lakehouse workflow: bronze Iceberg tables loaded in AWS, consumed and transformed in Snowflake via a Catalog Linked Database and Dynamic Iceberg Tables, surfaced as a Streamlit in Snowflake dashboard, and queried from DuckDB. Every layer is auditable and every file stays in open Iceberg format.\n\n### Prerequisites\n\n- Access to a [Snowflake account](https://signup.snowflake.com/?utm_source=snowflake-devrel&utm_medium=developer-guides&utm_cta=developer-guides)\n- Access to an AWS account with permissions for Glue, S3, Lake Formation, and IAM\n- Local workstation with required CLIs — see **Local Toolchain** in the next section\n- A configured Snowflake CLI connection; verify with **snow connection test** before any **snow sql** steps ([Snowflake CLI installation](https://docs.snowflake.com/developer-guide/snowflake-cli/installation/installation))\n\n\u003C!-- ------------------------ --\u003E\n## Use Case and Architecture\n\n### The Balloon Game\n\nThe lab uses a balloon-popping game as the sample workload. A Python generator simulates players popping balloons of different colors, producing a stream of game events. Each event is a JSON object with these fields:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| **player** | string | Player identifier |\n| **balloon_color** | string | Color of the popped balloon |\n| **score** | integer | Points scored for this pop |\n| **page_id** | string | Game page where the pop occurred |\n| **favorite_color_bonus** | boolean | Whether a scoring bonus was applied |\n| **event_ts** | timestamp | Event time |\n\nEvents land as raw JSON strings in a single **event** column in the bronze Iceberg table **balloon_game_events**. The silver layer uses **PARSE_JSON** to project and aggregate these fields into five production-ready tables.\n\n### Architecture\n\n![Architecture](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/architecture.png?v=5fdfcbf6)\n\n### Lab Layers\n\n| Layer | Technology | What it does |\n|-------|------------|--------------|\n| Bronze | Glue + S3 + PyIceberg | Loads raw game events as Iceberg in AWS |\n| Catalog | Snowflake Catalog Integration | Connects Snowflake to Glue Iceberg REST with SigV4 + LF vended credentials |\n| CLD | Catalog-Linked Database | Mirrors Glue namespaces and tables as Snowflake schemas — no data copy |\n| Silver | Dynamic Iceberg Tables | Transforms JSON bronze into 5 aggregation tables; writes Iceberg back to S3 |\n| AI-Ready | Snowflake CoWork | Semantic View over silver DTs enables natural-language querying via Cortex Analyst |\n| Dashboard | Streamlit in Snowflake | Live dashboard over silver DTs; zero local server |\n| Cross-engine | DuckDB via HIRC | Queries silver Iceberg tables through Snowflake's Horizon REST Catalog |\n\n\u003C!-- ------------------------ --\u003E\n## Tools and Prerequisites\n\n### Clone Repository\n\nThis quickstart's narrative lives on Snowflake Quickstarts; all automation lives in the companion repository. Clone it and use the repo root as your working directory for every **task**, **uv run**, and path reference.\n\n```bash\ngit clone https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines.git\n```\n\n```bash\ncd sfguide-lakehouse-iceberg-production-pipelines\n```\n\nRepository: [Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines)\n\n### Accounts and Permissions\n\n- AWS account with a named profile (**AWS_PROFILE**) that can create and update Glue databases, manage IAM roles, and access S3\n- Snowflake account with **ACCOUNTADMIN** or a role with **CREATE INTEGRATION**, **CREATE DATABASE**, and **CREATE STREAMLIT** privileges\n- Snowflake CLI connection configured for that account — **snow connection list** and **snow connection test** both succeed\n\n### Required Tools\n\nThis repo targets Python 3.12+. **uv** manages the interpreter and all dependencies.\n\n| Tool | Role | macOS | Linux (Debian/Ubuntu) | Windows |\n|------|------|-------|-----------------------|---------|\n| **Git** | Clone the companion repository | *brew install git* | *sudo apt install git* | [Git for Windows](https://git-scm.com/download/win) |\n| **uv** | Python deps and *uv run* entrypoints | *brew install uv* | [Astral installer](https://docs.astral.sh/uv/getting-started/installation/) | [PowerShell installer](https://docs.astral.sh/uv/getting-started/installation/) |\n| **Task** | *task bronze:\\**, *task check-tools* | *brew install go-task* | [Install script](https://taskfile.dev/installation/) | *scoop install task* |\n| **AWS CLI v2** | Glue, S3, STS; S3 Tables needs v2.34+ | *brew install awscli* | [AWS bundled installer](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) | [AWS MSI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) |\n| **Snowflake CLI** | Snowflake steps; also available via *uv sync* | [Snowflake CLI docs](https://docs.snowflake.com/developer-guide/snowflake-cli/installation/installation) | [Snowflake CLI docs](https://docs.snowflake.com/developer-guide/snowflake-cli/installation/installation) | [Snowflake CLI docs](https://docs.snowflake.com/developer-guide/snowflake-cli/installation/installation) |\n| **envsubst** | Renders IAM policy templates (gettext package) | *brew install gettext* | *sudo apt install gettext-base* | WSL2 recommended |\n| **jq** | JSON checks at the shell | *brew install jq* | *sudo apt install jq* | *scoop install jq* |\n\nAfter **uv sync**, use **uv run snow …** from the repo root, or add **.venv/bin** (macOS/Linux) or **.venv\\Scripts** (Windows) to your PATH.\n\n\u003E **Windows note:** If **task check-tools** fails only on **envsubst**, use WSL2 or run **uv run bronze-cli render-iam** (the Python path) instead.\n\n### Recommended Tools\n\n| Tool | Why | macOS | Linux (Debian/Ubuntu) | Windows |\n|------|-----|-------|-----------------------|---------|\n| **direnv** | Auto-loads *.env* when you *cd* into the repo | *brew install direnv* | *sudo apt install direnv* | WSL2 |\n| **curl** | Scripts and health checks | pre-installed | pre-installed | [curl.se](https://curl.se/download.html) |\n| **openssl** | TLS and common crypto one-liners | pre-installed | pre-installed | [OpenSSL binaries](https://wiki.openssl.org/index.php/Binaries) |\n\n### Verify Installation\n\nRun the one-time bootstrap to install Python deps and create **.env** from the template (if it does not exist yet):\n\n```bash\ntask setup\n```\n\nConfigure your AWS profile and run the prerequisite check. The check will report errors for any missing required binaries, provide warnings for recommended (but not required) tools, and use **aws sts get-caller-identity** to validate your AWS session. Address any missing tools or credential issues, then rerun the check until you see **All required tools are available.**\n\n```bash\nexport AWS_PROFILE=your-profile\ntask check-tools\n```\n\n### Environment Inputs\n\n**task setup** copies **.env.example** to **.env** on first run. Edit **.env** and fill in your values.\n\nThe **.env.example** is organized by lab phase. Key sections and variables:\n\n```bash\n# =============================================================\n# Phase 1 — AWS (bronze landing)\n# =============================================================\nAWS_PROFILE=                    # AWS named profile\nAWS_REGION=                     # e.g. us-west-2\n\n# Shared workshop: set this for per-participant bucket/database name derivation.\n# Leave BRONZE_BUCKET_NAME empty when LAB_USERNAME is set.\n# LAB_USERNAME=\n\n# =============================================================\n# Phase 1 — Iceberg warehouse (Glue + PyIceberg)\n# =============================================================\nBRONZE_BUCKET_NAME=             # Globally unique S3 bucket name\n# GLUE_DATABASE=balloon_pops    # Derived from LAB_USERNAME when unset\n# BRONZE_LOAD_DURATION_MINUTES=5\n\n# =============================================================\n# Phase 1 — Amazon S3 Tables (optional, AWS CLI 2.34+)\n# =============================================================\nBRONZE_S3TABLES_BUCKET_NAME=\nS3TABLES_NAMESPACE=balloon_pops\n\n# =============================================================\n# Phase 2 — Snowflake CLI / SQL\n# =============================================================\n# SNOWFLAKE_DEFAULT_CONNECTION_NAME=devrel-ent\n# SNOWFLAKE_ROLE=ACCOUNTADMIN\n# SNOWFLAKE_WAREHOUSE=COMPUTE_WH\n\n# =============================================================\n# Phase 2 — Dynamic Iceberg Tables (task dt:generate-sql)\n# =============================================================\n# SNOWFLAKE_SILVER_DATABASE=balloon_silver\n# SNOWFLAKE_SILVER_SCHEMA=silver\n```\n\n**Key variables:**\n\n| Variable | Phase | Default | Notes |\n|----------|-------|---------|-------|\n| **AWS_PROFILE** | 1 | required | AWS named profile for all bronze tasks |\n| **AWS_REGION** | 1 | required | Keeps all API calls in one region |\n| **LAB_USERNAME** | 1 | none | Workshop shared accounts — drives bucket/database name derivation |\n| **BRONZE_BUCKET_NAME** | 1 | derived | S3 warehouse bucket; *iceberg/* becomes the Glue warehouse URI |\n| **SNOWFLAKE_DEFAULT_CONNECTION_NAME** | 2 | snow default | Override when using a non-default *snow* connection |\n| **SNOWFLAKE_ROLE** | 2 | ACCOUNTADMIN | Role for catalog integration and CLD commands |\n| **SNOWFLAKE_SILVER_DATABASE** | 2 | balloon_silver | Native Snowflake database for DT objects |\n| **SNOWFLAKE_SILVER_SCHEMA** | 2 | silver | Schema for silver Dynamic Iceberg Tables |\n| **SNOWFLAKE_APPS_SCHEMA** | 2 | apps | Schema for Streamlit app deployment (SiS chapter) |\n\n\u003C!-- ------------------------ --\u003E\n## Bronze Landing Zone\n\nThis is the first hands-on chapter. All downstream Snowflake steps assume the bronze Iceberg tables exist in AWS Glue and that the bronze ARNs and Glue metadata are ready.\n\n### Set Up and Load\n\nPreview any setup step without making changes (optional but recommended first):\n\n```bash\ntask bronze:render-iam-dry-run\ntask bronze:glue-setup-dry-run\ntask bronze:s3tables-setup-dry-run\n```\n\nRender the IAM policy template (optional — run first if attaching a new IAM role):\n\n```bash\ntask bronze:render-iam\n```\n\nCreate the Glue database and register the S3 warehouse:\n\n```bash\ntask bronze:glue-setup\n```\n\nProvision the S3 Tables control plane (optional — requires AWS CLI 2.34+):\n\n```bash\ntask bronze:s3tables-setup\n```\n\nLoad sample balloon game events into the Glue Iceberg table:\n\n```bash\ntask bronze:load\n```\n\nOr run all three setup steps and load in one shot:\n\n```bash\ntask bronze:all\n```\n\n### What Gets Created\n\n| Glue database | Table | Schema |\n|---------------|-------|--------|\n| **GLUE_DATABASE** (e.g. *ksampath_balloon_pops*) | **balloon_game_events** | **event** — STRING, one JSON object per row |\n\nEach JSON object contains: **player**, **balloon_color**, **score**, **page_id**, **favorite_color_bonus**, **event_ts**. Snowflake Dynamic Iceberg Tables use **PARSE_JSON** and variant paths to project these fields into typed columns.\n\nPrint a copy-paste sheet of ARNs and exports needed for Snowflake catalog integration SQL:\n\n```bash\ntask bronze:snowflake-summary\n```\n\n### Lake Formation Setup\n\nAfter **task bronze:load** and after completing step 1 of the Snowflake CLD chapter (**task snowflake:create-glue-catalog-read-role**), configure Lake Formation for vended credentials.\n\nPreview the Lake Formation setup without any AWS writes:\n\n```bash\ntask bronze:lakeformation-setup-dry-run\n```\n\nApply Lake Formation grants:\n\n```bash\ntask bronze:lakeformation-setup\n```\n\nThis step registers **BRONZE_BUCKET_NAME** with Lake Formation using a dedicated data-access IAM role (**HybridAccessEnabled=false**, **WithFederation=false**), clears the default Glue IAM-only table permissions on **GLUE_DATABASE**, and grants **SELECT** and **DESCRIBE** to your Snowflake SIGV4 role.\n\n**Keep the SIGV4 and LF data-access roles separate.** Using the same role causes credential vending errors — see the Troubleshooting chapter for error code **094120**.\n\n### Verify in AWS Console\n\nUse the same AWS account and **AWS_REGION** as your CLI profile.\n\n**Glue Data Catalog:**\n\n1. Open **Glue** → **Data catalog** → **Databases** and confirm **GLUE_DATABASE** exists.\n2. Open that database → **Tables** → confirm **balloon_game_events** is listed.\n3. Open **balloon_game_events** and confirm **Apache Iceberg** as the table format.\n\n![Glue Data Catalog — databases including GLUE_DATABASE](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/bronze-glue-databases.png?v=5fdfcbf6)\n\n![Glue — database details showing Location URI](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/bronze-glue-database-detail.png?v=5fdfcbf6)\n\n![Glue — tables list showing balloon_game_events](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/bronze-glue-tables-list.png?v=5fdfcbf6)\n\n![Glue — Iceberg table detail for balloon_game_events](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/bronze-glue-table-iceberg-detail.png?v=5fdfcbf6)\n\n**S3 Warehouse:**\n\n1. Open **S3** → **Buckets** → **BRONZE_BUCKET_NAME**.\n2. Open the **iceberg/** prefix — expect **metadata/** and **data/** style keys after load.\n\n**S3 Tables (optional):**\n\nOpen **S3 Tables** → **Table buckets** and confirm **BRONZE_S3TABLES_BUCKET_NAME** appears.\n\n### Optional: Query in Athena\n\nUse data source **AwsDataCatalog**, database **GLUE_DATABASE**, and table **balloon_game_events**. Do **not** select the **s3tables/\\\u003Ctable-bucket\\\u003E** federated catalog entry — that path is an empty shell until a separate writer commits metadata.\n\n\u003C!-- ------------------------ --\u003E\n## Snowflake Catalog Linked Database (CLD)\n\nThis chapter creates the Glue Iceberg REST catalog integration, tightens IAM trust, creates the catalog linked database (CLD), and runs discovery and read queries against **balloon_game_events**.\n\n**Before starting:**\n\n- Bronze tables are loaded; **.aws-config/glue-database.json** was written by **task bronze:glue-setup**\n- **snow connection test** succeeds\n- Lake Formation is configured for **VENDED_CREDENTIALS** (see **Lake Formation Setup** in the Bronze chapter)\n\n### Easy Path — Interactive Notebook\n\nOpen [cld_lab_guide.ipynb](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/cld_lab_guide.ipynb) in Snowflake Notebooks for an interactive walkthrough. The notebook uses:\n\n- **`ENABLED = FALSE`** on the catalog integration to break the IAM chicken-egg dependency — trust policy values are generated without connecting to Glue\n- A companion **CloudFormation template** ([cfn-snowflake-cld.yaml](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/cfn-snowflake-cld.yaml)) that deploys all IAM roles, Lake Formation registration, and permissions in a single stack\n- **Snowflake CoCo prompts** embedded in each step — use Cmd+K or the chat sidebar to generate SQL and CLI commands from natural language\n- **`SYSTEM$VERIFY_CATALOG_INTEGRATION`** to validate connectivity before creating the CLD\n\nFollow the **Detailed Path** below for step-by-step shell commands.\n\n### Detailed Path\n\n\u003E **Role requirement:** The commands in this chapter require **ACCOUNTADMIN** or a role with **CREATE INTEGRATION**, **CREATE DATABASE**, and **GRANT** privileges. The lab defaults to **SNOWFLAKE_ROLE** = **ACCOUNTADMIN** set in **.env**. Confirm this before running any **snow sql** commands.\n\n#### Create IAM Role\n\nCreate the Snowflake SIGV4 IAM role that Snowflake uses to sign Glue REST requests:\n\n```bash\ntask snowflake:create-glue-catalog-read-role\n```\n\nThis writes the IAM role ARN to **.aws-config/snowflake-glue-catalog-iam-role-arn.txt**. All subsequent lab tools read it automatically — no env var override needed.\n\nAfter this step, return to the Bronze chapter and run **task bronze:lakeformation-setup** to grant the SIGV4 role access via Lake Formation before proceeding.\n\n\u003E **Notebook path (CloudFormation):** The interactive notebook uses a single CloudFormation template instead of individual **task** commands for IAM and Lake Formation setup. It creates the catalog integration as **ENABLED = FALSE** first, extracts trust values from **DESC INTEGRATION**, and passes them as stack parameters — eliminating the manual trust-render-apply cycle. See the notebook for details.\n\n#### Generate SQL\n\nGenerate runnable SQL from your **.aws-config/** artifacts:\n\n```bash\ntask snowflake:generate-lab-sql\n```\n\nThis writes two files to **snowflake/lab/generated/**:\n\n- **01_catalog_integration.generated.sql** — CREATE CATALOG INTEGRATION\n- **02_cld_verify.generated.sql** — CREATE DATABASE + SHOW + SELECT\n\nTo preview the SQL without writing files:\n\n```bash\ntask snowflake:generate-lab-sql-stdout\n```\n\n#### Create Catalog Integration\n\nApply the generated catalog integration SQL:\n\n```bash\nsnow sql --filename snowflake/lab/generated/01_catalog_integration.generated.sql\n```\n\nThe generated SQL creates **glue_rest_catalog_int** (default name) with these settings:\n\n- **CATALOG_SOURCE = ICEBERG_REST**, **TABLE_FORMAT = ICEBERG**\n- **CATALOG_URI** = https://glue.\\\u003Cregion\\\u003E.amazonaws.com/iceberg\n- **CATALOG_API_TYPE = AWS_GLUE**, **ACCESS_DELEGATION_MODE = VENDED_CREDENTIALS**\n- **CATALOG_NAME** = your 12-digit AWS account ID (Glue Data Catalog default)\n- **CATALOG_NAMESPACE** = **GLUE_DATABASE**\n- **SIGV4_IAM_ROLE** = ARN from **.aws-config/snowflake-glue-catalog-iam-role-arn.txt**\n\n\u003E **Tip: Breaking the chicken-egg dependency.** The notebook creates the catalog integration with **ENABLED = FALSE**. This generates **API_AWS_IAM_USER_ARN** and **API_AWS_EXTERNAL_ID** immediately without requiring the IAM role to exist yet. After deploying the CloudFormation stack with the real trust values, the integration is enabled via **ALTER CATALOG INTEGRATION … SET ENABLED = TRUE**. This avoids a two-pass trust policy update.\n\n#### Describe and Capture Trust Fields\n\nPrint catalog integration properties including the Snowflake-generated trust fields:\n\n```bash\ntask snowflake:describe-catalog-integration\n```\n\nOr run the SQL directly:\n\n```sql\nDESC CATALOG INTEGRATION glue_rest_catalog_int;\n```\n\nNote **API_AWS_IAM_USER_ARN** and **API_AWS_EXTERNAL_ID** from the output — these are needed to tighten the trust policy on the SIGV4 IAM role.\n\n#### Apply IAM Trust\n\nRender the trust document using the **DESC** output:\n\n```bash\ntask snowflake:render-glue-catalog-trust\n```\n\nApply the rendered trust policy to the SIGV4 IAM role:\n\n```bash\ntask snowflake:apply-glue-catalog-trust-from-rendered\n```\n\nThis updates the IAM role's trust policy to scope access to Snowflake's specific IAM user ARN and external ID. Alternatively, paste the rendered JSON from **.aws-config/snowflake-glue-catalog-trust-policy.rendered.json** directly in the IAM console under **Trust relationships**.\n\n#### Verify Catalog Integration\n\nAfter applying the trust policy, verify the integration can connect to Glue:\n\n```sql\nSELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('glue_rest_catalog_int');\n```\n\nExpect `\"success\": true` in the JSON response. If it fails, check that the trust policy values match **DESC INTEGRATION** output exactly and that IAM propagation is complete (up to 30 seconds).\n\n#### Create Catalog-Linked Database\n\nApply the generated CLD and verify script:\n\n```bash\nsnow sql --filename snowflake/lab/generated/02_cld_verify.generated.sql\n```\n\nThis creates **balloon_game_events** as a Catalog-Linked Database and runs initial discovery. To create it manually instead:\n\n```sql\nCREATE OR REPLACE DATABASE balloon_game_events\n  COMMENT = 'CLD: Glue bronze Iceberg'\n  LINKED_CATALOG = (\n    CATALOG = 'glue_rest_catalog_int'\n  );\n```\n\n\u003E **Note:** Any change to Lake Formation permissions or IAM trust after a link failure requires re-creating the CLD. After fixing the LF/IAM settings, re-run **CREATE OR REPLACE DATABASE … LINKED_CATALOG = (…)** and re-apply **GRANT USAGE ON INTEGRATION glue_rest_catalog_int TO ROLE \\\u003Cyour_role\\\u003E**. See *Privileges Lost After CLD Recreate* in Troubleshooting.\n\nOptional status checks:\n\n```sql\nSELECT SYSTEM$CATALOG_LINK_STATUS('balloon_game_events');\n```\n\n```sql\nSELECT SYSTEM$GET_CATALOG_LINKED_DATABASE_CONFIG('balloon_game_events');\n```\n\n#### Discover and Query\n\nList remote namespaces discovered from Glue:\n\n```sql\nSHOW SCHEMAS IN DATABASE balloon_game_events;\n```\n\nList Iceberg tables in the discovered namespace:\n\n```sql\n-- Replace \u003Cremote_schema\u003E with your GLUE_DATABASE name in lowercase\nSHOW ICEBERG TABLES IN SCHEMA balloon_game_events.\"\u003Cremote_schema\u003E\";\n```\n\nRead raw events and project fields using **PARSE_JSON**:\n\n```sql\nSELECT\n  PARSE_JSON(event):player::STRING         AS player,\n  PARSE_JSON(event):balloon_color::STRING  AS balloon_color,\n  PARSE_JSON(event):score::INTEGER         AS score,\n  PARSE_JSON(event):event_ts::TIMESTAMP_TZ AS event_ts\nFROM balloon_game_events.\"\u003Cremote_schema\u003E\".\"balloon_game_events\"\nLIMIT 10;\n```\n\n#### Lake Formation Console Checks\n\n\u003E **When to check:** Run these checks only if **SYSTEM$CATALOG_LINK_STATUS('balloon_game_events')** reports failures. A healthy link returns:\n\u003E ```json\n\u003E {\"failureDetails\":[],\"executionState\":\"RUNNING\",\"lastLinkAttemptStartTime\":\"...\"}\n\u003E ```\n\nIf **task bronze:lakeformation-setup** ran successfully, skip this. Otherwise verify these four settings manually.\n\n\u003E **Notebook users:** The interactive notebook includes the same four checks with annotated screenshots in **Step 2c: Verify Lake Formation Settings**.\n\n**1. Database mode:**\n\nOpen **Lake Formation** → **Data catalog** → **Databases** → open **GLUE_DATABASE** → **Edit**. Confirm **Use only IAM access control for new tables** is unchecked.\n\n![Lake Formation — edit database, Lake Formation mode for new tables](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/aws_lf_database_settings.png?v=5fdfcbf6)\n\n**2. Data lake location:**\n\nOpen **Permissions** → **Data lake locations**. Confirm **s3://\\\u003CBRONZE_BUCKET_NAME\\\u003E/iceberg/** is registered with **HybridAccessEnabled=false** and **WithFederation=false** using a dedicated LF data-access role that is **different** from the SIGV4 role.\n\n![Lake Formation — data lake storage settings](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/aws_lf_data_lake_settings.png?v=5fdfcbf6)\n\n**3. Data permissions:**\n\nOpen **Permissions** → **Data permissions**. Confirm the SIGV4 role has **DESCRIBE** on the database and **SELECT**, **DESCRIBE** on the table wildcard.\n\n![Lake Formation — data permissions for the Snowflake catalog role](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/aws_lf_data_permissions.png?v=5fdfcbf6)\n\n**4. Application integration settings:**\n\nOpen **Lake Formation** → **Administration** → **Application integration settings**. Confirm **Allow external engines to access data in Amazon S3 locations with full table access** is enabled. This setting is mandatory for Snowflake's vended-credentials flow — without it, Lake Formation will not issue temporary credentials to the SIGV4 role.\n\n![Lake Formation — application integration settings](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/lakehouse-iceberg-production-pipelines/aws-lf-app-int-settings.png?v=5fdfcbf6)\n\n#### Full Reference Sequence\n\nEnd-to-end Snowflake command sequence (assumes tools verified and bronze loaded):\n\n| Command | What it does |\n|---------|-------------|\n| **task bronze:snowflake-summary** | Print bucket/DB/ARNs needed for Snowflake catalog SQL |\n| **task snowflake:create-glue-catalog-read-role** | Create SIGV4 IAM role; write ARN to **.aws-config/** |\n| *(return to Bronze)* **task bronze:lakeformation-setup** | Grant SIGV4 role access via Lake Formation |\n| **task snowflake:generate-lab-sql** | Generate **01_catalog_integration** and **02_cld_verify** SQL |\n| **snow sql --filename snowflake/lab/generated/01_catalog_integration.generated.sql** | Create the catalog integration in Snowflake |\n| **task snowflake:describe-catalog-integration** | Print trust fields (API_AWS_IAM_USER_ARN + external ID) |\n| **task snowflake:render-glue-catalog-trust** | Render trust JSON using those fields |\n| **task snowflake:apply-glue-catalog-trust-from-rendered** | Apply rendered trust to SIGV4 IAM role |\n| **SELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('glue_rest_catalog_int')** | Verify integration connects to Glue (expect `\"success\": true`) |\n| **snow sql --filename snowflake/lab/generated/02_cld_verify.generated.sql** | Create CLD and run discovery queries |\n\n\u003E **Notebook alternative (ENABLED=FALSE flow):**\n\u003E\n\u003E | Step | Command | What it does |\n\u003E |------|---------|-------------|\n\u003E | 2a | **CREATE CATALOG INTEGRATION … ENABLED = FALSE** | Generate trust values without connecting to Glue |\n\u003E | 2b | **DESC INTEGRATION** → **aws cloudformation deploy** | Extract trust values and deploy IAM + LF via CFN |\n\u003E | 2c | Verify Lake Formation settings in AWS Console | Confirm CFN deployed correctly |\n\u003E | 2d | **ALTER CATALOG INTEGRATION … SET ENABLED = TRUE** | Enable and verify with **SYSTEM$VERIFY_CATALOG_INTEGRATION** |\n\n\u003C!-- ------------------------ --\u003E\n## Dynamic Iceberg Tables\n\nWith bronze readable through the CLD, add [Dynamic Iceberg Tables](https://docs.snowflake.com/en/user-guide/dynamic-tables-create-iceberg) that write silver Iceberg data. It uses [Snowflake Managed Storage](https://docs.snowflake.com/en/user-guide/tables-iceberg-internal-storage) for Iceberg. The silver pipeline frequency is controlled on a declared **TARGET_LAG**. Five aggregation tables refresh automatically and remain readable by any Iceberg-compatible engine.\n\n### Five Silver Tables\n\n| Table | What it aggregates |\n|-------|--------------------|\n| **dt_player_leaderboard** | Per-player total score, bonus pops, last event |\n| **dt_balloon_color_stats** | Per-player, per-color breakdown (pops, points, bonuses) |\n| **dt_realtime_scores** | 15-second windowed scores per player |\n| **dt_balloon_colored_pops** | 15-second windows by player and balloon color |\n| **dt_color_performance_trends** | Average score per pop by color over 15-second windows |\n\n### Easy Path — Interactive Notebook\n\nOpen [dt_lab_guide.ipynb](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/dt_lab_guide.ipynb) in Snowflake Notebooks for an interactive walkthrough. The notebook builds on the CLD Lab Guide and includes:\n\n- **CLD recap** — summarizes what was built in the previous chapter before diving into silver\n- **\"Why Dynamic Iceberg Tables?\"** — callout explaining DIT vs regular Dynamic Tables, TARGET_LAG, and Iceberg interoperability\n- **Snowflake CoCo prompts** — generate the first DT SQL via Cmd+K, check refresh status via chat, and explore silver data with intent-driven prompts\n- **Teachable moment** — the Snowflake CoCo prompt for `dt_player_leaderboard` may generate `TIMESTAMP_TZ`, which Iceberg doesn't support — workshoppers debug and fix it live\n- **\"What Just Happened?\"** — architecture summary of the bronze→silver pipeline\n- **Cleanup** — single `DROP DATABASE` to tear down all DTs\n\nUse the **Detailed Path** below for step-by-step shell commands.\n\n### Detailed Path\n\n#### Configure Environment\n\nSet these variables in **.env** before generating SQL:\n\n| Variable | Default | Notes |\n|----------|---------|-------|\n| **SNOWFLAKE_SILVER_DATABASE** | *balloon_silver* | Native Snowflake database for DT objects |\n| **SNOWFLAKE_SILVER_SCHEMA** | *silver* | Schema for all silver DTs |\n| **SNOWFLAKE_WAREHOUSE** | *COMPUTE_WH* | Warehouse for DT refresh compute |\n\nPrint current environment hints:\n\n```bash\ntask snowflake:print-env-hints\n```\n\n\u003E Dynamic Iceberg Tables use Snowflake Managed Storage — no external volume setup is required.\n\n\u003E **Iceberg type limitation:** Iceberg tables do not support `TIMESTAMP_TZ`. Use `TIMESTAMP_LTZ` (maps to Iceberg `timestamptz`) or `TIMESTAMP_NTZ` (maps to Iceberg `timestamp`). If generated SQL uses `TIMESTAMP_TZ`, change it to `TIMESTAMP_LTZ(6)` or `TIMESTAMP_NTZ`.\n\n#### Generate and Apply DT SQL\n\nGenerate the silver DT SQL from your env and **.aws-config/** artifacts:\n\n```bash\ntask dt:generate-sql\n```\n\nThis writes **snowflake/lab/generated/03_dt_pipelines.generated.sql**.\n\nApply the generated SQL:\n\n```bash\nsnow sql --filename snowflake/lab/generated/03_dt_pipelines.generated.sql\n```\n\nThe unedited scaffold for manual editing lives at **snowflake/lab/03_dt_pipelines.sql**.\n\n#### Verify\n\nCheck DT status after creation:\n\n```sql\nUSE DATABASE balloon_silver;\nUSE SCHEMA silver;\nSHOW DYNAMIC TABLES LIKE 'dt_%' IN SCHEMA;\n```\n\nWait for an initial refresh (check Snowsight → **Data** → **Dynamic Tables**, or inspect **SCHEDULING_STATE** in the **SHOW** output), then query:\n\n```sql\n-- Top players by score\nSELECT player, total_score, bonus_pops, last_event_ts\nFROM balloon_silver.silver.dt_player_leaderboard\nORDER BY total_score DESC NULLS LAST\nLIMIT 15;\n```\n\n```sql\n-- 15-second windowed scores\nSELECT player, total_score, window_start, window_end\nFROM balloon_silver.silver.dt_realtime_scores\nORDER BY window_start DESC, player\nLIMIT 20;\n```\n\nRun all verification queries at once:\n\n```bash\nsnow sql --filename snowflake/lab/04_dt_verify_sample_queries.sql\n```\n\n#### Quick Teardown\n\nTo remove all silver DTs and their refresh schedules:\n\n```sql\nDROP DATABASE IF EXISTS balloon_silver;\n```\n\nDT refreshes stop automatically when the database is dropped. The external volume and S3 data are **not** deleted — remove those separately if needed.\n\n\u003C!-- ------------------------ --\u003E\n## Snowflake CoWork\n\nYour silver Dynamic Iceberg Tables are now **AI-ready**. By creating a [Semantic View](https://docs.snowflake.com/en/user-guide/views-semantic) over the five silver tables, you enable natural-language querying via [Snowflake CoWork](https://docs.snowflake.com/en/user-guide/snowflake-intelligence) and the [Cortex Analyst](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst) API — no additional ETL, no model training, no external tools.\n\nA Semantic View defines the business meaning of your tables, columns, and metrics in YAML. Once created, users (and AI agents) can ask questions like:\n\n- *\"Who is the top-scoring player?\"*\n- *\"Which balloon color gives the highest average points?\"*\n- *\"Show me score trends over the last hour\"*\n\n…and get accurate SQL-backed answers grounded in your silver data.\n\n### Easy Path — Interactive Notebook\n\nOpen [si_lab_guide.ipynb](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/si_lab_guide.ipynb) in Snowflake Notebooks for a guided walkthrough. The notebook uses the same environment variables as the DT Lab Guide and includes a **Snowflake CoCo prompt** to auto-generate the Semantic View, plus step-by-step instructions for configuring the Intelligence agent.\n\n### Detailed Path\n\n#### Create the Semantic View\n\nCreate a Semantic View that describes all five silver tables with their business context. Replace **balloon_silver** with your **SNOWFLAKE_SILVER_DATABASE** if different:\n\n```sql\nCREATE OR REPLACE SEMANTIC VIEW summit26_ar103_balloon_silver.silver.balloon_game_semantic_view\n\n  TABLES (\n    player_leaderboard AS summit26_ar103_balloon_silver.silver.dt_player_leaderboard\n      PRIMARY KEY (player)\n      WITH SYNONYMS ('leaderboard', 'rankings', 'top players')\n      COMMENT = 'Aggregated player scores: total score, bonus pops, last event timestamp per player',\n\n    color_stats AS summit26_ar103_balloon_silver.silver.dt_balloon_color_stats\n      UNIQUE (player, balloon_color)\n      WITH SYNONYMS ('color breakdown', 'player colors', 'color scores')\n      COMMENT = 'Per-player breakdown by balloon color: pops, points, and bonus hits',\n\n    realtime_scores AS summit26_ar103_balloon_silver.silver.dt_realtime_scores\n      WITH SYNONYMS ('live scores', 'recent scores', 'hot streaks')\n      COMMENT = '15-second windowed score totals per player for time-series analysis',\n\n    colored_pops AS summit26_ar103_balloon_silver.silver.dt_balloon_colored_pops\n      WITH SYNONYMS ('detailed pops', 'player color windows')\n      COMMENT = 'Most granular view: per-player, per-color pops in 15-second time windows',\n\n    color_trends AS summit26_ar103_balloon_silver.silver.dt_color_performance_trends\n      WITH SYNONYMS ('color trends', 'color performance', 'best colors')\n      COMMENT = 'Average score per pop and total pops by balloon color over 15-second windows'\n  )\n\n  RELATIONSHIPS (\n    color_stats_to_leaderboard AS\n      color_stats (player) REFERENCES player_leaderboard,\n    realtime_to_leaderboard AS\n      realtime_scores (player) REFERENCES player_leaderboard,\n    colored_pops_to_leaderboard AS\n      colored_pops (player) REFERENCES player_leaderboard,\n    colored_pops_to_color_stats AS\n      colored_pops (player, balloon_color) REFERENCES color_stats\n  )\n\n  FACTS (\n    player_leaderboard.total_score AS player_leaderboard.total_score\n      WITH SYNONYMS = ('total score', 'overall score', 'total points')\n      COMMENT = 'Cumulative score across all balloon pops',\n    player_leaderboard.bonus_pops AS player_leaderboard.bonus_pops\n      WITH SYNONYMS = ('bonus pops', 'bonuses', 'bonus count')\n      COMMENT = 'Number of pops where player hit their favorite color',\n    color_stats.balloon_pops AS color_stats.balloon_pops\n      WITH SYNONYMS = ('pops', 'pop count', 'times popped')\n      COMMENT = 'Number of times this player popped this color',\n    color_stats.points_by_color AS color_stats.points_by_color\n      WITH SYNONYMS = ('points by color', 'color points', 'color score')\n      COMMENT = 'Total points earned from popping this color',\n    color_stats.bonus_hits AS color_stats.bonus_hits\n      WITH SYNONYMS = ('bonus hits', 'color bonuses')\n      COMMENT = 'Number of favorite-color bonus pops for this color',\n    realtime_scores.window_score AS realtime_scores.total_score\n      WITH SYNONYMS = ('window score', 'live score', 'current score')\n      COMMENT = 'Sum of scores within the 15-second window',\n    colored_pops.window_pops AS colored_pops.balloon_pops\n      COMMENT = 'Pop count for this player+color in this window',\n    colored_pops.window_points AS colored_pops.points_by_color\n      COMMENT = 'Points for this player+color in this window',\n    colored_pops.window_bonus AS colored_pops.bonus_hits\n      COMMENT = 'Bonus pops for this player+color in this window',\n    color_trends.avg_score_per_pop AS color_trends.avg_score_per_pop\n      WITH SYNONYMS = ('efficiency', 'points per pop', 'scoring rate', 'best value')\n      COMMENT = 'Average points earned per pop of this color in this window',\n    color_trends.total_pops AS color_trends.total_pops\n      WITH SYNONYMS = ('volume', 'popularity', 'total pops')\n      COMMENT = 'Total pops of this color in this window'\n  )\n\n  DIMENSIONS (\n    player_leaderboard.player_name AS player_leaderboard.player\n      WITH SYNONYMS = ('player', 'gamer', 'username', 'who')\n      COMMENT = 'Unique player identifier',\n    player_leaderboard.last_active AS player_leaderboard.last_event_ts\n      WITH SYNONYMS = ('last active', 'last seen', 'last played')\n      COMMENT = 'Timestamp of the most recent game event for this player',\n    color_stats.cs_player AS color_stats.player\n      COMMENT = 'Player identifier in color stats',\n    color_stats.color AS color_stats.balloon_color\n      WITH SYNONYMS = ('balloon color', 'color', 'balloon type')\n      COMMENT = 'Color of the balloon (red, blue, green, yellow, etc.)',\n    color_stats.cs_last_event AS color_stats.last_event_ts\n      COMMENT = 'Most recent pop of this color by this player',\n    realtime_scores.rs_player AS realtime_scores.player\n      COMMENT = 'Player identifier in realtime scores',\n    realtime_scores.window_start AS realtime_scores.window_start\n      WITH SYNONYMS = ('start time', 'window start')\n      COMMENT = 'Start of the 15-second time window',\n    realtime_scores.window_end AS realtime_scores.window_end\n      WITH SYNONYMS = ('end time', 'window end')\n      COMMENT = 'End of the 15-second time window',\n    colored_pops.cp_player AS colored_pops.player\n      COMMENT = 'Player identifier in colored pops',\n    colored_pops.cp_color AS colored_pops.balloon_color\n      COMMENT = 'Balloon color in the detailed window view',\n    colored_pops.cp_window_start AS colored_pops.window_start\n      COMMENT = 'Start of the time window',\n    colored_pops.cp_window_end AS colored_pops.window_end\n      COMMENT = 'End of the time window',\n    color_trends.ct_color AS color_trends.balloon_color\n      WITH SYNONYMS = ('trending color', 'color trend')\n      COMMENT = 'Balloon color for performance trend analysis',\n    color_trends.ct_window_start AS color_trends.window_start\n      COMMENT = 'Start of the trend analysis window',\n    color_trends.ct_window_end AS color_trends.window_end\n      COMMENT = 'End of the trend analysis window'\n  )\n\n  METRICS (\n    player_leaderboard.m_total_score AS SUM(player_leaderboard.total_score)\n      WITH SYNONYMS = ('total points', 'combined score')\n      COMMENT = 'Total cumulative score across all players',\n    player_leaderboard.m_total_bonus_pops AS SUM(player_leaderboard.bonus_pops)\n      WITH SYNONYMS = ('bonus total', 'all bonuses')\n      COMMENT = 'Total bonus pops across all players',\n    player_leaderboard.m_player_count AS COUNT(player_leaderboard.player)\n      WITH SYNONYMS = ('number of players', 'how many players')\n      COMMENT = 'Count of players on the leaderboard',\n    color_stats.m_total_pops_by_color AS SUM(color_stats.balloon_pops)\n      WITH SYNONYMS = ('total balloon pops', 'all pops')\n      COMMENT = 'Total balloon pops aggregated across players for a given color',\n    color_stats.m_total_points_by_color AS SUM(color_stats.points_by_color)\n      WITH SYNONYMS = ('color points total', 'total color points')\n      COMMENT = 'Total points aggregated across players for a given color',\n    color_stats.m_avg_points_per_pop AS AVG(color_stats.points_by_color / NULLIF(color_stats.balloon_pops, 0))\n      WITH SYNONYMS = ('efficiency', 'scoring rate', 'points per pop')\n      COMMENT = 'Average points per pop across colors',\n    realtime_scores.m_max_window_score AS MAX(realtime_scores.window_score)\n      WITH SYNONYMS = ('best window', 'peak score', 'hottest moment')\n      COMMENT = 'Highest score in any single 15-second window',\n    realtime_scores.m_avg_window_score AS AVG(realtime_scores.window_score)\n      WITH SYNONYMS = ('average window score', 'typical window')\n      COMMENT = 'Average score per 15-second window',\n    color_trends.m_avg_efficiency AS AVG(color_trends.avg_score_per_pop)\n      WITH SYNONYMS = ('trend efficiency', 'color efficiency')\n      COMMENT = 'Weighted average score per pop across time windows',\n    color_trends.m_total_pops AS SUM(color_trends.total_pops)\n      WITH SYNONYMS = ('color popularity', 'total color pops')\n      COMMENT = 'Total balloon pops across all colors and time windows'\n  )\n\n  COMMENT = 'AI-ready semantic layer over balloon game silver Dynamic Iceberg Tables'\n\n  AI_SQL_GENERATION 'This is a balloon popping game. Players pop colored balloons to earn points. Some pops are bonus pops worth extra. The leaderboard has overall rankings by total_score. Color stats show which colors each player pops most and points per color. Realtime scores show 15-second windows of activity. Color trends show which balloon colors give the best points-per-pop over time. When asked about the top player, use the leaderboard total_score. When asked which color scores best, use color_trends avg_score_per_pop. When asked who is hot right now, use realtime_scores with the most recent window_start.';\n```\n\n#### Verify the Semantic View\n\nCheck the view was created and inspect its structure:\n\n```sql\nSHOW SEMANTIC VIEWS IN SCHEMA balloon_silver.silver;\n```\n\n```sql\nDESC SEMANTIC VIEW balloon_silver.silver.balloon_game_semantic_view;\n```\n\n#### Configure Snowflake CoWork with the Semantic View\n\nWith the Semantic View created, set up a Snowflake CoWork **agent** that uses it as a tool for natural-language querying. This follows the same pattern as the official [Getting Started with Snowflake CoWork](https://www.snowflake.com/en/developers/guides/getting-started-with-snowflake-intelligence/) guide — but since we already have a Semantic View (not a YAML file), setup is simpler.\n\n##### Required Privileges\n\nLab users running as **ACCOUNTADMIN** already have the necessary permissions — no additional grants are needed. ACCOUNTADMIN inherits all privileges including Cortex AI access and ownership of objects you create.\n\n\u003E **Production note:** In a production environment, you would grant `SNOWFLAKE.CORTEX_USER` and `REFERENCES` + `SELECT` on the Semantic View to consumer roles:\n\u003E ```sql\n\u003E GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE \u003Cconsumer_role\u003E;\n\u003E GRANT REFERENCES, SELECT ON SEMANTIC VIEW balloon_silver.silver.balloon_game_semantic_view\n\u003E   TO ROLE \u003Cconsumer_role\u003E;\n\u003E ```\n\n##### Create the Agent\n\n**1. Navigate to the Agent admin page** — In Snowsight, go to **AI & ML → Agents**. Confirm your role is set to **ACCOUNTADMIN** (top-right role selector).\n\n**2. Create a new agent:**\n\n- Click **+ Create agent**\n- **Agent object name:** `balloon_game_agent` (internal identifier)\n- **Display name:** `Balloon Game Analytics` (shown to users in the chat UI)\n- **Description:** *\"Ask questions about balloon game player scores, color stats, and performance trends from the silver lakehouse tables.\"*\n- Click **Create agent**\n\n**3. Add the Cortex Analyst tool (Semantic View):**\n\n- Select the **Tools** tab in the agent editor\n- Find **Cortex Analyst** and click **+ Add**\n- Choose **Semantic View** (not \"Semantic model file\" — we already have a view, not a YAML on a stage)\n- Select database: `balloon_silver`, schema: `silver`, view: `balloon_game_semantic_view`\n- For **Description**, click **Generate with Cortex** to auto-generate a tool description from your semantic metadata — or write your own, e.g.: *\"Queries structured balloon game data including player leaderboards, color stats, real-time scores, and performance trends. Use for any question about players, scores, colors, or time-based patterns.\"*\n- Set the **Warehouse** to your lab warehouse (e.g. `KAMESH_DEMOS_S` or your assigned warehouse)\n\n**4. (Optional) Add the Email tool:**\n\nIf you want the agent to send query results or insights via email (e.g. *\"Email me the top 5 players leaderboard\"*), first create the notification integration and stored procedure in your silver database:\n\n```sql\n-- Notification integration for email delivery\nCREATE OR REPLACE NOTIFICATION INTEGRATION email_integration\n  TYPE = EMAIL\n  ENABLED = TRUE\n  DEFAULT_SUBJECT = 'Balloon Game Analytics';\n\n-- Stored procedure that the agent calls to send emails\nCREATE OR REPLACE PROCEDURE balloon_silver.silver.send_email(\n    recipient_email VARCHAR,\n    subject VARCHAR,\n    body VARCHAR\n)\nRETURNS VARCHAR\nLANGUAGE SQL\nAS\nBEGIN\n    CALL SYSTEM$SEND_EMAIL(\n        'email_integration',\n        :recipient_email,\n        :subject,\n        :body,\n        'text/html'\n    );\n    RETURN 'Email sent successfully to ' || :recipient_email;\nEND;\n\n-- Grant execute to your role (ACCOUNTADMIN already has it)\nGRANT USAGE ON PROCEDURE balloon_silver.silver.send_email(VARCHAR, VARCHAR, VARCHAR)\n  TO ROLE ACCOUNTADMIN;\n```\n\n\u003E **Source:** Adapted from the [official Snowflake CoWork setup](https://github.com/Snowflake-Labs/sfguide-getting-started-with-snowflake-intelligence/blob/main/setup.sql#L160-L210).\n\nThen, in the agent editor:\n\n- In the **Tools** tab, find **Custom Tools** and click **+ Add**\n- Select database: `balloon_silver`, schema: `silver`, procedure: `send_email`\n- Configure parameter descriptions (these guide the agent on how to use the tool):\n  - **recipient_email:** *\"If the email is not provided, send it to the current user's email address.\"*\n  - **subject:** *\"If subject is not provided, use 'Balloon Game Analytics'.\"*\n  - **body:** *\"If body is not provided, summarize the last question and use that as content for the email.\"*\n- The agent can now send results via email when prompted\n\n\u003E **Note:** The Email tool is optional for this lab. Skip it if you only want to explore data interactively. Your Snowflake user must have a verified email address for delivery to work.\n\n**5. Add sample questions (recommended):**\n\n- Select the **Voice** tab (or **Instructions** tab depending on your Snowsight version)\n- Under **Sample questions**, add examples that help users get started:\n  - *\"Who are the top 5 players by total score?\"*\n  - *\"Which balloon color gives the best average points per pop?\"*\n  - *\"Show me score trends over the last few time windows\"*\n  - *\"How many total bonus pops have all players earned?\"*\n  - *\"Email me a summary of the top 3 players\"*\n\n**6. Set orchestration instructions:**\n\n- In the **Instructions** section, add the following orchestration instruction:\n  - *\"Whenever you can answer visually with a chart, always choose to generate a chart even if the user didn't specify to.\"*\n\n**7. Save the agent** — Click **Save** in the top-right corner. The agent is now live.\n\n##### Access the Agent\n\nOnce saved, users can access the agent in two ways:\n\n- **Snowflake CoWork chat:** Navigate to **AI & ML → Snowflake CoWork**, select `Balloon Game Analytics` from the agent picker in the chat bar, and start asking questions\n- **Direct URL:** Go to [ai.snowflake.com](https://ai.snowflake.com) and select the agent\n\n\u003E **How it works:** When a user asks a question, the agent routes it to Cortex Analyst, which reads the Semantic View's table/column descriptions, relationships, and primary keys to generate accurate SQL. The query executes against your silver Dynamic Iceberg Tables and returns results in the chat — no SQL knowledge required.\n\n#### Try It with Snowflake CoWork\n\nOnce configured, open your Intelligence app and ask natural-language questions about your balloon game data. Intelligence will ground its SQL generation in the semantic context you defined — table relationships, column descriptions, and metric definitions.\n\nExample questions to try:\n\n- *\"Who are the top 5 players by total score?\"*\n- *\"What's the most popular balloon color across all players?\"*\n- *\"Which color gives the best average points per pop?\"*\n- *\"Show me how player scores trend over time windows\"*\n- *\"Which players have the most bonus pops as a percentage of total pops?\"*\n- *\"How many total bonus pops have all players earned?\"*\n- *\"Email me a summary of the top 3 players\"*\n\n\u003E **Why this matters:** Your silver data was already queryable by SQL users and BI tools. The Semantic View now makes it queryable by **anyone** — business analysts, executives, or automated agents — using plain English. The same Iceberg data powers dashboards, cross-engine queries (DuckDB), **and** AI-driven analytics.\n\n\u003C!-- ------------------------ --\u003E\n## SiS Dashboard\n\nAfter the silver Dynamic Tables are live, deploy a Streamlit in Snowflake app that visualizes the balloon game event data. The app runs entirely in your Snowflake account next to your data.\n\nThis chapter offers **two paths** to the same outcome — choose one (or try both):\n\n| Path | How | What you'll learn |\n|------|-----|-------------------|\n| **Easy Path: Snowflake CoCo** | Describe what you want in natural language; AI builds, debugs, and deploys | Intent-driven development — how iterative prompts replace manual coding |\n| **Detailed Path: CLI** | Write every file and run every CLI command yourself | Full control, traditional workflow |\n\n\u003E **Recommended:** Try the Easy Path first. Watch Snowflake CoCo encounter errors (missing packages, unsupported features, permission gaps) and self-heal. Then ask it to generate the \"ideal prompt\" that would have worked in one shot — that's the core lesson of [Intent-Driven Development (IDD)](https://blogs.kameshs.dev/intent-driven-development-the-shift-developers-cant-ignore-ef434f94d56c).\n\n**Prerequisites:**\n\n- **03_dt_pipelines** applied and all five **dt_*** tables exist in **balloon_silver.silver**\n\n### Easy Path: Intent-Driven (Snowflake CoCo)\n\nOpen **Snowflake CoCo** from the Snowsight sidebar. This path has three rounds that demonstrate the progression from vague intent to precise specification.\n\n#### Round 1 — State Your Intent\n\n*Tell the agent **what** you want, not **how** to build it.*\n\nCopy and paste this into Snowflake CoCo:\n\n```text\nFirst, ask me the following before you start building:\n\n1. What database.schema has my game's Dynamic Tables?\n2. Where should the Streamlit app and stage be created?\n3. What warehouse should it use?\n\nThen, build me a multi-page Streamlit in Snowflake dashboard for my balloon popper game using the Dynamic Tables from the schema above.\n\nStructure the app in its own directory with a pages/ directory:\n\n- streamlit_app.py — home page with a game summary and key metrics\n- pages/1_Leaderboard.py — top 5 player rankings, score gaps, bar chart\n- pages/2_Color_Breakdown.py — pops by color, avg points per pop, player-color heatmap, players favorite color\n- pages/3_Trends.py — color value over time, player scores over time\n\nI want to answer: \n  * Who is winning and by how much? \n  * Which colors are most popular? \n  * Which color is worth more points? How are scores trending?\n\nMake it auto-refreshing, clean charts, easy to read at a glance. Handle missing data gracefully. Add a color scheme toggle. Use get_active_session(), wide layout, lowercase column names from Snowpark before passing to pandas. \n```\n\nWhen Snowflake CoCo asks you the interactive questions, answer with:\n\n- **Dynamic Tables schema:** **balloon_silver.silver** (or your **SNOWFLAKE_SILVER_DATABASE.SNOWFLAKE_SILVER_SCHEMA**)\n- **App schema:** **balloon_silver.apps**\n- **Warehouse:** your **SNOWFLAKE_WAREHOUSE** value\n\n**What to watch for:** Snowflake CoCo will likely hit 3–4 errors and fix each one automatically:\n\n| Expected error | Root cause | CoCo self-heals by… |\n|----------------|-----------|----------------------|\n| **st.set_page_config** crash | **page_icon** / **page_title** unsupported in SiS | Removing unsupported params |\n| Heatmap import error | **px.imshow** requires **scipy** (not in Snowflake conda) | Switching to **plotly.graph_objects.Heatmap** |\n| **st.rerun()** not found | Default Streamlit version is 1.22; **st.rerun** needs ≥ 1.27 | Pinning **streamlit=1.35.0** in **environment.yml** |\n| Schema does not exist | **balloon_silver.apps** not yet created | Creating the schema automatically |\n| \"No data available\" on all pages | App's owner role lacks SELECT on silver DTs | Discovering and granting permissions |\n\nThat iterative error → fix loop **is** the demo. Each failure is an intent gap that Snowflake CoCo closes autonomously.\n\n#### Round 2 — Ask CoCo to Reflect\n\nAfter the dashboard is running, paste this into Snowflake CoCo:\n\n```text\nLook at the errors you encountered and the fixes you made while\nbuilding this dashboard. Based on that experience, write me the\nprecise, optimized prompt that would have built this app correctly\nin one shot — no errors, no retries. Include every technical\nconstraint and detail you had to discover along the way.\n```\n\nSave the prompt Snowflake CoCo generates — that's your **baseline prompt**. This is the core practice of intent-driven development: start vague, let the agent iterate, then capture the learnings as a precise specification.\n\n#### Round 3 (Optional) — Prove the Difference\n\nWant to see the contrast? Ask Snowflake CoCo to delete the app, start a fresh CoCo session, paste the optimized prompt from Round 2, and watch it build cleanly in one pass — zero errors, zero retries.\n\n### Detailed Path (CLI)\n\nFollow this path for a traditional, manual deployment using the Snowflake CLI.\n\n**Additional prerequisites for Detailed Path:**\n\n- Snowflake CLI 3.14+ installed (via **uv sync**, then use **uv run snow**)\n- Your role has **SELECT** on **balloon_silver.silver.*** and **CREATE STREAMLIT** on **balloon_silver.apps**\n\n#### Prepare the APPS Schema\n\nCreate the schema and grant access before deploying:\n\n```sql\nCREATE SCHEMA IF NOT EXISTS balloon_silver.apps;\n```\n\nIf your Streamlit app will run under a role other than **ACCOUNTADMIN** (e.g. a personal lab role), grant access to the silver data:\n\n```sql\nGRANT USAGE ON DATABASE balloon_silver TO ROLE \u003Cyour_role\u003E;\nGRANT USAGE ON SCHEMA balloon_silver.silver TO ROLE \u003Cyour_role\u003E;\nGRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE \u003Cyour_role\u003E;\nGRANT ALL ON SCHEMA balloon_silver.apps TO ROLE \u003Cyour_role\u003E;\n```\n\n**App defaults (from **snowflake/sis/snowflake.yml**):**\n\n| Setting | Value |\n|---------|-------|\n| Streamlit object location | *balloon_silver.apps* |\n| Silver data source | *balloon_silver.silver* |\n| Query warehouse | *COMPUTE_WH* (override via **SNOWFLAKE_WAREHOUSE**) |\n| Deploy task | *task snowflake:sis-deploy* |\n\nThe **snowflake/sis/snowflake.yml** is the ground truth for deployment defaults. The app's schema (**SNOWFLAKE_APPS_SCHEMA** = **apps**) is separate from the silver data schema (**SNOWFLAKE_SILVER_SCHEMA** = **silver**).\n\n#### Deploy the App\n\n**task snowflake:sis-deploy** creates the target schema, stage, and Streamlit object automatically. Deploy using the task wrapper (recommended — reads **LAB_USERNAME**, **SNOWFLAKE_APPS_SCHEMA**, **SNOWFLAKE_SILVER_DATABASE**, **SNOWFLAKE_SILVER_SCHEMA**, and **SNOWFLAKE_WAREHOUSE** from **.env**):\n\n```bash\ntask snowflake:sis-deploy -- --open\n```\n\nAdding **--open** launches the app in a browser immediately after deploy.\n\nAlternatively, deploy directly with Snowflake CLI:\n\n```bash\nsnow streamlit deploy balloon_game_dashboard --project snowflake/sis --replace\n```\n\nPreview the resolved deploy config without deploying:\n\n```bash\nuv run sis-deploy show-config\n```\n\n### Open and Share\n\nPrint the deployed app URL:\n\n```bash\ntask snowflake:url\n```\n\nOpen the deployed app in Snowsight. Grant access to analyst roles:\n\n```sql\nGRANT USAGE ON STREAMLIT balloon_silver.apps.balloon_game_dashboard TO ROLE \u003Canalyst_role\u003E;\n```\n\nIf the account requires it, promote the live version:\n\n```sql\nALTER STREAMLIT balloon_silver.apps.balloon_game_dashboard ADD LIVE VERSION FROM LAST;\n```\n\n### App Pages\n\n| Page | What it shows |\n|------|---------------|\n| **Home** | Summary cards — total pops, players, top score |\n| **Leaderboard** | Ranked player table from **dt_player_leaderboard** |\n| **Color Analysis** | Balloon color preference heatmaps from **dt_balloon_color_stats** |\n| **Performance Trends** | Time-series scoring from **dt_color_performance_trends** |\n\n\u003C!-- ------------------------ --\u003E\n## DuckDB Integration\n\nDuckDB can read Snowflake-managed Iceberg tables directly via the [Horizon Iceberg REST Catalog (HIRC)](https://docs.snowflake.com/en/user-guide/tables-iceberg-access-using-external-query-engine-snowflake-horizon), giving cross-engine access to the same silver data without copying files or converting formats.\n\n\u003E **Preview feature:** HIRC is in Public Preview. It works in all Snowflake public regions except government regions. No additional charges apply during preview.\n\n### What Is HIRC\n\nSnowflake exposes Snowflake-managed Iceberg tables via a standard Iceberg REST endpoint:\n\n```\nhttps://\u003Caccount\u003E.snowflakecomputing.com/polaris/api/catalog\n```\n\nDuckDB authenticates using a Programmatic Access Token (PAT). The PAT is exchanged for temporary credentials via the OAuth2 client credentials flow, scoped to a Snowflake role. DuckDB then reads Iceberg metadata and S3 data files directly — Snowflake does not proxy the data.\n\nTwo HIRC-specific rules to keep in mind before you start:\n\n- **Warehouse name is case-sensitive** — the catalog name in **ATTACH** must be **UPPERCASE** (e.g. **'BALLOON_SILVER'**). Lowercase returns HTTP 404.\n- **GRANT ON ALL TABLES skips Dynamic Iceberg Tables** — you must use **ON ALL DYNAMIC TABLES** and **ON FUTURE DYNAMIC TABLES**; the plain **TABLES** variant silently grants nothing.\n\n### Easy Path — Interactive Notebook\n\nImport [duckdb_lab_guide.ipynb](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/duckdb_lab_guide.ipynb) into [Google Colab](https://colab.research.google.com/) or any Jupyter-compatible environment (JupyterLab, VS Code, etc.) for an interactive walkthrough of external engine integration via HIRC.\n\n**Before running the notebook**, complete the HIRC setup in Snowflake using [05_duckdb_hirc_setup.ipynb](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/05_duckdb_hirc_setup.ipynb) in Snowflake Notebooks. This creates the service account, reader role, network policy, and PAT needed for DuckDB authentication.\n\nThe DuckDB notebook:\n\n- Installs the DuckDB Iceberg and HTTPFS extensions\n- Authenticates to Snowflake's HIRC endpoint using the PAT created in the setup notebook\n- Attaches the silver database and discovers all five Dynamic Iceberg Tables\n- Runs cross-engine queries against the same silver data — proving multi-engine interoperability without data copies\n\n\u003E **Tip:** To open in Google Colab directly, prepend `https://colab.research.google.com/github/` to the notebook path:\n\u003E ```\n\u003E https://colab.research.google.com/github/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/duckdb_lab_guide.ipynb\n\u003E ```\n\nFollow the **Detailed Path** below for step-by-step shell commands and raw DuckDB SQL.\n\n### Detailed Path\n\n#### Quick Setup\n\nThe fastest path: set three env vars, run one task, open the notebook.\n\n**1. Add to .env** (substitute your **LAB_USERNAME** prefix — for example **ksampath**):\n\n```bash\nSNOWFLAKE_ACCOUNT_URL=https://\u003Corg\u003E-\u003Caccount\u003E.snowflakecomputing.com\nSA_USER=${LAB_USERNAME}_duckdb_sa          # e.g. ksampath_duckdb_sa\nSA_ROLE=${LAB_USERNAME}_duckdb_silver_reader\nSNOWFLAKE_SILVER_DATABASE=${LAB_USERNAME}_balloon_silver\n```\n\n**2. Create the service account, role, and PAT** (run from the repo root):\n\n```bash\ntask snowflake:pat-create\n```\n\nThis creates the role, user, and a PAT scoped to that role, then stores the PAT in your OS keyring. No further steps needed for auth.\n\n**3. Grant Iceberg access** (run as **ACCOUNTADMIN** — replace **balloon_silver** with your **SNOWFLAKE_SILVER_DATABASE**):\n\n\u003E **Critical:** **GRANT SELECT ON ALL TABLES** silently skips Dynamic Iceberg Tables. Use **ON ALL DYNAMIC TABLES** and **ON FUTURE DYNAMIC TABLES**.\n\n```sql\nGRANT USAGE ON DATABASE balloon_silver TO ROLE duckdb_silver_reader;\nGRANT USAGE ON SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\nGRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\nGRANT SELECT ON FUTURE DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\n```\n\n**4. Open the notebook:**\n\n[duckdb_lab_guide.ipynb](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines/blob/main/notebooks/duckdb_lab_guide.ipynb) — loads the PAT from the OS keyring automatically, installs the DuckDB Iceberg extension, attaches the silver database via HIRC, and queries all five silver DTs.\n\n#### Detailed Walkthrough\n\nThis section explains each step in the Quick Setup and shows the raw DuckDB SQL if you prefer to run it outside the notebook.\n\n#### Prerequisites\n\n- Silver Dynamic Iceberg Tables created and refreshed at least once\n- Snowflake role with **CREATE ROLE** / **CREATE USER** privileges for service account setup\n- DuckDB available in the project Python environment — **uv sync** installs it automatically\n\n#### What **task snowflake:pat-create** does\n\n**task snowflake:pat-create** calls **sfutils-pat create --user SA_USER --role SA_ROLE --db SNOWFLAKE_SILVER_DATABASE**, which:\n\n1. Creates the role **SA_ROLE** if it does not exist (no hyphens — HIRC requires underscore-only role names)\n2. Creates the user **SA_USER** with **DEFAULT_ROLE = SA_ROLE**\n3. Grants **SA_ROLE** to **SA_USER**\n4. Creates a PAT scoped to **SA_ROLE** and stores it in the OS keyring under **HOST:ACCOUNT:USER:SFUTILS-PAT:PAT_NAME**\n\nThe PAT never touches **.env** or any tracked file.\n\n\u003E **Security:** For CI/CD environments, inject the PAT at runtime from a vault or secrets manager.\n\n#### Grant Iceberg access (manual SQL)\n\nThe task creates the role and user but does not grant table access. Run this once as **ACCOUNTADMIN**:\n\n```sql\nCREATE ROLE IF NOT EXISTS duckdb_silver_reader;\n\nGRANT USAGE ON DATABASE balloon_silver TO ROLE duckdb_silver_reader;\nGRANT USAGE ON SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\nGRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\nGRANT SELECT ON FUTURE DYNAMIC TABLES IN SCHEMA balloon_silver.silver TO ROLE duckdb_silver_reader;\n```\n\n#### Connect from DuckDB\n\nInstall and load the required extensions (once per DuckDB installation):\n\n```sql\nINSTALL iceberg;\nLOAD iceberg;\nINSTALL httpfs;\nLOAD httpfs;\n```\n\nCreate the PAT-based Iceberg secret:\n\n```sql\nCREATE SECRET iceberg_pat_secret (\n  TYPE iceberg,\n  CLIENT_ID '',\n  CLIENT_SECRET '\u003Cyour_pat\u003E',\n  OAUTH2_SERVER_URI 'https://\u003Caccount\u003E.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens',\n  OAUTH2_GRANT_TYPE 'client_credentials',\n  OAUTH2_SCOPE 'session:role:duckdb_silver_reader'\n);\n```\n\nAttach the silver database — warehouse name must be **UPPERCASE**:\n\n```sql\nATTACH 'BALLOON_SILVER' AS balloon_silver (\n  TYPE iceberg,\n  SECRET iceberg_pat_secret,\n  ENDPOINT 'https://\u003Caccount\u003E.snowflakecomputing.com/polaris/api/catalog',\n  SUPPORT_NESTED_NAMESPACES false\n);\n```\n\nDiscover tables — **SHOW ALL TABLES** returns empty for Iceberg REST catalogs; use **USE** first:\n\n```sql\nUSE balloon_silver.SILVER;\nSHOW TABLES;\n```\n\nQuery the player leaderboard:\n\n```sql\nSELECT player, total_score, bonus_pops, last_event_ts\nFROM balloon_silver.SILVER.DT_PLAYER_LEADERBOARD\nORDER BY total_score DESC NULLS LAST\nLIMIT 10;\n```\n\n### Limitations\n\n- External engines can query but cannot write to Iceberg tables via HIRC\n- Reads work on Iceberg v2 or earlier only\n- Tables with row access policies or masking policies are not accessible via HIRC\n- Only Snowflake-managed Iceberg tables are supported — not externally managed, Delta, or Parquet Direct tables\n- **SHOW ALL TABLES** and **information_schema** are unavailable for attached Iceberg REST catalogs in DuckDB — use **USE catalog.SCHEMA; SHOW TABLES**\n\n### Case-Sensitive Identifiers\n\nSnowflake identifiers are UPPERCASE when accessed through HIRC. Always use uppercase schema and table names in DuckDB:\n\n```sql\n-- Wrong: lowercase identifiers fail with \"table does not exist\"\nSELECT * FROM balloon_silver.silver.dt_player_leaderboard;\n\n-- Correct: uppercase matches Snowflake's internal representation\nSELECT * FROM balloon_silver.SILVER.DT_PLAYER_LEADERBOARD;\n```\n\n\u003C!-- ------------------------ --\u003E\n## Cleanup\n\nRemove lab resources in reverse order of creation.\n\n### Snowflake Objects\n\nDrop Dynamic Tables and the silver database:\n\n```sql\nDROP DATABASE IF EXISTS balloon_silver;\n```\n\nDrop the Streamlit app (if deployed). If you used the **Easy Path (Snowflake CoCo)**, the app name may differ — check **SHOW STREAMLITS IN SCHEMA balloon_silver.apps** first:\n\n```sql\nSHOW STREAMLITS IN SCHEMA balloon_silver.apps;\nDROP STREAMLIT IF EXISTS balloon_silver.apps.balloon_game_dashboard;\n```\n\nDrop the catalog-linked database:\n\n```sql\nDROP DATABASE IF EXISTS balloon_game_events;\n```\n\nDrop the catalog integration:\n\n```sql\nDROP CATALOG INTEGRATION IF EXISTS glue_rest_catalog_int;\n```\n\nDrop the DuckDB service account objects (if created):\n\nRevoke the DuckDB service account PAT before dropping the user:\n\n```bash\ntask snowflake:pat-revoke\n```\n\n```sql\nDROP USER IF EXISTS duckdb_sa;\nDROP ROLE IF EXISTS duckdb_silver_reader;\n```\n\n\u003E See *Privileges Lost After CLD Recreate* in Troubleshooting if you recreate the CLD during teardown and re-setup.\n\n### Bronze (AWS)\n\nPreview what will be deleted:\n\n```bash\ntask bronze:cleanup-dry-run\n```\n\nRemove Glue tables, the Glue database, and S3 Tables control-plane resources:\n\n```bash\ntask bronze:cleanup\n```\n\n**bronze:cleanup** removes Glue and S3 Tables metadata only. It does **not** delete **BRONZE_BUCKET_NAME** or objects under **iceberg/** in S3. Remove those manually:\n\n```bash\naws s3 rm \"s3://$BRONZE_BUCKET_NAME/iceberg/\" --recursive\n```\n\nLake Formation registrations and IAM roles created for LF are not removed by **bronze:cleanup** — delete those in the AWS console or via CLI as needed.\n\n\u003E **Notebook users (CloudFormation):** If you used the notebook's CloudFormation template, a single command removes all IAM roles, policies, Lake Formation registration, and permissions:\n\u003E\n\u003E ```bash\n\u003E aws cloudformation delete-stack --stack-name snowflake-cld-iam --region $AWS_REGION\n\u003E aws cloudformation wait stack-delete-complete --stack-name snowflake-cld-iam --region $AWS_REGION\n\u003E ```\n\u003E\n\u003E If deletion fails due to active Lake Formation dependencies, check the CloudFormation **Events** tab for the failed resource.\n\n### Optional: Delete SIGV4 Lab Role\n\nIf **task snowflake:create-glue-catalog-read-role** created the IAM role, remove it after Snowflake teardown:\n\n```bash\ntask bronze:cleanup-dry-run -- --delete-snowflake-catalog-iam-role\n```\n\n```bash\ntask bronze:cleanup -- --yes --delete-snowflake-catalog-iam-role\n```\n\nThis deletes only roles tagged **project=balloon-popper-demo** and **purpose=snowflake-glue-catalog-read**.\n\n\u003C!-- ------------------------ --\u003E\n## Troubleshooting\n\n### Credential Vending Error 094120\n\nIf **SYSTEM$CATALOG_LINK_STATUS** returns error code **094120** (\"Failed to retrieve credentials from the Catalog\"), work through this checklist in order:\n\n1. **Two separate IAM roles:** The SIGV4 role (Snowflake catalog signer) and the LF data-access role passed to **register-resource --role-arn** must be different principals. Using the same role causes credential vending failures.\n2. **Register-resource flags:** The warehouse S3 location must be registered with **HybridAccessEnabled=false** and **WithFederation=false**. Hybrid mode produces unpredictable vending behavior.\n3. **Glue default permissions:** Run **aws glue update-database** with empty **CreateTableDefaultPermissions** on **GLUE_DATABASE** so new tables follow Lake Formation mode, not IAM-only defaults.\n4. **LF grants:** The SIGV4 role must have **DESCRIBE** on the database and **SELECT**, **DESCRIBE** on the table wildcard via Lake Formation **grant-permissions**.\n5. **Recreate the CLD:** After fixing any LF or IAM setting, run **CREATE OR REPLACE DATABASE … LINKED_CATALOG = ( … )**. **ALTER DATABASE … RESUME DISCOVERY** only retries table/schema discovery — it does not re-establish the catalog connection.\n\n### Glue Schema Not Found\n\nGlue database names surface as lowercase schema identifiers in the CLD. Always use double-quoted lowercase:\n\n```sql\n-- See the exact name Snowflake discovered:\nSHOW SCHEMAS IN DATABASE balloon_game_events;\n```\n\n```sql\n-- Use it in double quotes:\nSHOW ICEBERG TABLES IN SCHEMA balloon_game_events.\"ksampath_balloon_pops\";\n```\n\n### Integration DISABLED After Trust Apply\n\nIAM trust policy changes can take up to 30 seconds to propagate. Wait briefly and re-run **DESC CATALOG INTEGRATION** — the status should update. If it stays DISABLED, confirm **GLUE_AWS_IAM_USER_ARN** and **GLUE_AWS_EXTERNAL_ID** in the rendered trust JSON match the current **DESC** output exactly.\n\nUse **SYSTEM$VERIFY_CATALOG_INTEGRATION** to test connectivity explicitly:\n\n```sql\nSELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('glue_rest_catalog_int');\n```\n\nThe JSON response includes error details when the trust policy or IAM permissions are misconfigured.\n\n### Empty Windowed DTs\n\n**dt_realtime_scores**, **dt_balloon_colored_pops**, and **dt_color_performance_trends** use 15-second **TIME_SLICE** windows. They are empty when all bronze events fall in a single bucket or when DTs have not yet completed an initial refresh.\n\nLoad additional events:\n\n```bash\ntask bronze:load-more\n```\n\nWait for **TARGET_LAG** to elapse, then re-query.\n\n### Missing USAGE on External Volume\n\nIf Dynamic Iceberg Table creation fails with a permissions error:\n\n```sql\nGRANT USAGE ON EXTERNAL VOLUME \u003Cvolume_name\u003E TO ROLE \u003Cyour_role\u003E;\n```\n\n```sql\nGRANT USAGE ON WAREHOUSE \u003Cwarehouse_name\u003E TO ROLE \u003Cyour_role\u003E;\n```\n\n### Privileges Lost After CLD Recreate\n\nAfter **CREATE OR REPLACE DATABASE … LINKED_CATALOG**, re-apply integration usage:\n\n```sql\nGRANT USAGE ON INTEGRATION glue_rest_catalog_int TO ROLE \u003Cyour_role\u003E;\n```\n\nSee the [BCR-2114 behavior change](https://docs.snowflake.com/en/release-notes/bcr-bundles/2025_07/bcr-2114) in Snowflake release notes regarding catalog integration usage requirements.\n\n### DuckDB HIRC: Role Not Found\n\nHIRC does not support role names with hyphens. If you see \"Role not found\", ensure the role name uses underscores only — **duckdb_silver_reader** not **duckdb-silver-reader**.\n\n### DuckDB HIRC: Table Does Not Exist\n\nIf **SHOW ALL TABLES** returns results but a **SELECT** fails with \"table does not exist\", the identifiers are case-sensitive. Use uppercase schema and table names:\n\n```sql\nSELECT * FROM balloon_silver.SILVER.DT_PLAYER_LEADERBOARD LIMIT 5;\n```\n\n\u003C!-- ------------------------ --\u003E\n## Task References\n\nQuick reference for all lab tasks. Run **task --list** from the repo root to see all available tasks with their current status.\n\n### Root Tasks\n\n| Task | Description |\n|------|-------------|\n| **setup** | Bootstrap: **uv sync** + copy **.env.example** → **.env** if missing |\n| **check-tools** | Verify lab CLIs on PATH and run *aws sts get-caller-identity* |\n| **default** | List all available tasks |\n| **dashboard-local** | Optional dev: run the Streamlit dashboard locally (not the lab outcome) |\n| **generator-local** | Run the balloon game data generator locally |\n\n### bronze:* Tasks\n\n| Task | Description |\n|------|-------------|\n| **bronze:glue-setup** | Create Glue database and register S3 warehouse |\n| **bronze:glue-setup-dry-run** | Preview Glue setup without making changes |\n| **bronze:s3tables-setup** | Create S3 Tables table bucket, namespace, and Iceberg table |\n| **bronze:s3tables-setup-dry-run** | Preview S3 Tables setup without creating resources |\n| **bronze:render-iam** | Render IAM policy template to *.aws-config/* |\n| **bronze:render-iam-dry-run** | Print rendered IAM policy JSON without writing files |\n| **bronze:lakeformation-setup** | Create LF data-access role, register S3, grant permissions to SIGV4 role |\n| **bronze:lakeformation-setup-dry-run** | Preview Lake Formation setup without AWS writes |\n| **bronze:load** | Load sample balloon game events into Glue Iceberg table |\n| **bronze:load-more** | Append a second batch of events (different RNG seed) |\n| **bronze:snowflake-summary** | Print resolved bucket, database, and ARNs for Snowflake catalog setup |\n| **bronze:snowflake-summary-json** | Same as snowflake-summary with JSON output |\n| **bronze:cleanup** | Delete bronze metadata: Glue tables/database and S3 Tables resources |\n| **bronze:cleanup-dry-run** | Preview bronze cleanup without deleting anything |\n| **bronze:all** | Run glue-setup, s3tables-setup, and load in sequence |\n\n### snowflake:* Tasks\n\n| Task | Description |\n|------|-------------|\n| **snowflake:create-glue-catalog-read-role** | Create SIGV4 IAM role with Glue/LF permissions; write ARN to *.aws-config/* |\n| **snowflake:create-glue-catalog-read-role-dry-run** | Print IAM trust and permissions JSON without creating AWS resources |\n| **snowflake:apply-glue-catalog-trust-from-rendered** | Apply rendered trust policy to the SIGV4 IAM role |\n| **snowflake:describe-catalog-integration** | Print catalog integration properties from DESC |\n| **snowflake:describe-catalog-integration-json** | Same as describe-catalog-integration with JSON output |\n| **snowflake:render-glue-catalog-trust** | Write rendered trust policy JSON from DESC output |\n| **snowflake:render-glue-catalog-trust-dry-run** | Print rendered trust JSON without writing to *.aws-config/* |\n| **snowflake:generate-lab-sql** | Write 01_catalog_integration and 02_cld_verify generated SQL files |\n| **snowflake:generate-lab-sql-stdout** | Print catalog and CLD SQL to stdout only |\n| **snowflake:generate-lab-sql-all** | Write all three generated SQL files in one shot |\n| **snowflake:print-env-hints** | Print Snowflake CLD env defaults and SIGV4 hints |\n| **snowflake:sis-deploy** | Deploy the Streamlit in Snowflake app to *balloon_silver.apps* |\n| **snowflake:url** | Print deployed Streamlit in Snowflake app URL |\n| **snowflake:pat-create** | Create PAT for duckdb_sa and store in OS keychain |\n| **snowflake:pat-print** | Print PAT value from keychain to stdout |\n| **snowflake:pat-revoke** | Revoke and delete PAT from keychain and Snowflake |\n\n### dt:* Tasks\n\n| Task | Description |\n|------|-------------|\n| **dt:generate-sql** | Write 03_dt_pipelines.generated.sql with all five silver DTs |\n| **dt:generate-sql-stdout** | Print DT SQL to stdout only |\n| **dt:extvol-help** | Show sfutils-extvolumes top-level CLI help |\n| **dt:extvol-create-help** | Show sfutils-extvolumes create subcommand help |\n| **dt:extvol-create-dry-run** | Preview S3/IAM/Snowflake external volume creation without changes |\n| **dt:extvol-create** | Create S3 bucket, IAM role/policy, and Snowflake external volume |\n| **dt:extvol-verify** | Verify connectivity for an existing Snowflake external volume |\n| **dt:extvol-describe** | Describe an existing Snowflake external volume |\n| **dt:extvol-update-trust** | Re-sync IAM trust policy from Snowflake to the IAM role |\n| **dt:extvol-delete** | Drop Snowflake external volume and IAM resources |\n\n\u003C!-- ------------------------ --\u003E\n## Conclusion And Resources\n\nCongratulations! You have successfully built an end-to-end Iceberg lakehouse pipeline with AWS and Snowflake.\n\nStarting from a raw event stream in AWS Glue, you connected Snowflake directly to externally managed Iceberg tables without an ETL copy, layered in Dynamic Iceberg Tables that write silver aggregates back to open Iceberg format, shipped a live Streamlit in Snowflake dashboard, and queried the same silver tables from DuckDB via the Horizon Iceberg REST Catalog — all while keeping every layer in open format and every file in storage you control.\n\n### What You Learned\n\n- How to prepare a bronze Iceberg landing zone in AWS using Glue, S3, and Lake Formation with vended credentials configured for Snowflake\n- How to configure a Snowflake Glue Iceberg REST catalog integration with a two-role Lake Formation setup\n- How to create a catalog-linked database that reflects externally managed Iceberg tables without data duplication\n- How to build Dynamic Iceberg Tables that transform bronze JSON into production-ready silver aggregates on a declared target lag\n- How to make your silver data AI-ready by creating a Semantic View that enables natural-language querying via Snowflake CoWork and Cortex Analyst\n- How to deploy a Streamlit in Snowflake dashboard that reads from silver Dynamic Tables\n- How to query Snowflake-managed Iceberg tables from DuckDB via the Horizon REST Catalog using a Programmatic Access Token\n- How intent-driven development with Snowflake CoCo can replace manual coding workflows — and how refining prompts iteratively captures reusable engineering specifications\n\n### Related Resources\n\nDocumentation:\n\n- [Snowflake Iceberg tables](https://docs.snowflake.com/en/user-guide/tables-iceberg)\n- [Configure a catalog integration for AWS Glue Iceberg REST](https://docs.snowflake.com/en/user-guide/tables-iceberg-configure-catalog-integration-rest-glue)\n- [Use a catalog-linked database](https://docs.snowflake.com/en/user-guide/tables-iceberg-catalog-linked-database)\n- [Create dynamic Apache Iceberg tables](https://docs.snowflake.com/en/user-guide/dynamic-tables-create-iceberg)\n- [Semantic Views](https://docs.snowflake.com/en/user-guide/views-semantic)\n- [Snowflake CoWork](https://docs.snowflake.com/en/user-guide/snowflake-intelligence)\n- [Cortex Analyst](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst)\n- [Getting started with Streamlit in Snowflake](https://docs.snowflake.com/en/developer-guide/streamlit/getting-started/overview)\n- [Programmatic Access Tokens](https://docs.snowflake.com/en/user-guide/programmatic-access-tokens)\n\nAWS Documentation:\n\n- [AWS Glue: connect using the Iceberg REST endpoint](https://docs.aws.amazon.com/glue/latest/dg/connect-glu-iceberg-rest.html)\n- [AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)\n- [S3 Tables: Iceberg REST endpoint for open-source clients](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-open-source.html)\n\nAdditional Reading:\n\n- [Companion repository: sfguide-lakehouse-iceberg-production-pipelines](https://github.com/Snowflake-Labs/sfguide-lakehouse-iceberg-production-pipelines)\n- [DuckDB HIRC demo: hirc-duckdb-demo](https://github.com/kameshsampath/hirc-duckdb-demo)\n- [sfutils-extvolumes](https://github.com/Snowflake-Labs/sfutils-extvolumes)\n- [Apache Iceberg REST Catalog API spec](https://iceberg.apache.org/spec/#rest-catalog-api)","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-e29335474e","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-b0cb9a3c86",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_last_modi":{"id":"quickstart-last-modified-4c31412d8e","icon":{"id":"icon","icon":"calendar",":type":"snowflake-site/components/icon","appliedCssClassNames":"snowflake-icon-blue"},"lastModifiedDatePrefix":"Updated","lastModifiedDate":"2026-05-06",":type":"snowflake-site/components/quickstart/quickstart-last-modified","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"},"text":{"id":"text-bb358cfd23","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-b95bd13544",":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-61a38c7c84",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_table_of_":{"layout":"SIMPLE","id":"container-e4490d530b","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-0f5c6d284b","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/lakehouse-iceberg-production-pipelines",":type":"snowflake-site/components/quickstart/quickstart-table-of-content","headings":["\u003Ch2\u003EOverview\u003C/h2\u003E","\u003Ch2\u003EUse Case and Architecture\u003C/h2\u003E","\u003Ch2\u003ETools and Prerequisites\u003C/h2\u003E","\u003Ch2\u003EBronze Landing Zone\u003C/h2\u003E","\u003Ch2\u003ESnowflake Catalog Linked Database (CLD)\u003C/h2\u003E","\u003Ch2\u003EDynamic Iceberg Tables\u003C/h2\u003E","\u003Ch2\u003ESnowflake CoWork\u003C/h2\u003E","\u003Ch2\u003ESiS Dashboard\u003C/h2\u003E","\u003Ch2\u003EDuckDB Integration\u003C/h2\u003E","\u003Ch2\u003ECleanup\u003C/h2\u003E","\u003Ch2\u003ETroubleshooting\u003C/h2\u003E","\u003Ch2\u003ETask References\u003C/h2\u003E","\u003Ch2\u003EConclusion And Resources\u003C/h2\u003E"]},"quickstart_button":{"id":"quickstart-button-ca4141b953","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/lakehouse-iceberg-production-pipelines",":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-b7c6658bc3","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-2506f3833d",":type":"snowflake-site/components/modal/modal-container",":items":{},":itemsOrder":[]},"experiencefragment-footer":{"id":"experiencefragment-aaf2e1bc61","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-8b180b4d0b",":type":"snowflake-site/components/container",":items":{"container_copy":{"additionalClasses":"sf-footer__inner","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-09087cc49d","appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-320f420e93","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-a830cef4f7",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer-grid__inner","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","container_1622723482":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy_":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy":"aem-GridColumn aem-GridColumn--default--12","container_copy":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-64dc0f2b4d","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":type":"snowflake-site/components/container",":items":{"container_1622723482":{"additionalClasses":"sf-footer__column","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-c1343acfcf","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":type":"snowflake-site/components/container",":items":{"container":{"additionalClasses":"sf-footer__newsletter-group","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12","marketo_v2":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-97ab5a8cff","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-5edaf538b5","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-ff0c788bed","marketoForm":{"successUrl":null,"edit":false,"formId":"45871","hidden":null,"script":null,"values":null},"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com","marketoConfigured":true,"formConfigured":true,":type":"snowflake-site/components/form/marketo-v2"}},":itemsOrder":["text","marketo_v2"]}},":itemsOrder":["container"]},"container":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text_copy":"aem-GridColumn aem-GridColumn--default--12","text":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-a736a3c9c8","appliedCssClassNames":"snowflake-responsive-container-inner-padding-medium",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-3a7a75c98b","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-25a35399ac","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"]},"container_copy_copy":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-4b2d31d067","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-2669fccd7a","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"]},"container_copy":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-01820ec959","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-fa5abf469b","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"]},"container_copy_copy_":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-00ae1e8d3d","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-dded6b4fda","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"]}},":itemsOrder":["container_1622723482","container","container_copy_copy","container_copy","container_copy_copy_"]}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"]},"container_573483281_":{"additionalClasses":"sf-footer__bottom","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container_112062425":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-17e7cacd56","appliedCssClassNames":"snowflake-responsive-container-inner-padding-none",":type":"snowflake-site/components/container",":items":{"container_112062425":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-4daed17af1","appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-2f8f050c5e","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-708e64a633",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer__legal-container","gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","text_copy_copy_16360":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-66a00eb4c4","appliedCssClassNames":"snowflake-responsive-container-inner-padding-none",":type":"snowflake-site/components/container",":items":{"container":{"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12"},"layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-d013efc180","appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small",":type":"snowflake-site/components/container",":items":{"image":{"id":"image-1e32dfaa21","additionalClasses":"sf-footer__logo","lazyEnabled":true,"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",":type":"snowflake-site/components/image"}},":itemsOrder":["image"]},"text_copy_copy_16360":{"id":"text-d9bc04473b","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-b919c54c9b","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"]}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"]}},":itemsOrder":["container_112062425"]},"markup_editor_copy":{"id":"markup-editor-22aff5d5d0","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-3fd9a0baf6","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"],":hierarchyType":"page",":path":"/content/snowflake-site/global/en/developers/guides/lakehouse-iceberg-production-pipelines","locale":"en"}
  