{"templateName":"quickstart-page-template","cssClassNames":"page basicpage summit-page","allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"description":"This guide will provide step-by-step details for building data engineering pipelines with Snowpark Python","language":"ko","title":"Snowpark Python을 사용한 데이터 엔지니어링 파이프라인","analyticsPageType":"quickstart-page-template","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,"isPasswordProtected":false,":hierarchyType":"page",":path":"/content/snowflake-site/global/ko/developers/guides/data-engineering-pipelines-with-snowpark-python-kr",":type":"snowflake-site/components/structure/page","analyticsContentTags":["snowflake-site:taxonomy/product/data-engineering","snowflake-site:taxonomy/solution-center/certification/quickstart"],":items":{"root":{"columnClassNames":{"markup_editor_1950346551":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-banner":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-header":"aem-GridColumn aem-GridColumn--default--12","responsivegrid":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-footer":"aem-GridColumn aem-GridColumn--default--12","modal_container":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"experiencefragment-banner":{"id":"experiencefragment-b43b74ea92","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/ko/site/pushdown-banner/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"pushdown_banner_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-6c16d22d3c","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container",":items":{"pushdown_banner_copy":{"id":"pushdown-banner-8a131ffee8","contentHeadline":"Snowflake World Tour 서울  2026년 8월 27일(목) ","contentDescription":"Making AI Real for Business","contentJustifyContent":"center","linkStyle":"text-white","linkCTA":{"id":"link-cta","heapButtonClasses":["pushdown_banner"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"/ko/world-tour/seoul/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"행사 참여 신청하기"},":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-05c5a1798e","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/ko/site/mega-nav-header/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"mega_header":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-70bc02a778","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container",":items":{"markup_editor":{"id":"markup-editor-0cc2bb6931","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:'Snowflake로 실현하는 가치 \u003E';display:block;color:var(--ui-01);margin-top:16px}.nav-item__platform-parent .snowflake-mega-nav-nav-item-description::after{content:'플랫폼 살펴보기 \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","id":"container-ca27653012","layout":"SIMPLE",":type":"snowflake-site/components/mega-header","appliedCssClassNames":"snowflake-header-container white",":items":{"nav_mega":{"activeItem":"item_1719963657751_c_663444255","id":"tabs-af8a36a9ab",":type":"snowflake-site/components/nav/nav-mega",":items":{"item_1719963657751_c_663444255":{"id":"nav-dropdown-menu-92dd3c91ef","enableDropdown":true,"nav_column_container":{"id":"container-e30457b64f","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"additionalClasses":"nav-platform-sidebar","numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","id":"container-63624ceae3","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-e223b0b403","additionalClasses":"nav-item__platform-parent","linkDescription":"완전 관리형 플랫폼에서 AI 제품, 애플리케이션 등을 개발하고 모든 데이터 유형과 규모 전반에서 글로벌 비즈니스를 안전하게 연결하세요.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/platform/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake Platform"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-80ed6fdc18","additionalClasses":"nav-item nav-item--si","linkDescription":"세상의 모든 지식. 신뢰할 수 있는 단 하나의 엔터프라이즈 에이전트","flag":"정식 출시","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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-260bbd0daa","additionalClasses":"blue-icon","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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-8746947291","additionalClasses":"blue-icon","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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-63708e7e09","additionalClasses":"blue-icon","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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-6d0521af78","additionalClasses":"blue-icon","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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_526060162":{"id":"nav-item-f4ace95409","additionalClasses":"blue-icon","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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_copy","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_526060162"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","navColumnTitle":"기능","numberOfSubColumns":"two-columns","id":"container-3ce6cd3a20","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_212715":{"id":"nav-item-0fd7c00922","linkDescription":"Snowflake 기반 AI 코딩 에이전트","flag":"New","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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-8b6fbf6093","propertiesId":"testID","linkDescription":"Snowflake에서 실행되는 완전 호환 오픈소스 Postgres","flag":"정식 출시","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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_1923334373":{"id":"nav-item-cf3876dcbd","propertiesId":"testID","linkDescription":"업계 최고 LLM에 대한 즉각적인 액세스","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/features/cortex/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Cortex AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-355f15ca4e","propertiesId":"workload-nav-1","linkDescription":"통합을 위한 간편한 데이터 이동","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/features/openflow/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Openflow"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590635":{"id":"nav-item-3d074d5102","linkDescription":"서드 파티 데이터 및 AI 제품 테스트 및 구매","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/features/marketplace/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Marketplace"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_2121336733":{"id":"nav-item-b50a657c4e","linkDescription":"데이터 및 AI 팀을 위한 인터랙티브 개발 환경","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/features/notebooks/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Notebooks"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_1715469328":{"id":"nav-item-00912b3838","linkDescription":"Python 등을 실행하는 라이브러리 및 코드 실행 환경","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/features/snowpark/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowpark"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-fa8e5730f4","linkDescription":"완벽한 데이터 보호 기능을 갖춘 데이터 협업","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/features/data-clean-rooms/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Data Clean Rooms"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_1073841656":{"id":"nav-item-ff1299bf1b","linkDescription":"Python 스크립트를 웹 앱으로 변환하는 프레임워크 ","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/streamlit-in-snowflake/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Streamlit"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199_c":{"id":"nav-item-15003effbd","propertiesId":"workload-nav-1","linkDescription":"Snowflake Native App의 엔드투엔드 개발 및 배포","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/features/native-apps/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Native Apps"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_212715","nav_item","nav_item_copy_1923334373","nav_item_258535199","nav_item_copy_660590635","nav_item_copy_660590_2121336733","nav_item_copy_660590_1715469328","nav_item_copy_185565","nav_item_copy_660590_1073841656","nav_item_258535199_c"]},"nav_column_676020780":{"navColumnTitle":"오픈소스 기술","numberOfSubColumns":"one-column","maxWidth":"300","id":"container-a5f9db53c2","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_511717659":{"id":"nav-item-720b6d3729","linkDescription":"범용 AI 카탈로그","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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_924064894":{"id":"nav-item-7da1befc8c","linkDescription":"중앙 집중식 UI를 통한 간소화된 모델 개발 및 MLOps","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/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_660590":{"id":"nav-item-5ed0d540e5","linkDescription":"Snowflake의 트랜잭션 및 분석 워크로드 통합으로 운영 간소화","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/product/features/end-to-end-ml-workflows/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Unistore"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_511717659","nav_item_copy_660590_924064894","nav_item_copy_660590"]}},":itemsOrder":["nav_column","nav_column_copy_copy","nav_column_676020780"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"제품"},"nav_dropdown_menu_2":{"id":"nav-dropdown-menu-7ead663abf","enableDropdown":true,"nav_column_container":{"id":"container-9282725083","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"navColumnTitle":"산업용","numberOfSubColumns":"one-column","minWidth":"280","id":"container-ab0425b507","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column","appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small",":items":{"nav_item":{"id":"nav-item-6ec32fc444","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/ko/solutions/industries/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"산업별 솔루션"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1016012800":{"id":"nav-item-9a76867770","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/industries/advertising-media-entertainment/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"광고, 미디어 및 엔터테인먼트"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-a2830b4ed6","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/industries/financial-services/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"금융 서비스"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_197051":{"id":"nav-item-bfd66e435d","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/industries/healthcare-and-life-sciences/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"헬스케어 및 라이프사이언스"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_153342":{"id":"nav-item-d8b1058b47","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/industries/manufacturing/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"제조"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144445":{"id":"nav-item-1923bde4ed","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/industries/public-sector/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"공공 부문"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_114948":{"id":"nav-item-afd6f89989","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/industries/retail-consumer-goods/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"리테일/소비재"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_574170":{"id":"nav-item-04417b7e57","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/industries/technology/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"테크놀로지"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384_1935318080":{"id":"nav-item-8195733fef","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/industries/telecom/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"통신"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384_1107159381":{"id":"nav-item-cb34c1b78a","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":"여행 및 숙박 "},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1016012800","nav_item_copy_copy","nav_item_copy_197051","nav_item_copy_153342","nav_item_copy_144445","nav_item_copy_114948","nav_item_copy_574170","nav_item_copy_361384_1935318080","nav_item_copy_361384_1107159381"]},"nav_column_copy":{"navColumnTitle":"부서용","numberOfSubColumns":"one-column","minWidth":"160","id":"container-38f19c9d34","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-6f5358a08b","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/departments/finance/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"금융"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-f743ed5e24","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/departments/information-technology/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"IT"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-a48227957c","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/solutions/departments/marketing/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"마케팅"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"]},"nav_column_833417450":{"navColumnTitle":"역량 강화 솔루션","numberOfSubColumns":"one-column","id":"container-44f823eeba","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_107772":{"id":"nav-item-273be09372","linkDescription":"통합된 플랫폼으로의 안전한 마이그레이션 지원","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/migrate-to-the-cloud/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"AI 데이터 클라우드 마이그레이션 "},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1752092983163/nav-icon-cloud.svg","lazyEnabled":true,"alt":"Cloud icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-4b6e49bbdb","linkDescription":"Snowflake 전문가 지원을 통한 비즈니스 가속화 및 목표 달성","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","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205082215/nav-icon--migrate.svg","lazyEnabled":true,"alt":"Migrate icon","width":"64","height":"64",":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":"파트너 솔루션","numberOfSubColumns":"one-column","id":"container-aae0c8d952","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-b273a8f186","linkDescription":"제품, 솔루션 및 클라우드 파트너와 함께하는 프로그램","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 파트너 네트워크 "},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205103076/nav-icon--partner-network.svg","lazyEnabled":true,"alt":"Partner Network icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-14d5d1cca6","linkDescription":"확장 배포를 위한 파트너, 앱 및 솔루션 검색기","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":"파트너 찾기"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205113516/nav-icon--partner-finder.svg","lazyEnabled":true,"alt":"Partner Finder icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-5f3af81d4f","linkDescription":"라이브 및 가상 이벤트","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":"이벤트 파트너십 기회"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205123183/nav-icon--events.svg","lazyEnabled":true,"alt":"Calendar icon","width":"64","height":"64",":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":"솔루션"},"item_1719963657751_c":{"id":"nav-dropdown-menu-b1909db8a6","enableDropdown":true,"nav_column_container":{"id":"container-c1ab66bd82","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","id":"container-c7bedee1da","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-d1404443f8","additionalClasses":"nav-item__platform-parent-why-sf","linkDescription":"로컬 및 글로벌 차원에서 협업하여 새로운 인사이트를 발견하고, 이전에는 전혀 예상치 못했던 비즈니스 기회를 창출하며, 고객을 식별하고 원활한 경험을 제공합니다.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/why-snowflake/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"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","id":"container-831604b3e8","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-82cbfd6923","propertiesId":"testID","linkDescription":"Snowflake를 활용하는 글로벌 조직들에 대한 사례 연구와 비디오","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/customers/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"고객"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1740636508863/nav-icon--partner-network.svg","lazyEnabled":true,"alt":"Customer icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-db96172019","propertiesId":"workload-nav-1","linkDescription":"AI 데이터 클라우드에서 데이터와 앱을 연결, 공유 및 통합하는 방법을 알아보세요.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/why-snowflake/what-is-data-cloud/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"AI 데이터 클라우드 살펴보기"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1740636598409/nav-icon-cloud.svg","lazyEnabled":true,"alt":"Cloud icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-ac4e3d6ad8","linkDescription":"내장된 기능, 강력한 클라우드 인프라 보호 등을 통한 포괄적인 보안 제공","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/why-snowflake/snowflake-security-hub/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"보안 허브"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1740636570963/user-security-admins-ciso-icon.svg","lazyEnabled":true,"alt":"User with security lock icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-722c095b45","additionalClasses":"is-light-gray-icon","linkDescription":"총소유비용(TCO)을 최소화하고 요금 대비 성능을 지속적으로 최적화하여 경제적 가치를 극대화하세요.","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":"비용 및 성능 최적화"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1740636477103/nav-icon-cost-optimization-performance.svg","lazyEnabled":true,"alt":"Cost Optimization icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565_1325641543":{"id":"nav-item-c36e58be82","linkDescription":"AI 데이터 클라우드 기반 애플리케이션을 개발하는 스타트업 지원","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/why-snowflake/partners/powered-by-snowflake/powered-by-snowflake-startup-program/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"스타트업을 위한 Snowflake"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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_1325641543/icon.coreimg.svg/1778284274253/launch.svg","lazyEnabled":true,"alt":"/content/snowflake-site/global/ko/why-snowflake/partners/powered-by-snowflake/powered-by-snowflake-startup-program","width":"65","height":"64",":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_1325641543"]}},":itemsOrder":["nav_column","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Snowflake를 사용해야 하는 이유"},"item_1719961362824":{"id":"nav-dropdown-menu-ac55d01c71","enableDropdown":true,"nav_column_container":{"id":"container-d03d3211ca","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","minWidth":"124","id":"container-3e323df0fe","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-2c07a3ba79","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/blog/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"블로그"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_180298689":{"id":"nav-item-0d64e047cf","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/events/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"이벤트"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_1639361946":{"id":"nav-item-ec0bfc9cd5","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/support/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"지원"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_680912746":{"id":"nav-item-51162e4ad1","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/contact/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"문의"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_180298689","nav_item_1639361946","nav_item_680912746"]},"nav_column_44600420__826130542":{"navColumnTitle":"학습","numberOfSubColumns":"two-columns","id":"container-2108d73413","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-8019f29fa7","linkDescription":"eBook, 팟캐스트, 비디오, 백서 등","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/resources/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"리소스 라이브러리"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1740636655434/nav-icon--notebooks.svg","lazyEnabled":true,"alt":"Notebooks icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-3216bb3205","linkDescription":"Snowflake의 교육 프로그램 개요","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/learn/training/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"교육"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205646803/nav-icon--training.svg","lazyEnabled":true,"alt":"Training icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_1984107859":{"id":"nav-item-9f91930700","linkDescription":"다양한 산업 및 사용 사례에 대해 전문가가 주도하는 토론 및 데모","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/content/snowflake-site/global/ko/webinars"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"웨비나"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1773154016344/nav-icon--webinars.svg","lazyEnabled":true,"alt":"Webinars icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1438098918":{"id":"nav-item-62011cec8c","linkDescription":"Snowflake의 기술 산업 전문 자격증","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/resources/learn/certifications/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"자격 인증"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1740636703088/nav-icon--cert.svg","lazyEnabled":true,"alt":"Certification icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_143809":{"id":"nav-item-5e67845fb6","linkDescription":"주요 기능에 대한 주간 제품 데모 및 실시간 Q&A 제공","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/content/snowflake-site/global/en/webinars/demo"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"라이브 데모"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205597408/nav-icon--live-demo.svg","lazyEnabled":true,"alt":"Live Demo icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890638":{"id":"nav-item-70d1b6b241","linkDescription":"모든 레벨을 위한 교육 과정, 온디맨드 또는 실시간 강의 제공","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","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205657253/nav-icon--education.svg","lazyEnabled":true,"alt":"Education icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945_1419909438":{"id":"nav-item-7c6256a4d8","linkDescription":"Snowflake의 핵심 기능을 익힐 수 있는 강사 주도의 가상 워크샵","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/content/snowflake-site/global/en/webinars/virtual-hands-on-lab"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"핸즈온 랩"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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_1419909438/icon.coreimg.svg/1778205618866/nav-icon--labs.svg","lazyEnabled":true,"alt":"Hands-on Labs icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945_71807784":{"id":"nav-item-3a65a0d6d5","linkDescription":"Snowflake 연구진이 작성한 연구 논문","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/publications/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Snowflake Research Publications"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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_71807784/icon.coreimg.svg/1778205823757/data-sheet.svg","lazyEnabled":true,"alt":"Data Sheet","width":"65","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945_1090045707":{"id":"nav-item-826afe1626","linkDescription":"AI 및 데이터 주제 관련 인사이트 콘텐츠","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/ko/fundamentals/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Fundamentals"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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_1090045707/icon.coreimg.svg/1778214635577/nav-icon--labs.svg","lazyEnabled":true,"alt":"Hands-on Labs icon","width":"64","height":"64",":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_1419909438","nav_item_copy_189945_71807784","nav_item_copy_189945_1090045707"]}},":itemsOrder":["nav_column_copy","nav_column_44600420__826130542"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"리소스"},"item_1719963657751":{"id":"nav-dropdown-menu-24421fbc72","enableDropdown":true,"nav_column_container":{"id":"container-fdeb3015e9","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy_copy":{"navColumnTitle":"Build","numberOfSubColumns":"one-column","id":"container-6a8dd2edef","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-5916ab2d0f","propertiesId":"testID","linkDescription":"빌드 및 확장이 필요한 개발자 리소스 개요","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"개발자를 위한 Snowflake"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205851807/nav-icon--devs.svg","lazyEnabled":true,"alt":"Developers icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-198d84dcdb","linkDescription":"참조 아키텍처, 사용 사례 및 모범 사례","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/ko/developers/guides/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"개발자 가이드"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778214724119/nav-icon--solution-center.svg","lazyEnabled":true,"alt":"Solution Center icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-7fc54dcda4","additionalClasses":"is-light-gray-icon","linkDescription":"최신 소프트웨어 버전, 드라이버, 라이브러리 및 관련 문서","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/downloads/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"다운로드 "},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205861103/nav-icon-download.svg","lazyEnabled":true,"alt":"Download icon","width":"28","height":"28",":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":"학습","numberOfSubColumns":"one-column","id":"container-fe5008598a","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-0ecfab2200","propertiesId":"testID","linkDescription":"참조 문서, 가이드, 자습서 및 발표 내용","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://docs.snowflake.com/ko"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"설명서"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1740636759283/nav-icon--docs.svg","lazyEnabled":true,"alt":"Docs icon","width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-4a43f006dc","additionalClasses":"is-light-gray-icon","linkDescription":"Snowflake 엔지니어들이 유지 및 지원 중인 핵심  프로젝트 ","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/open-source/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"오픈소스"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205872502/nav-icon-open-source.svg","lazyEnabled":true,"alt":"Open Source icon","width":"32","height":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-5d7e5cce76","additionalClasses":"is-light-gray-icon","linkDescription":"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 교육 "},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205893789/nav-icon--northstar.svg","lazyEnabled":true,"alt":"Northstar logo","width":"32","height":"32",":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","id":"container-224ffa1de3","layout":"SIMPLE",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-db313bf2f3","propertiesId":"testID","linkDescription":"Snowflake 기능 구축 방법 및 이유 등에 대한 기술 리더들의 설명","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://www.snowflake.com/engineering-blog/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"엔지니어링 블로그"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778284968921/nav-icon--developer-center.svg","lazyEnabled":true,"alt":"Developers icon","width":"32","height":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-92b8caa1c0","linkDescription":"Snowflake 개발자들과 토론하고 비법 및 요령을 공유하는 공간","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":"커뮤니티"},"icon":{"id":"icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/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/1778205910554/nav-icon--partner-network.svg","lazyEnabled":true,"alt":"Partner Network icon","width":"64","height":"64",":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"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"개발자"},"item_1718247180324":{"id":"nav-dropdown-menu-8fdbd5dbb0","enableDropdown":false,"link_url":"/ko/pricing-options/",":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"요금"}},":itemsOrder":["item_1719963657751_c_663444255","nav_dropdown_menu_2","item_1719963657751_c","item_1719961362824","item_1719963657751","item_1718247180324"]},"languagenavigation":{"id":"language-navigation-592f4a2cb9","languageNavItems":[{"title":"English","path":"/en/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/","locale":"en","active":false},{"title":"日本語","path":"/ja/","locale":"ja","active":false},{"title":"한국어","path":"/ko/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/","locale":"ko","active":true},{"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":{"id":"button-6c2c543da9","heapButtonClasses":["contact_nav","heap-nav-contact"],"showOutboundIcon":true,"buttonLink":{"valid":true,"url":"/ko/contact/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-secondary snowflake-button-blue snowflake-button-compact","text":"영업 담당자에게 문의하기"},"button_288358396":{"id":"button-6bbf86b39b","heapButtonClasses":["start_for_free_nav","heap-nav-start-for-free"],"showOutboundIcon":true,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://signup.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-primary snowflake-button-blue snowflake-button-compact","text":"무료로 시작하기"}},":itemsOrder":["nav_mega","languagenavigation","button","button_288358396"]}},":itemsOrder":["markup_editor","mega_header"]}},":itemsOrder":["root"],"classNames":"aem-xf"},"markup_editor_1950346551":{"id":"markup-editor-f6d14787df","title":" ","cssContent":".snowflake-markdown-table code[class*=language-],.snowflake-markdown-table code[class*=language-],.snowflake-markdown .snowflake-text code[class*=language-],.snowflake-markdown .snowflake-text pre[class*=language-]{background-color:rgba(var(--ui-12-rgb),.5);color:var(--text-01);text-shadow:none;padding:var(--spacing-00);border-radius:var(--spacing-00);font-size:smaller}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"responsivegrid":{"columnClassNames":{"quickstart_hero":"aem-GridColumn aem-GridColumn--default--12","flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"quickstart_hero":{"id":"quickstart-hero-d611780be4","isDeveloperGuidesPage":false,"quickstartHeroTitle":{"lines":["Snowpark Python을 사용한 데이터 엔지니어링 파이프라인"],"type":"heading2",":type":"snowflake-site/components/title-v2"},"quickstartHeroAuthor":"Jeremiah Hansen","quickstartHeroForkRepoLink":{"id":"button-d3cdd5e397","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://github.com/Snowflake-Labs/sfquickstarts/tree/master/site/sfguides/src/data-engineering-pipelines-with-snowpark-python-kr"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Fork Repo"},"quickstartHeroBreadcrumbs":[{"title":"Snowpark Python을 사용한 데이터 엔지니어링 파이프라인","url":"https://www.snowflake.com/content/snowflake-site/global/ko/developers/guides/data-engineering-pipelines-with-snowpark-python-kr","currentPage":true},{"title":"개발자 솔루션 센터","url":"https://www.snowflake.com/content/snowflake-site/global/ko/developers/guides","currentPage":false},{"title":"Snowflake for Developers","url":"https://www.snowflake.com/content/snowflake-site/global/ko/developers","currentPage":false}],"quickstartHeroFirstCertifiedTag":{"tagText":"Quickstart","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/solution-center/certification/quickstart","tagIcon":""},":type":"snowflake-site/components/quickstart/quickstart-hero","fragmentPath":"/content/dam/snowflake-site/ko/content-fragments/quickstarts/data-engineering-pipelines-with-snowpark-python-kr"},"flexible_column_cont":{"id":"flexible-column-container-0d0706e3fa","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":{"id":"container-bb087bfe07","layout":"SIMPLE",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"contentfragment":{"id":"contentfragment-b4f5bcd0f5","description":"This guide will provide step-by-step details for building data engineering pipelines with Snowpark Python","paragraphs":["&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E개요\u003C/h2\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E&ldquo;데이터 엔지니어는 기본적으로 여러 단계를 거쳐 데이터를 전송하는 데이터 파이프라인을 구축 및 유지하는 데 집중하고 이를 사용 가능한 상태로 만듭니다. 데이터 엔지니어링 프로세스에는 한 장소에서 다른 장소로 데이터를 전송하는 것을 자동화하고 이러한 데이터를 특정 유형의 분석을 위해 특성 형식으로 변환하는 \u003Cstrong\u003E데이터 파이프라인\u003C/strong\u003E을 생성하기 위한 종합적인 노력이 포함됩니다. 이러한 측면에서 보면 데이터 엔지니어링은 한 번에 끝낼 수 있는 작업이 아닙니다. 이는 지속적인 관행이며 데이터를 수집하고, 준비하고, 변환하고, 전달해야 합니다. 데이터 파이프라인은 신뢰할 수 있는 방식으로 반복할 수 있도록 이러한 작업을 자동화하는 것을 돕습니다. 이는 특정 기술이라기보다는 오히려 관행입니다.&rdquo; (출처: Cloud Data Engineering for Dummies, Snowflake 특별 에디션)\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E데이터 엔지니어링 파이프라인을 구축하기 위해 Snowpark Python의 위력을 활용하는 데 관심이 있으신가요? 그렇다면 이 Quickstart가 도움이 될 것입니다! 여기에서는 데이터 사이언스가 아니라 Python을 사용하여 데이터 엔지니어링 파이프라인을 구축하는 방법에 집중하겠습니다. Snowpark Python을 사용한 데이터 사이언스의 사례는 \u003Ca href=\"/en/developers/guides/getting-started-snowpark-machine-learning/\"\u003EMachine Learning with Snowpark Python:\u003C/a\u003E\u003Ca href=\"/en/developers/guides/getting-started-snowpark-machine-learning/\"\u003E\u003C/a\u003E\u003Ca href=\"/en/developers/guides/getting-started-snowpark-machine-learning/\"\u003E- Credit Card Approval Prediction\u003C/a\u003E Quickstart를 참조하십시오.\u003C/p\u003E\n","\u003Cp\u003E이 Quickstart는 많은 내용을 다룹니다. 이 가이드를 완료하는 시점에는 Snowpark Python 저장 프로시저를 사용하여 강력한 데이터 엔지니어링 파이프라인을 구축했을 것입니다. 이러한 파이프라인은 데이터를 증분적으로 처리하고, Snowflake 작업과 조정되고, CI/CD 파이프라인을 통해 배포됩니다. 또한, Snowflake의 새로운 개발자 CLI 도구 및 Visual Studio Code 확장 프로그램을 사용하는 방법을 배우게 됩니다. 간략한 시각적 개요는 다음과 같습니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E마음의 준비를 하십시오!\u003C/p\u003E\n","\u003Ch3\u003E사전 필요 조건 및 지식\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EPython 사용 경험\u003C/li\u003E\u003Cli\u003EDataFrame API 사용 경험\u003C/li\u003E\u003Cli\u003ESnowflake 사용 경험\u003C/li\u003E\u003Cli\u003EGit 리포지토리 및 GitHub 사용 경험\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003E학습할 내용\u003C/h3\u003E\n","\u003Cp\u003E이 Quickstart를 진행하는 동안 다음 Snowflake 기능을 학습하게 됩니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowflake의 테이블 형식\u003C/li\u003E\u003Cli\u003ECOPY를 사용한 데이터 수집\u003C/li\u003E\u003Cli\u003E스키마 추론\u003C/li\u003E\u003Cli\u003E데이터 공유 및 마켓플레이스(ETL 대신)\u003C/li\u003E\u003Cli\u003E증분적 처리를 위한 스트림(CDC)\u003C/li\u003E\u003Cli\u003E뷰의 스트림\u003C/li\u003E\u003Cli\u003EPython UDF(서드 파티 패키지 포함)\u003C/li\u003E\u003Cli\u003EPython 저장 프로시저\u003C/li\u003E\u003Cli\u003ESnowpark DataFrame API\u003C/li\u003E\u003Cli\u003ESnowpark Python 프로그램 가능성\u003C/li\u003E\u003Cli\u003E웨어하우스 탄력성(동적 규모 조정)\u003C/li\u003E\u003Cli\u003EVisual Studio Code Snowflake 네이티브 확장 프로그램\u003C/li\u003E\u003Cli\u003ESnowCLI\u003C/li\u003E\u003Cli\u003E작업(스트림 트리거 포함)\u003C/li\u003E\u003Cli\u003E작업 관측 가능성\u003C/li\u003E\u003Cli\u003EGitHub Actions(CI/CD) 통합\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003E필요한 것\u003C/h3\u003E\n","\u003Cp\u003E시작하기 전에 다음이 필요합니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowflake\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESnowflake 계정\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EACCOUNTADMIN 권한을 포함하여 생성된 Snowflake 사용자\u003C/strong\u003E 이 사용자를 사용하여 Snowflake에서 설정을 진행합니다.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EAnaconda 사용 약관 수락\u003C/strong\u003E \u003Ca href=\"https://docs.snowflake.com/ko/developer-guide/udf/python/udf-python-packages.html#getting-started\"\u003E서드 파티 패키지\u003C/a\u003E에서 시작하기 섹션을 참조하십시오.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EMiniconda\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E컴퓨터에 Miniconda 설치\u003C/strong\u003E \u003Ca href=\"https://conda.io/miniconda.html\"\u003EMiniconda\u003C/a\u003E를 다운로드 및 설치합니다. 대신에 Python 3.8을 포함한 다른 모든 Python 환경을 사용할 수 있습니다.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003ESnowSQL\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E컴퓨터에 SnowSQL 설치\u003C/strong\u003E \u003Ca href=\"https://developers.snowflake.com/snowsql/\"\u003ESnowSQL 다운로드 페이지\u003C/a\u003E로 이동하여 상세 정보를 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/snowsql-install-config.html\"\u003ESnowSQL 설치\u003C/a\u003E 페이지에서 확인하십시오.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EGit\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E컴퓨터에 Git 설치\u003C/strong\u003E 상세 정보는 \u003Ca href=\"https://git-scm.com/book/en/v2/Getting-Started-Installing-Git\"\u003E시작하기 - Git 설치\u003C/a\u003E 페이지에서 확인하십시오.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E자신의 사용자 이름 및 이메일 주소로 Git 구성\u003C/strong\u003E 아직 구성하지 않았다면 로컬 컴퓨터에서 \u003Ca href=\"https://docs.github.com/en/get-started/getting-started-with-git/setting-your-username-in-git#setting-your-git-username-for-every-repository-on-your-computer\"\u003EGit 사용자 이름\u003C/a\u003E 및 \u003Ca href=\"https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address#setting-your-email-address-for-every-repository-on-your-computer\"\u003EGit 이메일 주소\u003C/a\u003E를 설정하십시오.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E필수 확장 프로그램을 포함한 Visual Studio Code\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E컴퓨터에 Visual Studio Code 설치\u003C/strong\u003E 다운로드 페이지 링크는 \u003Ca href=\"https://code.visualstudio.com/\"\u003EVisual Studio Code\u003C/a\u003E 홈페이지에서 확인하십시오.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EPython 확장 프로그램 설치\u003C/strong\u003E VS Code의 \u003Cem\u003EExtensions\u003C/em\u003E 창에서 &lsquo;Python&rsquo; 확장 프로그램(Microsoft 제공)을 검색 및 설치하십시오.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESnowflake 확장 프로그램 설치\u003C/strong\u003E VS Code의 \u003Cem\u003EExtensions\u003C/em\u003E 창에서 &lsquo;Snowflake&rsquo; 확장 프로그램(Snowflake 제공)을 검색 및 설치하십시오.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E로컬에서 포크 및 복제된 랩 리포지토리를 포함한 GitHub 계정\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EGitHub 계정\u003C/strong\u003E GitHub 계정이 아직 없다면 무료로 생성할 수 있습니다. 시작하려면 \u003Ca href=\"https://github.com/signup\"\u003EGitHub 가입\u003C/a\u003E 페이지를 방문하십시오.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003E구축할 것\u003C/h3\u003E\n","\u003Cp\u003E이 Quickstart를 진행하는 동안 다음 작업을 완수하게 됩니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E스키마 추론을 사용하여 Snowflake로 Parquet 데이터 로드\u003C/li\u003E\u003Cli\u003ESnowflake 마켓플레이스 데이터에 대한 액세스 설정\u003C/li\u003E\u003Cli\u003E온도 변환을 위해 Python UDF 생성\u003C/li\u003E\u003Cli\u003E증분적 데이터 처리를 위해 Python 저장 프로시저로 데이터 엔지니어링 파이프라인 생성\u003C/li\u003E\u003Cli\u003E파이프라인을 작업과 조정\u003C/li\u003E\u003Cli\u003ESnowsight로 파이프라인 모니터링\u003C/li\u003E\u003Cli\u003ECI/CD 파이프라인을 통해 Snowpark Python 저장 프로시저 배포\u003C/li\u003E\u003C/ul\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EQuickstart 설정\u003C/h2\u003E\n","\u003Ch3\u003EQuickstart를 위해 리포지토리 포크 및 복제\u003C/h3\u003E\n","\u003Cp\u003E자신의 GitHub 계정에서 이 Quickstart를 위한 리포지토리 포크를 생성해야 합니다. \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python\"\u003EData Engineering Pipelines with Snowpark Python(Snowpark Python을 사용한 데 파이프라인) 관련 GitHub 리포지토리\u003C/a\u003E를 방문하여 오른쪽 상단 부근에 있는 &lsquo;Fork&rsquo; 버튼을 클릭합니다. 모든 필수 필드를 완료하고 &lsquo;Create Fork&rsquo;를 클릭합니다.\u003C/p\u003E\n","\u003Cp\u003E기본값으로 GitHub Actions는 포크된 리포지토리에 정의된 모든 워크플로우(또는 CI/CD 파이프라인)를 비활성화합니다. 이 리포지토리에는 나중에 사용할 Snowpark Python UDF 및 저장 프로시저를 배포하기 위한 워크플로우가 포함되어 있습니다. 지금은 GitHub에서 포크된 리포지토리를 열어 이 워크플로우를 활성화합니다. 페이지 상단 중앙 부근에 있는 \u003Ccode\u003EActions\u003C/code\u003E 탭을 클릭한 다음 \u003Ccode\u003EI understand my workflows, go ahead and enable them\u003C/code\u003E 녹색 버튼을 클릭합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/github-actions-activate.png\" alt=\"assets/github-actions-activate.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E다음으로 새로운 포크된 리포지토리를 로컬 컴퓨터로 복제해야 합니다. 새로운 Git 리포지토리에 대한 연결 세부 정보를 확인하려면 리포지토리를 열고, 페이지 상단 부근에 있는 녹색 &lsquo;Code&rsquo; 아이콘을 클릭하고, &lsquo;HTTPS&rsquo; 링크를 복사합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/git_repo_url.png\" alt=\"assets/git_repo_url.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EVS Code에서 이 링크를 사용하여 리포지토리를 컴퓨터에 복제합니다. 상세 정보를 위해 \u003Ca href=\"https://learn.microsoft.com/en-us/azure/developer/javascript/how-to/with-visual-studio-code/clone-github-repository\"\u003EVisual Studio Code에서 GitHub 리포지토리 복제 및 사용\u003C/a\u003E 지침을 따르십시오. 또한, 선호에 따라 다음 명령을 실행하여 명령줄에서 리포지토리를 복제할 수도 있습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Egit clone &lt;your-forked-repo-url&gt;\ncd sfguide-data-engineering-with-snowpark-python/\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E포크된 리포지토리가 로컬 컴퓨터에 복제되면 VS Code로 폴더를 엽니다.\u003C/p\u003E\n","\u003Ch3\u003E자격 증명 구성\u003C/h3\u003E\n","\u003Cp\u003E이 Quickstart에서 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/snowsql.html\"\u003ESnowSQL 명령줄 클라이언트\u003C/a\u003E를 바로 사용하지는 않겠지만, \u003Ccode\u003E~/.snowsql/config\u003C/code\u003E에 있는 SnowSQL 구성 파일에 Snowflake 연결 세부 정보를 저장하겠습니다. 해당 SnowSQL 구성 파일이 존재하지 않는다면 빈 구성 파일을 생성하십시오.\u003C/p\u003E\n","\u003Cp\u003E다음 섹션을 \u003Ccode\u003E~/.snowsql/config\u003C/code\u003E 파일에 추가하여 이 랩을 위한 SnowSQL 구성을 생성합니다(계정 이름, 사용자 이름 및 암호는 자신의 값으로 바꿈).\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E[connections.dev]\naccountname = myaccount\nusername = myusername\npassword = mypassword\nrolename = HOL_ROLE\nwarehousename = HOL_WH\ndbname = HOL_DB\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E참고:\u003C/strong\u003E SnowCLI 도구(및 이 Quickstart의 확장 프로그램)는 현재 키 쌍 인증과 작동하지 않습니다. 이는 사용자 이름과 암호 세부 정보를 공유 SnowSQL 구성 파일에서 가져오기만 합니다.\u003C/p\u003E\n","\u003Ch3\u003EAnaconda 환경 생성\u003C/h3\u003E\n","\u003Cp\u003E제공된 \u003Ccode\u003Econda_env.yml\u003C/code\u003E 파일을 사용하여 이 랩을 위한 Conda 환경을 생성 및 활성화합니다. 포크된 로컬 리포지토리 루트의 터미널에서 이 명령을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Econda env create -f conda_env.yml\nconda activate pysnowpark\n\u003C/code\u003E\u003C/pre\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESnowflake 설정\u003C/h2\u003E\n","\u003Ch3\u003EVS Code용 Snowflake 확장 프로그램\u003C/h3\u003E\n","\u003Cp\u003E다양한 방식(Snowsight UI, SnowSQL 등)으로 Snowflake에 대해 SQL 쿼리를 실행할 수 있지만, 이 Quickstart에서는 VS Code용 Snowflake 확장 프로그램을 사용하겠습니다. Snowflake의 VS Code용 네이티브 확장 프로그램에 대한 간략한 개요는 \u003Ca href=\"https://marketplace.visualstudio.com/items?itemName=snowflake.snowflake-vsc\"\u003EVS Code 마켓플레이스 Snowflake 확장 프로그램 페이지\u003C/a\u003E에서 확인하십시오.\u003C/p\u003E\n","\u003Ch3\u003E스크립트 실행\u003C/h3\u003E\n","\u003Cp\u003E이 Quickstart를 위해 Snowflake에서 필요할 모든 객체를 설정하려면 \u003Ccode\u003Esteps/01_setup_snowflake.sql\u003C/code\u003E 스크립트를 실행해야 합니다.\u003C/p\u003E\n","\u003Cp\u003EVS Code의 왼쪽 탐색 메뉴에서 Snowflake 확장 프로그램을 클릭하여 시작합니다. 그런 다음 ACCOUNTADMIN 권한을 가진 사용자로 Snowflake 계정에 로그인합니다. Snowflake에 로그인한 후 왼쪽 탐색 메뉴에 있는 파일 탐색기로 되돌아가 VS Code에서 \u003Ccode\u003Esteps/01_setup_snowflake.sql\u003C/code\u003E 스크립트를 엽니다.\u003C/p\u003E\n","\u003Cp\u003E모든 쿼리를 이 스크립트에서 실행하려면 편집기 창의 오른쪽 상단 모서리에 있는 &lsquo;Execute All Statements&rsquo; 버튼을 사용합니다. 묶어서 실행하고 싶다면 실행할 쿼리를 선택하고 CMD/CTRL+Enter 바로 가기 키를 누릅니다.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E가공 전 데이터 로드\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 가공 전 Tasty Bytes POS 및 고객 충성도 데이터를 \u003Ccode\u003Es3://sfquickstarts/data-engineering-with-snowpark-python/\u003C/code\u003E에 있는 가공 전 Parquet 파일에서 Snowflake의 \u003Ccode\u003ERAW_POS\u003C/code\u003E 및 \u003Ccode\u003ERAW_CUSTOMER\u003C/code\u003E 스키마로 로드하겠습니다. 또한, Snowpark Python API를 사용하여 노트북에서 Python으로 이 프로세스를 조정하게 됩니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E2\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E스크립트 실행\u003C/h3\u003E\n","\u003Cp\u003E가공 전 데이터를 로드하려면 \u003Ccode\u003Esteps/02_load_raw.py\u003C/code\u003E 스크립트를 실행합니다. VS Code에서는 다양한 방식(터미널에서 또는 VS Code에서 바로 실행)으로 이를 실행할 수 있습니다. 이 데모에서는 Python 스크립트를 터미널에서 실행해야 합니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps\npython 02_load_raw.py\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\u003C/p\u003E\n","\u003Ch3\u003E로컬에서 Snowpark Python 실행\u003C/h3\u003E\n","\u003Cp\u003E이 단계에서는 노트북으로 로컬에서 Snowpark Python 코드를 실행하겠습니다. 스크립트 하단에는 로컬 디버깅에 사용되는 코드 블록(\u003Ccode\u003Eif __name__ == &quot;__main__&quot;:\u003C/code\u003E 블록 아래)이 있습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E# For local debugging\nif __name__ == &quot;__main__&quot;:\n    # Add the utils package to our path and import the snowpark_utils function\n    import os, sys\n    current_dir = os.getcwd()\n    parent_dir = os.path.dirname(current_dir)\n    sys.path.append(parent_dir)\n\n    from utils import snowpark_utils\n    session = snowpark_utils.get_snowpark_session()\n\n    load_all_raw_tables(session)\n#    validate_raw_tables(session)\n\n    session.close()\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E여기에서 몇 가지 중요한 점을 말씀드리겠습니다. 우선, Snowpark session은 \u003Ccode\u003Eutils/snowpark_utils.py\u003C/code\u003E 모듈에 생성됩니다. 자격 증명을 가져오는 방식은 다양하지만, 이 Quickstart에서는 \u003Ccode\u003E~/.snowsql/config\u003C/code\u003E에 있는 SnowSQL 구성 파일에서 자격 증명을 가져옵니다. 상세 정보는 \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python/blob/main/utils/snowpark_utils.py\"\u003Eutils/snowpark_utils.py 모듈\u003C/a\u003E의 코드에서 확인하십시오.\u003C/p\u003E\n","\u003Cp\u003ESnowpark session을 가져오고 나면, 이는 힘든 작업을 수행하는 \u003Ccode\u003Eload_all_raw_tables(session)\u003C/code\u003E 메소드를 호출합니다. 다음 몇 개의 섹션은 핵심 내용을 강조합니다.\u003C/p\u003E\n","\u003Cp\u003E마지막으로, 이 Quickstart의 거의 모든 Python 스크립트에는 로컬 디버깅 블록이 포함되어 있습니다. 추후에 Snowpark Python 저장 프로시저 및 UDF를 생성할 것이며 이러한 Python 스크립트는 비슷한 블록을 보유하게 됩니다. 따라서 이 패턴을 이해하는 것이 중요합니다.\u003C/p\u003E\n","\u003Ch3\u003ESnowflake에서 결과 확인\u003C/h3\u003E\n","\u003Cp\u003ESnowflake의 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/ui-snowsight-activity.html#query-history\"\u003E쿼리 내역\u003C/a\u003E은 매우 강력한 기능입니다. 쿼리를 시작한 도구나 프로세스와 관계없이 Snowflake 계정에 대해 실행되는 모든 쿼리를 기록합니다. 또한, 이 기능은 클라이언트 도구 및 API로 작업할 때 특히나 유용합니다.\u003C/p\u003E\n","\u003Cp\u003E방금 실행한 Python 스크립트는 로컬에서 적은 양의 작업을 수행했습니다. 기본적으로 각 테이블을 거치고 데이터를 로드하기 위해 명령을 Snowflake에 내려 프로세스를 조정했습니다. 하지만 모든 힘든 작업은 Snowflake 내부에서 실행되었습니다! 이 푸시다운은 Snowpark API의 특징이며 사용자가 Snowflake의 확장성과 컴퓨팅 파워를 활용할 수 있도록 합니다.\u003C/p\u003E\n","\u003Cp\u003ESnowflake 계정에 로그인하여 Snowpark API가 생성한 SQL을 잠깐 확인합니다. 이렇게 확인하면 API 현황을 더 잘 이해하고 발생할 수 있는 모든 이슈를 디버그하는 데 도움이 됩니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/query_history_sproc.png\" alt=\"assets/query_history_sproc.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E스키마 추론\u003C/h3\u003E\n","\u003Cp\u003ESnowflake의 매우 유용한 기능으로는 작업할 스테이지에서 파일 스키마를 추론하는 것이 있습니다. 이는 \u003Ca href=\"https://docs.snowflake.com/ko/sql-reference/functions/infer_schema.html\"\u003E\u003Ccode\u003EINFER_SCHEMA()\u003C/code\u003E\u003C/a\u003E 함수를 사용하여 SQL에서 완수됩니다. Snowpark Python API는 사용자가 \u003Ccode\u003Esession.read()\u003C/code\u003E 메소드를 호출하면 사용자를 대신해 자동으로 이 작업을 수행합니다. 코드 조각은 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    # we can infer schema using the parquet read option\n    df = session.read.option(&quot;compression&quot;, &quot;snappy&quot;) \\\n                            .parquet(location)\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003ECOPY를 사용한 데이터 수집\u003C/h3\u003E\n","\u003Cp\u003E데이터를 Snowflake 테이블에 로드하기 위해 DataFrame에서 \u003Ccode\u003Ecopy_into_table()\u003C/code\u003E 메소드를 사용하겠습니다. 이 메소드는 추론된 스키마(존재하지 않을 경우)를 사용하여 Snowflake에서 대상 테이블을 생성합니다. 그런 다음 고도로 최적화된 Snowflake \u003Ca href=\"https://docs.snowflake.com/ko/sql-reference/sql/copy-into-table.html\"\u003E\u003Ccode\u003ECOPY INTO &lt;table&gt;\u003C/code\u003E명령\u003C/a\u003E을 호출합니다. 코드 조각은 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    df.copy_into_table(&quot;{}&quot;.format(tname))\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003ESnowflake의 테이블 형식\u003C/h3\u003E\n","\u003Cp\u003ESnowflake의 주요 이점 중 하나는 파일 기반 데이터 레이크를 관리할 필요가 없다는 것입니다. 또한, Snowflake는 처음부터 이러한 목적을 염두에 두고 설계되었습니다. 이 단계에서는 가공 전 데이터를 정형 Snowflake 관리형 테이블에 로드하겠습니다. 하지만 Snowflake 테이블은 기본적으로 정형 및 반정형 데이터를 지원할 수 있습니다. 또한, Snowflake의 성숙한 클라우드 테이블 형식(Hudi, Delta 또는 Iceberg 이전)에 저장됩니다.\u003C/p\u003E\n","\u003Cp\u003E데이터는 Snowflake에 로드되면 안전하게 저장 및 관리됩니다. 가공 전 파일의 보호 및 관리를 걱정할 필요가 없습니다. 또한, 가공 전 데이터든 정형 데이터든 이러한 데이터는 SQL 또는 원하는 언어를 사용하여 Snowflake에서 변환 및 쿼리할 수 있습니다. Spark와 같은 별도의 컴퓨팅 서비스를 관리할 필요가 없습니다.\u003C/p\u003E\n","\u003Cp\u003E이는 Snowflake 고객이 누리는 엄청난 이점입니다.\u003C/p\u003E\n","\u003Ch3\u003E웨어하우스 탄력성(동적 규모 조정)\u003C/h3\u003E\n","\u003Cp\u003ESnowflake에는 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/warehouses.html\"\u003E가상 웨어하우스\u003C/a\u003E라는 단 하나의 사용자 정의 컴퓨팅 클러스터 유형이 있습니다. 사용하는 언어(SQL, Python, Java, Scala, Javascript 등)와 관계없이 이는 해당 데이터를 처리합니다. 즉, Snowflake에서 데이터로 작업하는 것이 훨씬 더 간단해집니다. 또한, 데이터 거버넌스는 컴퓨팅 클러스터와 완전히 분리되어 있습니다. 따라서 웨어하우스 설정 또는 사용하는 언어와 관계없이 Snowflake 거버넌스를 우회할 방법이 없습니다.\u003C/p\u003E\n","\u003Cp\u003E이러한 가상 웨어하우스의 크기는 동적으로 조정되며 1초 이내에 다양한 크기의 웨어하우스를 대부분 조정할 수 있습니다! 즉, 코드에서 동적으로 컴퓨팅 환경의 크기를 조정하여 짧은 시간 내에 코드 섹션을 실행할 용량을 늘릴 수 있습니다. 그런 다음 동적으로 크기를 다시 조정하여 용량을 줄일 수 있습니다. Snowflake는 요금을 초 단위로 청구하기에(최소 60초) 짧은 시간 내에 해당 코드 섹션을 실행하는 데 추가 요금을 지불하지 않아도 됩니다.\u003C/p\u003E\n","\u003Cp\u003E이 작업이 얼마나 쉬운지 알아보겠습니다. 코드 조각은 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    _ = session.sql(&quot;ALTER WAREHOUSE HOL_WH SET WAREHOUSE_SIZE = XLARGE WAIT_FOR_COMPLETION = TRUE&quot;).collect()\n\n    # Some data processing code\n\n    _ = session.sql(&quot;ALTER WAREHOUSE HOL_WH SET WAREHOUSE_SIZE = XSMALL&quot;).collect()\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E첫 번째 \u003Ccode\u003EALTER WAREHOUSE\u003C/code\u003E 문에 \u003Ccode\u003EWAIT_FOR_COMPLETION\u003C/code\u003E 매개변수가 포함되어 있다는 점도 참고하십시오. 이 매개변수를 \u003Ccode\u003ETRUE\u003C/code\u003E로 설정하면 크기 조정이 모든 컴퓨팅 리소스의 프로비저닝을 완료할 때까지 \u003Ccode\u003EALTER WAREHOUSE\u003C/code\u003E 명령의 반환을 차단하게 됩니다. 이렇게 하면 이를 사용하여 그 어떠한 데이터도 처리하기 전에 전체 클러스터를 확보할 수 있습니다.\u003C/p\u003E\n","\u003Cp\u003E이 Quickstart를 진행하는 동안 이 패턴을 몇 번 더 사용하겠습니다. 따라서 이 내용을 이해하는 것이 중요합니다.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E날씨 로드\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 가공 전 날씨 데이터를 Snowflake로 &lsquo;로드&rsquo;하겠습니다. 하지만 &lsquo;로드&rsquo;는 이 작업을 올바르게 설명하는 단어는 아닙니다. 왜냐하면 우리가 Snowflake의 고유한 데이터 공유 기능을 사용하기 때문입니다. 우리는 실질적으로 사용자 정의 ETL 프로세스를 사용하여 Snowflake 계정에 데이터를 복사할 필요가 없습니다. 대신 Snowflake 데이터 마켓플레이스에서 Weather Source가 공유하는 날씨 데이터에 바로 액세스할 수 있습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E3\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ESnowflake 데이터 마켓플레이스\u003C/h3\u003E\n","\u003Cp\u003EWeather Source는 선도적인 전 세계 날씨 및 기후 데이터 공급자입니다. 이 회사의 OnPoint Product Suite는 비즈니스가 여러 산업에 걸쳐 다양한 사용 사례에 대한 의미 있고 실행 가능한 인사이트를 빠르게 생성하는 데 필요한 날씨 및 기후 데이터를 제공합니다. 다음 단계에 따라 Snowflake 데이터 마켓플레이스에 등록된 Weather Source가 제공하는 \u003Ccode\u003EWeather Source LLC: frostbyte\u003C/code\u003E 피드와 연결하겠습니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowsight에 로그인합니다.\u003C/li\u003E\u003Cli\u003E왼쪽 탐색 메뉴에 있는 \u003Ccode\u003EMarketplace\u003C/code\u003E 링크를 클릭합니다.\u003C/li\u003E\u003Cli\u003E검색 상자에 &lsquo;Weather Source LLC: frostbyte&rsquo;를 입력하고 Return을 클릭합니다.\u003C/li\u003E\u003Cli\u003E&lsquo;Weather Source LLC: frostbyte&rsquo; 목록 타일을 클릭합니다.\u003C/li\u003E\u003Cli\u003E파란색 &lsquo;Get&rsquo; 버튼을 클릭합니다.\n\u003Cul\u003E\u003Cli\u003E&lsquo;Options&rsquo; 대화를 확장합니다.\u003C/li\u003E\u003Cli\u003E&lsquo;Database name&rsquo;을 &lsquo;FROSTBYTE_WEATHERSOURCE&rsquo;(전부 대문자)로 바꿉니다.\u003C/li\u003E\u003Cli\u003E새로운 데이터베이스에 대한 액세스를 보유하기 위해 &lsquo;HOL_ROLE&rsquo; 역할을 선택합니다.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E파란색 &lsquo;Get&rsquo; 버튼을 클릭합니다.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E끝났습니다. 이제 이 데이터를 업데이트하기 위해 그 어떠한 작업도 수행할 필요가 없습니다. 공급자가 대신 데이터를 업데이트하며 데이터가 공유되고 있기에 공급자가 게시하는 모든 것을 사용자가 항상 확인하게 됩니다. 놀라운 일입니다. 항상 최신 상태인 서드 파티 데이터 세트에 대한 액세스를 얻는 것이 얼마나 간단했는지 생각해 보십시오!\u003C/p\u003E\n","\u003Ch3\u003E스크립트 실행\u003C/h3\u003E\n","\u003Cp\u003E왼쪽 탐색 메뉴에 있는 파일 탐색기의 VS Code에서 \u003Ccode\u003Esteps/03_load_weather.sql\u003C/code\u003E 스크립트를 열고 해당 스크립트를 실행합니다. Snowflake 마켓플레이스를 통해 공유된 데이터를 쿼리하는 것이 이렇게 간단합니다! Snowflake에 있는 다른 테이블이나 뷰에 액세스하는 것처럼 액세스합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT * FROM FROSTBYTE_WEATHERSOURCE.ONPOINT_ID.POSTAL_CODES LIMIT 100;\n\u003C/code\u003E\u003C/pre\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EPOS 뷰 생성\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 6개의 각기 다른 테이블을 결합하고 필요한 열만 골라 뷰를 생성하여 가공 전 POS 스키마를 간소화하겠습니다. 정말 멋진 부분은 Snowpark DataFrame API로 해당 뷰를 정의하게 된다는 것입니다! 그런 다음 증분적으로 모든 POS 테이블에 대한 변경 사항을 처리할 수 있도록 해당 뷰에서 Snowflake 스트림을 생성하겠습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E4\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E스크립트 실행\u003C/h3\u003E\n","\u003Cp\u003E뷰와 스트림을 생성하려면 \u003Ccode\u003Esteps/04_create_pos_view.py\u003C/code\u003E 스크립트를 실행합니다. 2단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps\npython 04_create_pos_view.py\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\u003C/p\u003E\n","\u003Ch3\u003ESnowpark DataFrame API\u003C/h3\u003E\n","\u003Cp\u003E우선, \u003Ccode\u003Ecreate_pos_view()\u003C/code\u003E 함수에서 확인해야 하는 부분은 Snowpark DataFrame API를 사용하여 Snowflake 뷰를 정의하는 점입니다. 뷰에 있기를 원하는 모든 로직을 캡처하는 최종 DataFrame을 정의한 후 Snowpark \u003Ccode\u003Ecreate_or_replace_view()\u003C/code\u003E 메소드를 호출하기만 하면 됩니다. \u003Ccode\u003Ecreate_pos_view()\u003C/code\u003E 함수의 마지막 줄은 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    final_df.create_or_replace_view('POS_FLATTENED_V')\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ESnowpark Python DataFrame API에 대한 상세 정보는 \u003Ca href=\"https://docs.snowflake.com/ko/developer-guide/snowpark/python/working-with-dataframes.html\"\u003ESnowpark Python에서 DataFrame으로 작업하기\u003C/a\u003E 페이지에서 확인하십시오.\u003C/p\u003E\n","\u003Ch3\u003E증분적 처리를 위한 스트림(CDC)\u003C/h3\u003E\n","\u003Cp\u003ESnowflake는 증분적인 데이터 처리를 매우 쉽게 만듭니다. 전통적으로 데이터 엔지니어는 테이블에서 새로운 기록만을 처리하기 위해 상위 워터마크(일반적으로 날짜/시간 열)를 기록해야 했습니다. 이 작업을 위해 어딘가에서 해당 워터마크를 추적 및 지속한 다음 이를 소스 테이블에 대한 모든 쿼리에서 사용해야 했습니다. 하지만 Snowflake 스트림을 사용하면 모든 힘든 작업을 Snowflake가 대신 수행합니다. 상세 정보는 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/streams.html\"\u003E테이블 스트림을 사용한 변경 내용 추적\u003C/a\u003E 사용자 가이드에서 확인하십시오.\u003C/p\u003E\n","\u003Cp\u003E기본 테이블 또는 뷰에 대해 Snowflake에서 \u003Ca href=\"https://docs.snowflake.com/ko/sql-reference/sql/create-stream.html\"\u003E\u003Ccode\u003ESTREAM\u003C/code\u003E\u003C/a\u003E 객체를 생성하고 해당 스트림을 Snowflake에 있는 다른 테이블과 마찬가지로 쿼리하기만 하면 됩니다. 이 스트림은 수행한 마지막 DML 옵션 이후 변경된 기록만 반환합니다. 변경된 기록으로 작업하는 것을 돕기 위해 Snowflake 스트림은 다음 메타데이터 열과 기본 테이블 또는 뷰 열을 제공합니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EMETADATA$ACTION\u003C/li\u003E\u003Cli\u003EMETADATA$ISUPDATE\u003C/li\u003E\u003Cli\u003EMETADATA$ROW_ID\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E이러한 스트림 메타데이터 열에 대한 상세 정보는 Snowflake 설명서의 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/streams-intro.html#stream-columns\"\u003E스트림 열\u003C/a\u003E 섹션에서 확인하십시오.\u003C/p\u003E\n","\u003Ch3\u003E뷰의 스트림\u003C/h3\u003E\n","\u003Cp\u003ESnowflake의 증분적 및 CDC 스트림 기능에서 정말 멋진 부분은 뷰에서 스트림을 생성할 수 있다는 점입니다! 이 사례에서는 6개의 가공 전 POS 테이블을 결합한 뷰에서 스트림을 생성하겠습니다. 이 작업을 위한 코드는 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Edef create_pos_view_stream(session):\n    session.use_schema('HARMONIZED')\n    _ = session.sql('CREATE OR REPLACE STREAM POS_FLATTENED_V_STREAM \\\n                        ON VIEW POS_FLATTENED_V \\\n                        SHOW_INITIAL_ROWS = TRUE').collect()\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E변경된 기록을 찾기 위해 \u003Ccode\u003EPOS_FLATTENED_V_STREAM\u003C/code\u003E 스트림을 쿼리할 때 Snowflake는 실질적으로 뷰에 포함된 6개의 테이블 중 아무 테이블에서 변경된 기록을 찾습니다. 이와 같은 비정규화된 스키마에 대한 증분적 및 CDC 프로세스를 구축하려고 시도한 경험이 있는 분이라면, 여기에서 Snowflake가 제공하는 매우 강력한 기능의 진가를 알아볼 것입니다.\u003C/p\u003E\n","\u003Cp\u003E상세 정보는 Snowflake 설명서의 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/streams-intro.html#streams-on-views\"\u003E뷰의 스트림\u003C/a\u003E 섹션에서 확인하십시오.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E화씨 섭씨 변환 UDF\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 첫 번째 Snowpark Python 객체를 생성하고 이를 사용자 정의 함수(또는 UDF)인 Snowflake에 배포하겠습니다. 처음에는 UDF가 매우 단순하지만, 추후 단계에서는 서드 파티 Python 패키지를 포함하도록 업데이트할 것입니다. 또한, 이 단계에서는 새로운 개발자 명령줄 도구인 새로운 SnowCLI를 소개하겠습니다. SnowCLI는 개발자가 Snowpark Python 객체를 구축하고 이를 Snowflake로 배포하는 경험을 일관되게 만듭니다. SnowCLI에 대한 상세 정보는 다음과 같습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E5\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E로컬에서 UDF 실행\u003C/h3\u003E\n","\u003Cp\u003E로컬에서 UDF를 테스트하려면 \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/app.py\u003C/code\u003E 스크립트를 실행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/05_fahrenheit_to_celsius_udf\npython app.py 35\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EUDF를 개발하는 동안 간단히 로컬에서 VS Code로 이를 실행할 수 있습니다. 또한, UDF가 Snowflake의 데이터를 쿼리할 필요가 없다면 이 프로세스는 전부 로컬에서 진행됩니다.\u003C/p\u003E\n","\u003Ch3\u003EUDF를 Snowflake에 배포\u003C/h3\u003E\n","\u003Cp\u003EUDF를 Snowflake에 배포하기 위해 SnowCLI 도구를 사용하겠습니다. SnowCLI 도구는 애플리케이션을 패키지로 만들고, 이를 Snowflake 스테이지에 복사하고, Snowflake에서 객체를 생성하는 모든 힘든 작업을 수행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/05_fahrenheit_to_celsius_udf\nsnow function create\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\u003C/p\u003E\n","\u003Ch3\u003ESnowflake에서 UDF 실행\u003C/h3\u003E\n","\u003Cp\u003ESnowflake에서 UDF를 실행하는 방법에는 여러 가지가 있습니다. Snowflake에서 모든 UDF는 다음과 같이 SQL을 통해 호출할 수 있습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT ANALYTICS.FAHRENHEIT_TO_CELSIUS_UDF(35);\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E또한, SnowCLI 유틸리티를 사용하면 다음과 같이 VS Code의 터미널에서 UDF를 호출할 수 있습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow function execute -f &quot;fahrenheit_to_celsius_udf(35)&quot;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E결과적으로 SnowCLI 도구는 위 SQL 쿼리를 생성하고 이를 Snowflake 계정에 대해 실행합니다.\u003C/p\u003E\n","\u003Ch3\u003ESnowCLI 도구 개요\u003C/h3\u003E\n","\u003Cp\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/snowcli\"\u003ESnowCLI\u003C/a\u003E 도구는 개발자를 위한 명령줄 도구이며 명령줄에서 \u003Ccode\u003Esnow\u003C/code\u003E로 실행됩니다.\u003C/p\u003E\n\u003Cblockquote\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003ESnowCLI는 다음 Snowflake 객체의 개발 및 배포를 간소화합니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowpark Python UDF\u003C/li\u003E\u003Cli\u003ESnowpark Python 저장 프로시저\u003C/li\u003E\u003Cli\u003EStreamlit 애플리케이션\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E이 Quickstart에서는 처음 두 개의 객체를 집중적으로 다루겠습니다. SnowCLI는 특히나 Snowpark Python UDF와 저장 프로시저를 위해 객체를 Snowflake에 배포하는 모든 힘든 작업을 수행합니다. SnowCLI 배포 명령이 대신 수행하는 단계를 간략히 요약하면 다음과 같습니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E서드 파티 패키지 처리\n\u003Cul\u003E\u003Cli\u003EAnaconda 채널에서 바로 액세스할 수 있는 패키지의 경우, SnowCLI는 \u003Ccode\u003ECREATE PROCEDURE\u003C/code\u003E 또는 \u003Ccode\u003ECREATE FUNCTION\u003C/code\u003E SQL 명령의 \u003Ccode\u003EPACKAGES\u003C/code\u003E 목록에 이를 추가합니다.\u003C/li\u003E\u003Cli\u003E현재 Anaconda 채널에서 제공되지 않는 패키지의 경우, SnowCLI는 코드를 다운로드하고 이를 프로젝트 압축 파일에 포함시킵니다.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E프로젝트에 있는 모든 것의 압축 파일 생성\u003C/li\u003E\u003Cli\u003ESnowflake 스테이지에 해당 프로젝트 압축 파일 복사\u003C/li\u003E\u003Cli\u003ESnowflake 함수 또는 저장 프로시저 객체 생성\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E이렇게 하면 Python 애플리케이션을 해당하는 Snowflake 데이터베이스 객체로 만드는 것을 걱정하지 않고 개발 및 테스트할 수 있습니다.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003E참고\u003C/strong\u003E - 2023년 2월 1일 기준으로 SnowCLI 도구는 아직 미리 보기 단계에 있습니다.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ESnowpark Python UDF에 대한 추가 정보\u003C/h3\u003E\n","\u003Cp\u003E이 단계에서는 아주 단순한 Python UDF를 Snowflake에 배포했습니다. 추후 단계는 서드 파티 패키지를 사용하도록 업데이트됩니다. 또한, SnowCLI 명령으로 이를 Snowflake에 배포했기 때문에 Snowflake에서 객체를 생성하기 위한 SQL DDL 구문을 걱정할 필요가 없었습니다. 단, 참고를 위해 \u003Ca href=\"https://docs.snowflake.com/ko/developer-guide/udf/python/udf-python.html\"\u003EPython UDF 작성하기\u003C/a\u003E 개발자 가이드를 확인해 주시기 바랍니다.\u003C/p\u003E\n","\u003Cp\u003ESnowCLI 도구가 함수를 배포하기 위해 생성한 SQL 쿼리는 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE OR REPLACE  FUNCTION fahrenheit_to_celsius_udf(temp_f float)\n         RETURNS float\n         LANGUAGE PYTHON\n         RUNTIME_VERSION=3.8\n         IMPORTS=('@HOL_DB.ANALYTICS.deployments/fahrenheit_to_celsius_udftemp_f_float/app.zip')\n         HANDLER='app.main'\n         PACKAGES=();\n\u003C/code\u003E\u003C/pre\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E주문 업데이트 저장 프로시저\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 첫 번째 Snowpark Python 저장 프로시저를 생성하고 이를 Snowflake에 배포하겠습니다. 이 저장 프로시저는 \u003Ccode\u003EHARMONIZED.POS_FLATTENED_V_STREAM\u003C/code\u003E 스트림의 변경 사항을 대상 \u003Ccode\u003EHARMONIZED.ORDERS\u003C/code\u003E 테이블과 병합합니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E6\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E로컬에서 저장 프로시저 실행\u003C/h3\u003E\n","\u003Cp\u003E로컬에서 프로시저를 테스트하려면 \u003Ccode\u003Esteps/06_orders_update_sp/app.py\u003C/code\u003E 스크립트를 실행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/06_orders_update_sp\npython app.py\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E저장 프로시저를 개발하는 동안 간단히 로컬에서 VS Code로 이를 실행할 수 있습니다. Python 코드는 노트북으로 로컬에서 실행되지만, Snowpark DataFrame 코드는 Snowflake 계정에 SQL 쿼리를 발급하게 됩니다.\u003C/p\u003E\n","\u003Ch3\u003E저장 프로시저를 Snowflake에 배포\u003C/h3\u003E\n","\u003Cp\u003E저장 프로시저를 Snowflake에 배포하기 위해 SnowCLI 도구를 사용하겠습니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/06_orders_update_sp\nsnow procedure create\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\u003C/p\u003E\n","\u003Ch3\u003ESnowflake에서 저장 프로시저 실행\u003C/h3\u003E\n","\u003Cp\u003ESnowflake에서 저장 프로시저를 실행하는 방법에는 여러 가지가 있습니다. Snowflake에서 모든 저장 프로시저는 다음과 같이 SQL을 통해 호출할 수 있습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECALL ORDERS_UPDATE_SP();\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E또한, SnowCLI 유틸리티를 사용하면 다음과 같이 VS Code의 터미널에서 UDF를 호출할 수 있습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow procedure execute -p &quot;orders_update_sp()&quot;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E결과적으로 SnowCLI 도구는 위 SQL 쿼리를 생성하고 이를 Snowflake 계정에 대해 실행합니다.\u003C/p\u003E\n","\u003Ch3\u003ESnowpark Python 저장 프로시저에 대한 추가 정보\u003C/h3\u003E\n","\u003Cp\u003E이 단계에서는 Python 저장 프로시저를 Snowflake에 배포했습니다. 또한, SnowCLI 명령으로 이를 Snowflake에 배포했기 때문에 Snowflake에서 객체를 생성하기 위한 SQL DDL 구문을 걱정할 필요가 없었습니다. 단, 참고를 위해 \u003Ca href=\"https://docs.snowflake.com/ko/sql-reference/stored-procedures-python.html\"\u003ESnowpark(Python)로 저장 프로시저 작성하기\u003C/a\u003E 가이드를 확인해 주시기 바랍니다.\u003C/p\u003E\n","\u003Cp\u003ESnowCLI 도구가 프로시저를 배포하기 위해 생성한 SQL 쿼리는 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE OR REPLACE  PROCEDURE orders_update_sp()\n         RETURNS string\n         LANGUAGE PYTHON\n         RUNTIME_VERSION=3.8\n         IMPORTS=('@HOL_DB.HARMONIZED.deployments/orders_update_sp/app.zip')\n         HANDLER='app.main'\n         PACKAGES=('snowflake-snowpark-python','toml')\n        EXECUTE AS CALLER;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003ESnowpark API에 대한 추가 정보\u003C/h3\u003E\n","\u003Cp\u003E이 단계에서는 데이터 변환을 위해 실질적으로 Snowpark DataFrame API를 사용하기 시작합니다. Snowpark API는 \u003Ca href=\"https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/index.html\"\u003ESpark SQL API\u003C/a\u003E로 동일한 기능을 제공합니다. 시작하려면 Snowpark session 객체를 생성해야 합니다. PySpark와 비슷하게 이는 \u003Ccode\u003ESession.builder.configs().create()\u003C/code\u003E 메소드로 완수됩니다. 로컬에서 실행할 때는 \u003Ccode\u003Eutils.snowpark_utils.get_snowpark_session()\u003C/code\u003E 도우미 함수를 사용하여 대신 session 객체를 생성합니다. 하지만 Snowflake에 배포할 때는 Snowflake가 자동으로 대신 session 객체를 프로비저닝합니다. 또한, 계약에 따르면 Snowpark Python 저장 프로시저를 구축할 때 진입점(또는 핸들러) 함수에 대한 첫 번째 인수는 Snowpark session입니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Ccode\u003Esteps/06_orders_update_sp/app.py\u003C/code\u003E 스크립트에서 관찰할 수 있는 첫 번째 부분은 Snowflake에서 객체를 생성하고 객체 상태를 확인하기 위해 SQL을 사용하는 몇몇 함수가 있다는 것입니다. Snowpark API로 Snowflake에 SQL 문을 발급하려면 예상할 수 있듯이 \u003Ccode\u003Esession.sql()\u003C/code\u003E 함수를 사용합니다. 하나의 사례는 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Edef create_orders_stream(session):\n    _ = session.sql(&quot;CREATE STREAM IF NOT EXISTS HARMONIZED.ORDERS_STREAM ON TABLE HARMONIZED.ORDERS \\\n                    SHOW_INITIAL_ROWS = TRUE;&quot;).collect()\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E강조할 두 번째 부분은 소스 뷰에서 대상 테이블로 변경 사항을 병합하기 위해 DataFrame을 사용하는 방법입니다. Snowpark DataFrame API는 \u003Ccode\u003Emerge()\u003C/code\u003E 메소드를 제공합니다. 이는 결과적으로 Snowflake에서 \u003Ccode\u003EMERGE\u003C/code\u003E 명령을 생성합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003E    source = session.table('HARMONIZED.POS_FLATTENED_V_STREAM')\n    target = session.table('HARMONIZED.ORDERS')\n\n    # TODO: Is the if clause supposed to be based on &quot;META_UPDATED_AT&quot;?\n    cols_to_update = {c: source[c] for c in source.schema.names if &quot;METADATA&quot; not in c}\n    metadata_col_to_update = {&quot;META_UPDATED_AT&quot;: F.current_timestamp()}\n    updates = {**cols_to_update, **metadata_col_to_update}\n\n    # merge into DIM_CUSTOMER\n    target.merge(source, target['ORDER_DETAIL_ID'] == source['ORDER_DETAIL_ID'], \\\n                        [F.when_matched().update(updates), F.when_not_matched().insert(updates)])\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E다시 한번, Snowpark Python DataFrame API에 대한 상세 정보는 \u003Ca href=\"https://docs.snowflake.com/ko/developer-guide/snowpark/python/working-with-dataframes.html\"\u003ESnowpark Python에서 DataFrame으로 작업하기\u003C/a\u003E 페이지에서 확인하십시오.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E일일 도시 지표 업데이트 저장 프로시저\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 두 번째 Snowpark Python 저장 프로시저를 생성하고 이를 Snowflake에 배포하겠습니다. 이 저장 프로시저는 \u003Ccode\u003EANALYTICS.DAILY_CITY_METRICS\u003C/code\u003E라는 분석을 위해 집계된 최종 테이블을 생성하기 위해 \u003Ccode\u003EHARMONIZED.ORDERS\u003C/code\u003E 데이터와 Weather Source 데이터를 결합합니다. 다른 Snowflake 스트림을 사용하여 해당 데이터를 \u003Ccode\u003EHARMONIZED.ORDERS\u003C/code\u003E 테이블에서 증분적으로 처리하겠습니다. 또한, 다시 한번 Snowpark DataFrame \u003Ccode\u003Emerge()\u003C/code\u003E 메소드를 사용하여 데이터를 병합 또는 업서트하겠습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E7\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E로컬에서 저장 프로시저 실행\u003C/h3\u003E\n","\u003Cp\u003E로컬에서 프로시저를 테스트하려면 \u003Ccode\u003Esteps/07_daily_city_metrics_update_sp/app.py\u003C/code\u003E 스크립트를 실행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/07_daily_city_metrics_update_sp\npython app.py\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E저장 프로시저를 개발하는 동안 간단히 로컬에서 VS Code로 이를 실행할 수 있습니다. Python 코드는 노트북으로 로컬에서 실행되지만, Snowpark DataFrame 코드는 Snowflake 계정에 SQL 쿼리를 발급하게 됩니다.\u003C/p\u003E\n","\u003Ch3\u003E저장 프로시저를 Snowflake에 배포\u003C/h3\u003E\n","\u003Cp\u003E저장 프로시저를 Snowflake에 배포하기 위해 SnowCLI 도구를 사용하겠습니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/07_daily_city_metrics_update_sp\nsnow procedure create\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\u003C/p\u003E\n","\u003Ch3\u003ESnowflake에서 저장 프로시저 실행\u003C/h3\u003E\n","\u003Cp\u003ESnowflake에서 저장 프로시저를 실행하는 방법에는 여러 가지가 있습니다. Snowflake에서 모든 저장 프로시저는 다음과 같이 SQL을 통해 호출할 수 있습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECALL DAILY_CITY_METRICS_UPDATE_SP();\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E또한, SnowCLI 유틸리티를 사용하면 다음과 같이 VS Code의 터미널에서 UDF를 호출할 수 있습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow procedure execute -p &quot;daily_city_metrics_update_sp()&quot;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E결과적으로 SnowCLI 도구는 위 SQL 쿼리를 생성하고 이를 Snowflake 계정에 대해 실행합니다.\u003C/p\u003E\n","\u003Ch3\u003E데이터 모델링 모범 사례\u003C/h3\u003E\n","\u003Cp\u003E분석을 위해 데이터를 모델링할 때의 모범 사례는 테이블의 스키마를 명확히 정의하고 관리하는 것이었습니다. 가공 전 데이터를 Parquet에서 로드한 2단계에서는 Snowflake의 스키마 감지 기능의 이점을 활용하여 Parquet 파일과 동일한 스키마로 테이블을 생성했습니다. 이 단계에서는 DataFrame 구문에서 스키마를 확실하게 정의하고 이를 사용하여 테이블을 생성합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Edef create_daily_city_metrics_table(session):\n    SHARED_COLUMNS= [T.StructField(&quot;DATE&quot;, T.DateType()),\n                                        T.StructField(&quot;CITY_NAME&quot;, T.StringType()),\n                                        T.StructField(&quot;COUNTRY_DESC&quot;, T.StringType()),\n                                        T.StructField(&quot;DAILY_SALES&quot;, T.StringType()),\n                                        T.StructField(&quot;AVG_TEMPERATURE_FAHRENHEIT&quot;, T.DecimalType()),\n                                        T.StructField(&quot;AVG_TEMPERATURE_CELSIUS&quot;, T.DecimalType()),\n                                        T.StructField(&quot;AVG_PRECIPITATION_INCHES&quot;, T.DecimalType()),\n                                        T.StructField(&quot;AVG_PRECIPITATION_MILLIMETERS&quot;, T.DecimalType()),\n                                        T.StructField(&quot;MAX_WIND_SPEED_100M_MPH&quot;, T.DecimalType()),\n                                    ]\n    DAILY_CITY_METRICS_COLUMNS = [*SHARED_COLUMNS, T.StructField(&quot;META_UPDATED_AT&quot;, T.TimestampType())]\n    DAILY_CITY_METRICS_SCHEMA = T.StructType(DAILY_CITY_METRICS_COLUMNS)\n\n    dcm = session.create_dataframe([[None]*len(DAILY_CITY_METRICS_SCHEMA.names)], schema=DAILY_CITY_METRICS_SCHEMA) \\\n                        .na.drop() \\\n                        .write.mode('overwrite').save_as_table('ANALYTICS.DAILY_CITY_METRICS')\n    dcm = session.table('ANALYTICS.DAILY_CITY_METRICS')\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003E복잡한 집계 쿼리\u003C/h3\u003E\n","\u003Cp\u003E\u003Ccode\u003Emerge_daily_city_metrics()\u003C/code\u003E 함수에는 복잡한 집계 쿼리가 포함되어 있습니다. 이는 POS 및 Weather Source 데이터를 결합 및 집계하기 위해 사용됩니다. 표현된 복잡한 일련의 조인 및 집계를 살펴보고 5단계에서 생성한 Snowpark UDF도 활용하는 모습을 확인해 보십시오!\u003C/p\u003E\n","\u003Cp\u003E그런 다음 복잡한 집계 쿼리는 Snowpark \u003Ccode\u003Emerge()\u003C/code\u003E 메소드를 사용하여 최종 분석 테이블과 병합됩니다. 아직 확인하지 않았다면 Snowflake 쿼리 내역을 확인하여 Snowpark API가 어떤 쿼리를 생성했는지 알아보십시오. 이 경우, Snowpark API는 병합을 비롯한 모든 복잡한 로직을 사용하고 실행할 단일 Snowflake 쿼리를 생성했을 것입니다!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E작업 조정\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 새로운 Snowpark 파이프라인과 Snowflake의 기본 오케스트레이션 기능인 작업을 조정하겠습니다. 각 저장 프로시저를 위한 2개의 작업을 생성하고 이를 연결하겠습니다. 그런 다음 작업을 실행하겠습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E8\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E스크립트 실행\u003C/h3\u003E\n","\u003Cp\u003E이는 SQL 스크립트이므로 이를 실행하기 위해 네이티브 VS Code 확장 프로그램을 사용하겠습니다. 간단히 VS Code에서 \u003Ccode\u003Esteps/08_orchestrate_jobs.sql\u003C/code\u003E 스크립트를 열고 편집기 창의 오른쪽 상단 모서리에 있는 &lsquo;Execute All Statements&rsquo; 버튼을 사용하여 모든 것을 실행합니다.\u003C/p\u003E\n","\u003Cp\u003E실행되는 동안 VS Code에서 스크립트를 읽고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\u003C/p\u003E\n","\u003Ch3\u003E작업 실행\u003C/h3\u003E\n","\u003Cp\u003E이 단계에서는 작업 DAG를 위한 일정을 생성하지 않았습니다. 따라서 이 지점에서는 스스로 실행되지 않습니다. 이 스크립트는 다음과 같이 DAG를 수동으로 실행하게 됩니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EEXECUTE TASK ORDERS_UPDATE_TASK;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E이 작업을 방금 실행했을 때의 결과를 확인하려면 스크립트에서 이 주석이 달린 쿼리를 선택 및 실행(CMD/CTRL+Enter 바로 가기 키 사용)합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=&gt;DATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =&gt; 100))\nORDER BY SCHEDULED_TIME DESC\n;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E작업 기록 출력에서 \u003Ccode\u003EORDERS_UPDATE_TASK\u003C/code\u003E 작업을 건너뛰었다는 것을 알 수 있습니다. \u003Ccode\u003EHARMONIZED.POS_FLATTENED_V_STREAM\u003C/code\u003E 스트림에는 데이터가 없기에 이는 올바른 내용입니다. 몇 가지 새로운 데이터를 추가하고 다음 단계에서 다시 실행하겠습니다.\u003C/p\u003E\n","\u003Ch3\u003E작업에 대한 추가 정보\u003C/h3\u003E\n","\u003Cp\u003E작업은 Snowflake의 기본 일정 관리 또는 오케스트레이션 기능입니다. 작업으로 다음 SQL 코드 유형 중 하나를 실행할 수 있습니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E단일 SQL 문\u003C/li\u003E\u003Cli\u003E저장 프로시저 호출\u003C/li\u003E\u003Cli\u003ESnowflake Scripting 개발자 가이드를 사용한 프로시저 로직\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E이 Quickstart에서는 Snowpark 저장 프로시저를 호출하겠습니다 두 번째 작업을 생성하기 위한 SQL DDL 코드는 다음과 같습니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ECREATE OR REPLACE TASK DAILY_CITY_METRICS_UPDATE_TASK\nWAREHOUSE = HOL_WH\nAFTER ORDERS_UPDATE_TASK\nWHEN\n  SYSTEM$STREAM_HAS_DATA('ORDERS_STREAM')\nAS\nCALL ANALYTICS.DAILY_CITY_METRICS_UPDATE_SP();\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E몇 가지 중요한 점을 말씀드리겠습니다. 우선, \u003Ccode\u003EWAREHOUSE\u003C/code\u003E 절로 작업을 실행할 때 사용할 Snowflake 가상 웨어하우스를 지정합니다. \u003Ccode\u003EAFTER\u003C/code\u003E 절을 통해 여러 작업 간의 관계를 정의할 수 있습니다. 또한, 이 관계의 구조는 오케스트레이션 도구 대부분이 제공하는 것처럼 방향성 비순환 그래프(또는 DAG)입니다. \u003Ccode\u003EAS\u003C/code\u003E 절을 통해 작업이 실행되면 수행하는 작업을 정의할 수 있습니다. 이 경우, 저장 프로시저를 호출하는 것입니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Ccode\u003EWHEN\u003C/code\u003E 절은 정말 훌륭합니다. 데이터를 증분적으로 처리하도록 하여 Snowflake에서 스트림이 작동하는 모습을 이미 확인했습니다. 뷰(여러 테이블을 결합함)에서 스트림을 생성하고 데이터를 증분적으로 처리하기 위해 해당 뷰에서 스트림을 생성하는 방법도 확인했습니다! \u003Ccode\u003EWHEN\u003C/code\u003E 절에서는 지정된 스트림에 새로운 데이터가 있으면 참을 반환하는 \u003Ccode\u003ESYSTEM$STREAM_HAS_DATA()\u003C/code\u003E 시스템 함수를 호출하고 있습니다. \u003Ccode\u003EWHEN\u003C/code\u003E 절을 사용하면 가상 웨어하우스는 스트림에 새로운 데이터가 있을 때만 시작됩니다. 따라서 작업이 실행될 때 새로운 데이터가 없다면 웨어하우스가 시작되지 않고 요금이 부과되지 않습니다. 처리할 새로운 데이터가 있을 때만 요금이 부과됩니다. 훌륭한 기능입니다.\u003C/p\u003E\n","\u003Cp\u003E앞서 말씀드렸듯이 루트 작업의 \u003Ccode\u003ESCHEDULE\u003C/code\u003E을 정의하지 않았기에 이 DAG는 스스로 실행되지 않습니다. 이 Quickstart에서는 괜찮지만 현실에서는 일정을 정의해야 합니다. 상세 정보는 \u003Ca href=\"https://docs.snowflake.com/ko/sql-reference/sql/create-task.html\"\u003ECREATE TASK\u003C/a\u003E에서 확인하십시오.\u003C/p\u003E\n","\u003Cp\u003E또한, 작업에 대한 상세 정보는 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/tasks-intro.html\"\u003E작업 소개\u003C/a\u003E에서 확인하십시오.\u003C/p\u003E\n","\u003Ch3\u003E작업 메타데이터\u003C/h3\u003E\n","\u003Cp\u003ESnowflake는 사용자가 수행하는 거의 모든 작업의 메타데이터를 보관하고 쿼리(및 이에 대한 모든 프로세스 유형을 생성)할 수 있도록 이러한 메타데이터를 제공합니다. 작업이라고 다르지 않습니다. Snowflake는 방대한 양의 메타데이터를 유지하여 작업 실행의 모니터링을 돕습니다. 다음은 작업 실행을 모니터링하기 위해 사용할 수 있는 몇 가지 샘플 SQL 쿼리입니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Get a list of tasks\nSHOW TASKS;\n\n-- Task execution history in the past day\nSELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=&gt;DATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =&gt; 100))\nORDER BY SCHEDULED_TIME DESC\n;\n\n-- Scheduled task runs\nSELECT\n    TIMESTAMPDIFF(SECOND, CURRENT_TIMESTAMP, SCHEDULED_TIME) NEXT_RUN,\n    SCHEDULED_TIME,\n    NAME,\n    STATE\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())\nWHERE STATE = 'SCHEDULED'\nORDER BY COMPLETED_TIME DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003E작업 모니터링\u003C/h3\u003E\n","\u003Cp\u003E원하는 운영 또는 모니터링 프로세스를 자유롭게 생성할 수 있지만, Snowflake는 Snowsight UI에서 다양한 작업 관측 가능성 기능을 제공합니다. 다음 단계에 따라 직접 사용해 보십시오.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003ESnowsight 탐색 메뉴에서 \u003Cstrong\u003EData\u003C/strong\u003E &raquo; \u003Cstrong\u003EDatabases\u003C/strong\u003E를 클릭합니다.\u003C/li\u003E\u003Cli\u003E오른쪽 창에서 객체 탐색기를 사용하여 데이터베이스와 스키마로 이동합니다.\u003C/li\u003E\u003Cli\u003E선택한 스키마에 대해 \u003Cstrong\u003ETasks\u003C/strong\u003E를 선택하고 확장합니다.\u003C/li\u003E\u003Cli\u003E작업을 선택합니다. \u003Cstrong\u003ETask Details\u003C/strong\u003E, \u003Cstrong\u003EGraph\u003C/strong\u003E 및 \u003Cstrong\u003ERun History\u003C/strong\u003E 하위 탭을 비롯한 작업 정보가 표시됩니다.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EGraph\u003C/strong\u003E 탭을 선택합니다. 하위 작업의 계층 구조를 표시하는 작업 그래프가 나타납니다.\u003C/li\u003E\u003Cli\u003E세부 정보를 보려면 작업을 선택합니다.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E작업 그래프는 다음과 같습니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/ui-snowsight-task-graph.png\" alt=\"assets/ui-snowsight-task-graph.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E또한, 작업 실행 기록의 사례는 다음과 같습니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/ui-snowsight-task-run-history.png\" alt=\"assets/ui-snowsight-task-run-history.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E상세 정보와 계정 수준 작업 기록을 확인하는 것에 대해 알아보려면 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/ui-snowsight-tasks.html\"\u003E작업 기록 보기\u003C/a\u003E 설명서를 확인하십시오.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E증분적 처리\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 새로운 데이터를 POS 주문 테이블에 추가한 다음 새로운 데이터를 처리하기 위해 전체 엔드 투 엔드 파이프라인을 실행하겠습니다. 또한, 이 전체 파이프라인은 Snowflake의 고급 스트림 및 CDC 기능을 활용하여 데이터를 증분적으로 처리하게 됩니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E9\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E스크립트 실행\u003C/h3\u003E\n","\u003Cp\u003E이는 SQL 스크립트이므로 이를 실행하기 위해 네이티브 VS Code 확장 프로그램을 사용하겠습니다. 간단히 VS Code에서 \u003Ccode\u003Esteps/09_process_incrementally.sql\u003C/code\u003E 스크립트를 열고 편집기 창의 오른쪽 상단 모서리에 있는 &lsquo;Execute All Statements&rsquo; 버튼을 사용하여 모든 것을 실행합니다.\u003C/p\u003E\n","\u003Cp\u003E실행되는 동안 현황을 간략히 알아보겠습니다. 2단계와 마찬가지로 Parquet의 데이터를 가공 전 POS 테이블로 로드하겠습니다. 2단계에서는 \u003Ccode\u003EORDER_HEADER\u003C/code\u003E 및 \u003Ccode\u003EORDER_DETAIL\u003C/code\u003E의 2022년 데이터를 제외한 모든 주문 데이터를 로드했습니다. 따라서 이제 나머지 데이터를 로드하겠습니다.\u003C/p\u003E\n","\u003Cp\u003E이번에는 Python 대신 SQL을 통해 데이터를 로드하겠습니다. 하지만 프로세스는 동일합니다. 웨어하우스의 크기를 조정하겠습니다. 데이터를 더 빠르게 로드할 수 있도록 크기를 늘린 다음 작업이 끝나면 크기를 다시 줄이겠습니다. 또한, 새로운 데이터가 로드된 후 작업 DAG를 다시 실행하겠습니다. 이번에는 2개의 작업이 모두 실행되며 새로운 데이터를 처리합니다.\u003C/p\u003E\n","\u003Ch3\u003E작업 기록 보기\u003C/h3\u003E\n","\u003Cp\u003E이전 단계와 마찬가지로 이 작업 DAG를 실행했을 때의 결과를 확인하려면 스크립트에서 이 주석이 달린 쿼리를 선택 및 실행(CMD/CTRL+Enter 바로 가기 키 사용)합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=&gt;DATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =&gt; 100))\nORDER BY SCHEDULED_TIME DESC\n;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E이번에는 \u003Ccode\u003EHARMONIZED.POS_FLATTENED_V_STREAM\u003C/code\u003E 스트림에 새로운 데이터가 있기에 \u003Ccode\u003EORDERS_UPDATE_TASK\u003C/code\u003E 작업을 건너뛰지 않을 것입니다. 몇 분 후에 \u003Ccode\u003EORDERS_UPDATE_TASK\u003C/code\u003E 작업과 \u003Ccode\u003EDAILY_CITY_METRICS_UPDATE_TASK\u003C/code\u003E 작업이 성공적으로 완료된 것을 확인할 수 있습니다.\u003C/p\u003E\n","\u003Ch3\u003E작업의 쿼리 내역\u003C/h3\u003E\n","\u003Cp\u003E작업을 이해하는 데 한 가지 중요한 점은 작업으로 실행되는 쿼리가 기본 쿼리 내역 UI 설정을 사용하면 나타나지 않는다는 것입니다. 방금 실행한 쿼리를 확인하려면 다음 작업을 수행해야 합니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E추후에 예정된 작업은 &lsquo;System&rsquo;으로 실행되니 이 테이블의 상단에서 필터(사용자 이름 포함)를 제거합니다.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/query_history_remove_filter1.png\" alt=\"\"\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E&lsquo;Filter&rsquo;를 클릭하고, &lsquo;Queries executed by user tasks&rsquo; 필터 옵션을 추가하고, &lsquo;Apply Filters&rsquo;를 클릭합니다.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/query_history_remove_filter2.png\" alt=\"\"\u003E\u003C/p\u003E\n","\u003Cp\u003E이제 작업이 실행하는 모든 쿼리를 확인할 수 있습니다! 쿼리 내역에서 각 MERGE 명령을 살펴보고 각 작업이 몇 개의 기록을 처리했는지 확인합니다. 방금 전체 파이프라인을 처리했으며 증분적으로 진행되었다는 사실을 기억해 주시기 바랍니다!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ECI/CD를 통한 배포\u003C/h2\u003E\n","\u003Cp\u003E이 단계에서는 \u003Ccode\u003EFAHRENHEIT_TO_CELSIUS_UDF()\u003C/code\u003E UDF에 변경 사항을 적용하고 이를 CI/CD 파이프라인을 통해 배포하겠습니다. 서드 파티 Python 패키지를 사용하기 위해 \u003Ccode\u003EFAHRENHEIT_TO_CELSIUS_UDF()\u003C/code\u003E UDF를 업데이트하고, 이를 포크된 GitHub 리포지토리로 푸시하고, 마지막으로 GitHub Actions 워크플로우에서 SnowCLI를 사용하여 이를 배포하겠습니다! 콘텍스트에 적용하기 위해 데이터 흐름 개요의 \u003Cstrong\u003E10\u003C/strong\u003E단계로 이동합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003E화씨 섭씨 변환 UDF 업데이트\u003C/h3\u003E\n","\u003Cp\u003E하드 코드된 온도 변환을 \u003Ccode\u003Escipy\u003C/code\u003E의 패키지로 바꾸겠습니다. 우선, \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/app.py\u003C/code\u003E 스크립트에 몇 가지 변경 사항을 적용하겠습니다. 이 파일에서는 \u003Ccode\u003Eimport\u003C/code\u003E 명령을 추가하고 \u003Ccode\u003Emain()\u003C/code\u003E 함수의 본문을 바꾸겠습니다. VS Code에서 \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/app.py\u003C/code\u003E 스크립트를 열고 다음 섹션을\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Eimport sys\n\ndef main(temp_f: float) -&gt; float:\n    return (float(temp_f) - 32) * (5/9)\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E아래 섹션으로 바꿉니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-python\"\u003Eimport sys\nfrom scipy.constants import convert_temperature\n\ndef main(temp_f: float) -&gt; float:\n    return convert_temperature(float(temp_f), 'F', 'C')\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E변경 사항을 저장하십시오.\u003C/p\u003E\n","\u003Cp\u003E적용해야 하는 두 번째 변경 사항은 \u003Ccode\u003Escipy\u003C/code\u003E를 \u003Ccode\u003Erequirements.txt\u003C/code\u003E 파일에 추가하는 것입니다. VS Code에서 \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/requirements.txt\u003C/code\u003E 파일을 열고, \u003Ccode\u003Escipy\u003C/code\u003E를 포함한 새로운 줄을 추가하고, 파일을 저장합니다.\u003C/p\u003E\n","\u003Ch3\u003E로컬에서 변경 사항 테스트\u003C/h3\u003E\n","\u003Cp\u003E로컬에서 UDF를 테스트하려면 \u003Ccode\u003Esteps/05_fahrenheit_to_celsius_udf/app.py\u003C/code\u003E 스크립트를 실행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -&gt; New Terminal)을 열고 \u003Ccode\u003Epysnowpark\u003C/code\u003E Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd steps/05_fahrenheit_to_celsius_udf\npip install -r requirements.txt\npython app.py 35\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E이번에는 종속 패키지가 설치되었는지 확인하기 위해 pip install도 실행하겠습니다. 함수가 성공적으로 실행된 후 CI/CD를 통해 이를 배포할 수 있습니다!\u003C/p\u003E\n","\u003Ch3\u003E포크된 GitHub 프로젝트 구성\u003C/h3\u003E\n","\u003Cp\u003EGitHub Actions 워크플로우를 Snowflake 계정과 연결하려면 Snowflake 자격 증명을 GitHub에 저장해야 합니다. GitHub의 Action Secrets는 CI/CD 파이프라인에 사용될 값과 변수를 안전하게 저장하기 위해 사용됩니다. 이 단계에서는 SnowCLI가 사용하는 각 매개변수의 비밀을 생성하겠습니다.\u003C/p\u003E\n","\u003Cp\u003E리포지토리에서 페이지 상단 부근에 있는 \u003Ccode\u003ESettings\u003C/code\u003E 탭을 클릭합니다. 설정 페이지에서 \u003Ccode\u003ESecrets and variables\u003C/code\u003E를 클릭한 다음 왼쪽 탐색에 있는 \u003Ccode\u003EActions\u003C/code\u003E 탭을 클릭합니다. \u003Ccode\u003EActions\u003C/code\u003E 비밀을 선택해야 합니다. 아래에 나열된 각 비밀을 위해 오른쪽 상단 부근에 있는 \u003Ccode\u003ENew repository secret\u003C/code\u003E을 클릭하고 적절한 값(적절하게 조정)과 아래에 제공된 이름을 입력합니다.\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ESecret name\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003ESecret value\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWSQL_ACCOUNT\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Emyaccount\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWSQL_USER\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Emyusername\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWSQL_PWD\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003Emypassword\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWSQL_ROLE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EHOL_ROLE\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWSQL_WAREHOUSE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EHOL_WH\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESNOWSQL_DATABASE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EHOL_DB\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003E팁\u003C/strong\u003E - SNOWSQL_ACCOUNT에서 계정 이름을 만드는 방법에 대한 상세 정보는 \u003Ca href=\"https://docs.snowflake.com/ko/user-guide/python-connector-install.html#step-2-verify-your-installation\"\u003ESnowflake Python 커넥터 설치 가이드\u003C/a\u003E의 계정 이름을 다룬 부분에서 확인하십시오.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E모든 비밀을 추가했다면 페이지가 다음과 같을 것입니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/github-actions-secrets.png\" alt=\"assets/github-actions-secrets.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003E팁\u003C/strong\u003E - 더 좋은 비밀 관리 솔루션을 원한다면 \u003Ca href=\"https://docs.github.com/en/actions/reference/environments\"\u003EGitHub Actions 환경\u003C/a\u003E을 활용할 수 있습니다. 환경을 통해 비밀을 그룹으로 묶고 각 환경의 보호 규칙을 정의할 수 있습니다.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003E포크된 리포지토리로 변경 사항 푸시\u003C/h3\u003E\n","\u003Cp\u003E변경 사항이 준비 및 테스트되었고 Snowflake 자격 증명이 GitHub에 저장되어 있으니 이를 로컬 리포지토리로 커밋한 다음 포크된 리포지토리로 푸시하겠습니다. 이 작업은 명령줄에서 수행할 수 있지만, 이 단계에서는 쉽게 진행하기 위해 VS Code에서 수행하겠습니다.\u003C/p\u003E\n","\u003Cp\u003E왼쪽 탐색 모음에서 &lsquo;Source Control&rsquo; 확장 프로그램을 열며 시작합니다. 그러면 변경 사항이 적용된 2개의 파일이 나타납니다. 각 파일 이름의 오른쪽에 있는 \u003Ccode\u003E+\u003C/code\u003E(더하기) 기호를 클릭하여 변경 사항을 실시합니다. 그럼 다음 &lsquo;Message&rsquo; 상자에 메시지를 입력하고 파란색 \u003Ccode\u003ECommit\u003C/code\u003E 버튼을 클릭하여 변경 사항을 로컬에서 커밋합니다. 버튼을 클릭하기 전의 모습은 다음과 같아야 합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/vs_code_repo_commit.png\" alt=\"assets/vs_code_repo_commit.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E이 지점에서 이러한 변경 사항은 로컬에서만 커밋되며 GitHub에서 포크된 리포지토리로 아직 푸시되지 않았습니다. 이 작업을 수행하기 위해 간단히 파란색 \u003Ccode\u003ESync Changes\u003C/code\u003E 버튼을 클릭하여 이러한 커밋을 GitHub로 푸시합니다. 버튼을 클릭하기 전의 모습은 다음과 같아야 합니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/vs_code_repo_push.png\" alt=\"assets/vs_code_repo_push.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EGitHub Actions 워크플로우 보기\u003C/h3\u003E\n","\u003Cp\u003E이 리포지토리는 이미 매우 단순한 GitHub Actions CI/CD 파이프라인으로 설정되어 있습니다. 워크플로우의 코드는 VS Code에서 \u003Ccode\u003E.github/workflows/build_and_deploy.yaml\u003C/code\u003E 파일을 열어 검토할 수 있습니다.\u003C/p\u003E\n","\u003Cp\u003E변경 사항을 GitHub의 포크된 리포지토리로 푸시하고 바로 워크플로우가 시작되었습니다. 결과를 확인하려면 GitHub 리포지토리의 홈페이지로 되돌아가 다음 작업을 수행합니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E리포지토리에서 페이지 상단 중앙 부근에 있는 \u003Ccode\u003EActions\u003C/code\u003E 탭을 클릭합니다.\u003C/li\u003E\u003Cli\u003E왼쪽 탐색 메뉴에서 \u003Ccode\u003EDeploy Snowpark Apps\u003C/code\u003E 워크플로우의 이름을 클릭합니다.\u003C/li\u003E\u003Cli\u003E가장 최근 특정 실행(입력한 주석과 일치해야 함)의 이름을 클릭합니다.\u003C/li\u003E\u003Cli\u003E실행 개요 페이지에서 \u003Ccode\u003Edeploy\u003C/code\u003E 작업을 클릭한 다음 여러 단계의 출력을 열람합니다. 특히 \u003Ccode\u003EDeploy Snowpark apps\u003C/code\u003E 단계의 출력을 검토하면 도움이 될 수 있습니다.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/github-actions-run-summary.png\" alt=\"assets/github-actions-run-summary.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E지금쯤 \u003Ccode\u003EDeploy Snowpark apps\u003C/code\u003E 단계의 출력이 익숙하게 여겨질 것입니다. 이는 이전 단계에서 SnowCLI를 실행했을 때 VS Code의 터미널에서 본 내용일 것입니다. 다를 수 있는 부분은 출력 순서입니다. 하지만 현황을 파악할 수 있을 것입니다.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E해체\u003C/h2\u003E\n","\u003Cp\u003EQuickstart를 완료하고 정리하고 싶다면 간단히 \u003Ccode\u003Esteps/11_teardown.sql\u003C/code\u003E 스크립트를 실행하면 됩니다. 이는 SQL 스크립트이므로 이를 실행하기 위해 네이티브 VS Code 확장 프로그램을 사용하겠습니다. 간단히 VS Code에서 \u003Ccode\u003Esteps/11_teardown.sql\u003C/code\u003E 스크립트를 열고 편집기 창의 오른쪽 상단 모서리에 있는 &lsquo;Execute All Statements&rsquo; 버튼을 사용하여 모든 것을 실행합니다.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003E결론\u003C/h2\u003E\n","\u003Cp\u003E이 Quickstart에서는 많은 내용을 다뤘습니다! 이렇게 Snowpark Python 저장 프로시저를 사용하여 강력한 데이터 엔지니어링 파이프라인을 구축하셨습니다. 이 파이프라인은 데이터를 증분적으로 처리하고, Snowflake 작업과 조정되고, CI/CD 파이프라인을 통해 배포됩니다. 또한, Snowflake의 새로운 개발자 CLI 도구 및 Visual Studio Code 확장 프로그램을 사용하는 방법을 배웠습니다. 간략한 시각적 요약은 다음과 같습니다.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png\" alt=\"assets/data_pipeline_overview.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E하지만 실질적으로 Snowpark로 가능한 작업의 극히 일부만을 다뤘습니다. 기본 구성 요소와 사례를 이제 보유하고 계시기를 바랍니다. Snowpark Python으로 자신만의 데이터 엔지니어링 파이프라인을 구축하기 시작하셔야 합니다. 이제 무엇을 구축하시겠어요?\u003C/p\u003E\n","\u003Ch3\u003E다룬 내용\u003C/h3\u003E\n","\u003Cp\u003E이 Quickstart에서는 많은 내용을 다뤘습니다. 중요한 부분은 다음과 같습니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESnowflake의 테이블 형식\u003C/li\u003E\u003Cli\u003ECOPY를 사용한 데이터 수집\u003C/li\u003E\u003Cli\u003E스키마 추론\u003C/li\u003E\u003Cli\u003E데이터 공유 및 마켓플레이스(ETL 대신)\u003C/li\u003E\u003Cli\u003E증분적 처리를 위한 스트림(CDC)\u003C/li\u003E\u003Cli\u003E뷰의 스트림\u003C/li\u003E\u003Cli\u003EPython UDF(서드 파티 패키지 포함)\u003C/li\u003E\u003Cli\u003EPython 저장 프로시저\u003C/li\u003E\u003Cli\u003ESnowpark DataFrame API\u003C/li\u003E\u003Cli\u003ESnowpark Python 프로그램 가능성\u003C/li\u003E\u003Cli\u003E웨어하우스 탄력성(동적 규모 조정)\u003C/li\u003E\u003Cli\u003EVisual Studio Code Snowflake 네이티브 확장 프로그램\u003C/li\u003E\u003Cli\u003ESnowCLI\u003C/li\u003E\u003Cli\u003E작업(스트림 트리거 포함)\u003C/li\u003E\u003Cli\u003E작업 관측 가능성\u003C/li\u003E\u003Cli\u003EGitHub Actions(CI/CD) 통합\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003E관련 리소스\u003C/h3\u003E\n","\u003Cp\u003E마지막으로 관련 리소스의 간략한 요약은 다음과 같습니다.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python\"\u003EGitHub의 소스 코드\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/ko/developer-guide/snowpark/python/index.html\"\u003EPython용 Snowpark 개발자 가이드\u003C/a\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/ko/developer-guide/udf/python/udf-python.html\"\u003EPython UDF 작성하기\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/ko/sql-reference/stored-procedures-python.html\"\u003ESnowpark(Python)로 저장 프로시저 작성하기\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/ko/developer-guide/snowpark/python/working-with-dataframes.html\"\u003ESnowpark Python에서 DataFrame으로 작업하기\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E관련 도구\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://marketplace.visualstudio.com/items?itemName=snowflake.snowflake-vsc\"\u003ESnowflake Visual Studio Code 확장 프로그램\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/snowcli\"\u003ESnowCLI 도구\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E"],"title":"Snowpark Python을 사용한 데이터 엔지니어링 파이프라인","isDeveloperGuidesPage":false,":type":"snowflake-site/components/contentfragment",":items":{},":itemsOrder":[],"elements":{"quickstartArticleBody":{"dataType":"string","value":"\u003C!-- ------------------------ --\u003E\n## 개요\n\n\n\u003E “데이터 엔지니어는 기본적으로 여러 단계를 거쳐 데이터를 전송하는 데이터 파이프라인을 구축 및 유지하는 데 집중하고 이를 사용 가능한 상태로 만듭니다. 데이터 엔지니어링 프로세스에는 한 장소에서 다른 장소로 데이터를 전송하는 것을 자동화하고 이러한 데이터를 특정 유형의 분석을 위해 특성 형식으로 변환하는 **데이터 파이프라인**을 생성하기 위한 종합적인 노력이 포함됩니다. 이러한 측면에서 보면 데이터 엔지니어링은 한 번에 끝낼 수 있는 작업이 아닙니다. 이는 지속적인 관행이며 데이터를 수집하고, 준비하고, 변환하고, 전달해야 합니다. 데이터 파이프라인은 신뢰할 수 있는 방식으로 반복할 수 있도록 이러한 작업을 자동화하는 것을 돕습니다. 이는 특정 기술이라기보다는 오히려 관행입니다.” (출처: Cloud Data Engineering for Dummies, Snowflake 특별 에디션)\n\n데이터 엔지니어링 파이프라인을 구축하기 위해 Snowpark Python의 위력을 활용하는 데 관심이 있으신가요? 그렇다면 이 Quickstart가 도움이 될 것입니다! 여기에서는 데이터 사이언스가 아니라 Python을 사용하여 데이터 엔지니어링 파이프라인을 구축하는 방법에 집중하겠습니다. Snowpark Python을 사용한 데이터 사이언스의 사례는 [Machine Learning with Snowpark Python:](/en/developers/guides/getting-started-snowpark-machine-learning/)[ ](/en/developers/guides/getting-started-snowpark-machine-learning/)[- Credit Card Approval Prediction](/en/developers/guides/getting-started-snowpark-machine-learning/) Quickstart를 참조하십시오.\n\n이 Quickstart는 많은 내용을 다룹니다. 이 가이드를 완료하는 시점에는 Snowpark Python 저장 프로시저를 사용하여 강력한 데이터 엔지니어링 파이프라인을 구축했을 것입니다. 이러한 파이프라인은 데이터를 증분적으로 처리하고, Snowflake 작업과 조정되고, CI/CD 파이프라인을 통해 배포됩니다. 또한, Snowflake의 새로운 개발자 CLI 도구 및 Visual Studio Code 확장 프로그램을 사용하는 방법을 배우게 됩니다. 간략한 시각적 개요는 다음과 같습니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n마음의 준비를 하십시오!\n\n### 사전 필요 조건 및 지식\n\n* Python 사용 경험\n* DataFrame API 사용 경험\n* Snowflake 사용 경험\n* Git 리포지토리 및 GitHub 사용 경험\n\n### 학습할 내용\n\n이 Quickstart를 진행하는 동안 다음 Snowflake 기능을 학습하게 됩니다.\n\n* Snowflake의 테이블 형식\n* COPY를 사용한 데이터 수집\n* 스키마 추론\n* 데이터 공유 및 마켓플레이스(ETL 대신)\n* 증분적 처리를 위한 스트림(CDC)\n* 뷰의 스트림\n* Python UDF(서드 파티 패키지 포함)\n* Python 저장 프로시저\n* Snowpark DataFrame API\n* Snowpark Python 프로그램 가능성\n* 웨어하우스 탄력성(동적 규모 조정)\n* Visual Studio Code Snowflake 네이티브 확장 프로그램\n* SnowCLI\n* 작업(스트림 트리거 포함)\n* 작업 관측 가능성\n* GitHub Actions(CI/CD) 통합\n\n### 필요한 것\n\n시작하기 전에 다음이 필요합니다.\n\n* Snowflake\n  * **Snowflake 계정**\n  * **ACCOUNTADMIN 권한을 포함하여 생성된 Snowflake 사용자** 이 사용자를 사용하여 Snowflake에서 설정을 진행합니다.\n  * **Anaconda 사용 약관 수락** [서드 파티 패키지](https://docs.snowflake.com/ko/developer-guide/udf/python/udf-python-packages.html#getting-started)에서 시작하기 섹션을 참조하십시오.\n* Miniconda\n  * **컴퓨터에 Miniconda 설치** [Miniconda](https://conda.io/miniconda.html)를 다운로드 및 설치합니다. 대신에 Python 3.8을 포함한 다른 모든 Python 환경을 사용할 수 있습니다.\n* SnowSQL\n  * **컴퓨터에 SnowSQL 설치** [SnowSQL 다운로드 페이지](https://developers.snowflake.com/snowsql/)로 이동하여 상세 정보를 [SnowSQL 설치](https://docs.snowflake.com/ko/user-guide/snowsql-install-config.html) 페이지에서 확인하십시오.\n* Git\n  * **컴퓨터에 Git 설치** 상세 정보는 [시작하기 - Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) 페이지에서 확인하십시오.\n  * **자신의 사용자 이름 및 이메일 주소로 Git 구성** 아직 구성하지 않았다면 로컬 컴퓨터에서 [Git 사용자 이름](https://docs.github.com/en/get-started/getting-started-with-git/setting-your-username-in-git#setting-your-git-username-for-every-repository-on-your-computer) 및 [Git 이메일 주소](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address#setting-your-email-address-for-every-repository-on-your-computer)를 설정하십시오.\n* 필수 확장 프로그램을 포함한 Visual Studio Code\n  * **컴퓨터에 Visual Studio Code 설치** 다운로드 페이지 링크는 [Visual Studio Code](https://code.visualstudio.com/) 홈페이지에서 확인하십시오.\n  * **Python 확장 프로그램 설치** VS Code의 *Extensions* 창에서 ‘Python’ 확장 프로그램(Microsoft 제공)을 검색 및 설치하십시오.\n  * **Snowflake 확장 프로그램 설치** VS Code의 *Extensions* 창에서 ‘Snowflake’ 확장 프로그램(Snowflake 제공)을 검색 및 설치하십시오.\n* 로컬에서 포크 및 복제된 랩 리포지토리를 포함한 GitHub 계정\n  * **GitHub 계정** GitHub 계정이 아직 없다면 무료로 생성할 수 있습니다. 시작하려면 [GitHub 가입](https://github.com/signup) 페이지를 방문하십시오.\n\n### 구축할 것\n\n이 Quickstart를 진행하는 동안 다음 작업을 완수하게 됩니다.\n\n* 스키마 추론을 사용하여 Snowflake로 Parquet 데이터 로드\n* Snowflake 마켓플레이스 데이터에 대한 액세스 설정\n* 온도 변환을 위해 Python UDF 생성\n* 증분적 데이터 처리를 위해 Python 저장 프로시저로 데이터 엔지니어링 파이프라인 생성\n* 파이프라인을 작업과 조정\n* Snowsight로 파이프라인 모니터링\n* CI/CD 파이프라인을 통해 Snowpark Python 저장 프로시저 배포\n\n\u003C!-- ------------------------ --\u003E\n## Quickstart 설정\n\n\n### Quickstart를 위해 리포지토리 포크 및 복제\n\n자신의 GitHub 계정에서 이 Quickstart를 위한 리포지토리 포크를 생성해야 합니다. [Data Engineering Pipelines with Snowpark Python(Snowpark Python을 사용한 데 파이프라인) 관련 GitHub 리포지토리](https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python)를 방문하여 오른쪽 상단 부근에 있는 ‘Fork’ 버튼을 클릭합니다. 모든 필수 필드를 완료하고 ‘Create Fork’를 클릭합니다.\n\n기본값으로 GitHub Actions는 포크된 리포지토리에 정의된 모든 워크플로우(또는 CI/CD 파이프라인)를 비활성화합니다. 이 리포지토리에는 나중에 사용할 Snowpark Python UDF 및 저장 프로시저를 배포하기 위한 워크플로우가 포함되어 있습니다. 지금은 GitHub에서 포크된 리포지토리를 열어 이 워크플로우를 활성화합니다. 페이지 상단 중앙 부근에 있는 `Actions` 탭을 클릭한 다음 `I understand my workflows, go ahead and enable them` 녹색 버튼을 클릭합니다.\n\n![assets/github-actions-activate.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/github-actions-activate.png)\n\n다음으로 새로운 포크된 리포지토리를 로컬 컴퓨터로 복제해야 합니다. 새로운 Git 리포지토리에 대한 연결 세부 정보를 확인하려면 리포지토리를 열고, 페이지 상단 부근에 있는 녹색 ‘Code’ 아이콘을 클릭하고, ‘HTTPS’ 링크를 복사합니다.\n\n![assets/git_repo_url.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/git_repo_url.png)\n\nVS Code에서 이 링크를 사용하여 리포지토리를 컴퓨터에 복제합니다. 상세 정보를 위해 [Visual Studio Code에서 GitHub 리포지토리 복제 및 사용](https://learn.microsoft.com/en-us/azure/developer/javascript/how-to/with-visual-studio-code/clone-github-repository) 지침을 따르십시오. 또한, 선호에 따라 다음 명령을 실행하여 명령줄에서 리포지토리를 복제할 수도 있습니다.\n\n```bash\ngit clone \u003Cyour-forked-repo-url\u003E\ncd sfguide-data-engineering-with-snowpark-python/\n```\n\n포크된 리포지토리가 로컬 컴퓨터에 복제되면 VS Code로 폴더를 엽니다.\n\n### 자격 증명 구성\n\n이 Quickstart에서 [SnowSQL 명령줄 클라이언트](https://docs.snowflake.com/ko/user-guide/snowsql.html)를 바로 사용하지는 않겠지만, `~/.snowsql/config`에 있는 SnowSQL 구성 파일에 Snowflake 연결 세부 정보를 저장하겠습니다. 해당 SnowSQL 구성 파일이 존재하지 않는다면 빈 구성 파일을 생성하십시오.\n\n다음 섹션을 `~/.snowsql/config` 파일에 추가하여 이 랩을 위한 SnowSQL 구성을 생성합니다(계정 이름, 사용자 이름 및 암호는 자신의 값으로 바꿈).\n\n```\n[connections.dev]\naccountname = myaccount\nusername = myusername\npassword = mypassword\nrolename = HOL_ROLE\nwarehousename = HOL_WH\ndbname = HOL_DB\n```\n\n**참고:** SnowCLI 도구(및 이 Quickstart의 확장 프로그램)는 현재 키 쌍 인증과 작동하지 않습니다. 이는 사용자 이름과 암호 세부 정보를 공유 SnowSQL 구성 파일에서 가져오기만 합니다.\n\n### Anaconda 환경 생성\n\n제공된 `conda_env.yml` 파일을 사용하여 이 랩을 위한 Conda 환경을 생성 및 활성화합니다. 포크된 로컬 리포지토리 루트의 터미널에서 이 명령을 실행합니다.\n\n```bash\nconda env create -f conda_env.yml\nconda activate pysnowpark\n```\n\n\u003C!-- ------------------------ --\u003E\n## Snowflake 설정\n\n\n### VS Code용 Snowflake 확장 프로그램\n\n다양한 방식(Snowsight UI, SnowSQL 등)으로 Snowflake에 대해 SQL 쿼리를 실행할 수 있지만, 이 Quickstart에서는 VS Code용 Snowflake 확장 프로그램을 사용하겠습니다. Snowflake의 VS Code용 네이티브 확장 프로그램에 대한 간략한 개요는 [VS Code 마켓플레이스 Snowflake 확장 프로그램 페이지](https://marketplace.visualstudio.com/items?itemName=snowflake.snowflake-vsc)에서 확인하십시오.\n\n### 스크립트 실행\n\n이 Quickstart를 위해 Snowflake에서 필요할 모든 객체를 설정하려면 `steps/01_setup_snowflake.sql` 스크립트를 실행해야 합니다.\n\nVS Code의 왼쪽 탐색 메뉴에서 Snowflake 확장 프로그램을 클릭하여 시작합니다. 그런 다음 ACCOUNTADMIN 권한을 가진 사용자로 Snowflake 계정에 로그인합니다. Snowflake에 로그인한 후 왼쪽 탐색 메뉴에 있는 파일 탐색기로 되돌아가 VS Code에서 `steps/01_setup_snowflake.sql` 스크립트를 엽니다.\n\n모든 쿼리를 이 스크립트에서 실행하려면 편집기 창의 오른쪽 상단 모서리에 있는 ‘Execute All Statements’ 버튼을 사용합니다. 묶어서 실행하고 싶다면 실행할 쿼리를 선택하고 CMD/CTRL+Enter 바로 가기 키를 누릅니다.\n\n\u003C!-- ------------------------ --\u003E\n## 가공 전 데이터 로드\n\n\n이 단계에서는 가공 전 Tasty Bytes POS 및 고객 충성도 데이터를 `s3://sfquickstarts/data-engineering-with-snowpark-python/`에 있는 가공 전 Parquet 파일에서 Snowflake의 `RAW_POS` 및 `RAW_CUSTOMER` 스키마로 로드하겠습니다. 또한, Snowpark Python API를 사용하여 노트북에서 Python으로 이 프로세스를 조정하게 됩니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **2**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### 스크립트 실행\n\n가공 전 데이터를 로드하려면 `steps/02_load_raw.py` 스크립트를 실행합니다. VS Code에서는 다양한 방식(터미널에서 또는 VS Code에서 바로 실행)으로 이를 실행할 수 있습니다. 이 데모에서는 Python 스크립트를 터미널에서 실행해야 합니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps\npython 02_load_raw.py\n```\n\n명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\n\n### 로컬에서 Snowpark Python 실행\n\n이 단계에서는 노트북으로 로컬에서 Snowpark Python 코드를 실행하겠습니다. 스크립트 하단에는 로컬 디버깅에 사용되는 코드 블록(`if __name__ == \"__main__\":` 블록 아래)이 있습니다.\n\n```python\n# For local debugging\nif __name__ == \"__main__\":\n    # Add the utils package to our path and import the snowpark_utils function\n    import os, sys\n    current_dir = os.getcwd()\n    parent_dir = os.path.dirname(current_dir)\n    sys.path.append(parent_dir)\n\n    from utils import snowpark_utils\n    session = snowpark_utils.get_snowpark_session()\n\n    load_all_raw_tables(session)\n#    validate_raw_tables(session)\n\n    session.close()\n```\n\n여기에서 몇 가지 중요한 점을 말씀드리겠습니다. 우선, Snowpark session은 `utils/snowpark_utils.py` 모듈에 생성됩니다. 자격 증명을 가져오는 방식은 다양하지만, 이 Quickstart에서는 `~/.snowsql/config`에 있는 SnowSQL 구성 파일에서 자격 증명을 가져옵니다. 상세 정보는 [utils/snowpark_utils.py 모듈](https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python/blob/main/utils/snowpark_utils.py)의 코드에서 확인하십시오.\n\nSnowpark session을 가져오고 나면, 이는 힘든 작업을 수행하는 `load_all_raw_tables(session)` 메소드를 호출합니다. 다음 몇 개의 섹션은 핵심 내용을 강조합니다.\n\n마지막으로, 이 Quickstart의 거의 모든 Python 스크립트에는 로컬 디버깅 블록이 포함되어 있습니다. 추후에 Snowpark Python 저장 프로시저 및 UDF를 생성할 것이며 이러한 Python 스크립트는 비슷한 블록을 보유하게 됩니다. 따라서 이 패턴을 이해하는 것이 중요합니다.\n\n### Snowflake에서 결과 확인\n\nSnowflake의 [쿼리 내역](https://docs.snowflake.com/ko/user-guide/ui-snowsight-activity.html#query-history)은 매우 강력한 기능입니다. 쿼리를 시작한 도구나 프로세스와 관계없이 Snowflake 계정에 대해 실행되는 모든 쿼리를 기록합니다. 또한, 이 기능은 클라이언트 도구 및 API로 작업할 때 특히나 유용합니다.\n\n방금 실행한 Python 스크립트는 로컬에서 적은 양의 작업을 수행했습니다. 기본적으로 각 테이블을 거치고 데이터를 로드하기 위해 명령을 Snowflake에 내려 프로세스를 조정했습니다. 하지만 모든 힘든 작업은 Snowflake 내부에서 실행되었습니다! 이 푸시다운은 Snowpark API의 특징이며 사용자가 Snowflake의 확장성과 컴퓨팅 파워를 활용할 수 있도록 합니다.\n\nSnowflake 계정에 로그인하여 Snowpark API가 생성한 SQL을 잠깐 확인합니다. 이렇게 확인하면 API 현황을 더 잘 이해하고 발생할 수 있는 모든 이슈를 디버그하는 데 도움이 됩니다.\n\n![assets/query_history_sproc.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/query_history_sproc.png)\n\n### 스키마 추론\n\nSnowflake의 매우 유용한 기능으로는 작업할 스테이지에서 파일 스키마를 추론하는 것이 있습니다. 이는 [`INFER_SCHEMA()`](https://docs.snowflake.com/ko/sql-reference/functions/infer_schema.html) 함수를 사용하여 SQL에서 완수됩니다. Snowpark Python API는 사용자가 `session.read()` 메소드를 호출하면 사용자를 대신해 자동으로 이 작업을 수행합니다. 코드 조각은 다음과 같습니다.\n\n```python\n    # we can infer schema using the parquet read option\n    df = session.read.option(\"compression\", \"snappy\") \\\n                            .parquet(location)\n```\n\n### COPY를 사용한 데이터 수집\n\n데이터를 Snowflake 테이블에 로드하기 위해 DataFrame에서 `copy_into_table()` 메소드를 사용하겠습니다. 이 메소드는 추론된 스키마(존재하지 않을 경우)를 사용하여 Snowflake에서 대상 테이블을 생성합니다. 그런 다음 고도로 최적화된 Snowflake [`COPY INTO \u003Ctable\u003E`명령](https://docs.snowflake.com/ko/sql-reference/sql/copy-into-table.html)을 호출합니다. 코드 조각은 다음과 같습니다.\n\n```python\n    df.copy_into_table(\"{}\".format(tname))\n```\n\n### Snowflake의 테이블 형식\n\nSnowflake의 주요 이점 중 하나는 파일 기반 데이터 레이크를 관리할 필요가 없다는 것입니다. 또한, Snowflake는 처음부터 이러한 목적을 염두에 두고 설계되었습니다. 이 단계에서는 가공 전 데이터를 정형 Snowflake 관리형 테이블에 로드하겠습니다. 하지만 Snowflake 테이블은 기본적으로 정형 및 반정형 데이터를 지원할 수 있습니다. 또한, Snowflake의 성숙한 클라우드 테이블 형식(Hudi, Delta 또는 Iceberg 이전)에 저장됩니다.\n\n데이터는 Snowflake에 로드되면 안전하게 저장 및 관리됩니다. 가공 전 파일의 보호 및 관리를 걱정할 필요가 없습니다. 또한, 가공 전 데이터든 정형 데이터든 이러한 데이터는 SQL 또는 원하는 언어를 사용하여 Snowflake에서 변환 및 쿼리할 수 있습니다. Spark와 같은 별도의 컴퓨팅 서비스를 관리할 필요가 없습니다.\n\n이는 Snowflake 고객이 누리는 엄청난 이점입니다.\n\n### 웨어하우스 탄력성(동적 규모 조정)\n\nSnowflake에는 [가상 웨어하우스](https://docs.snowflake.com/ko/user-guide/warehouses.html)라는 단 하나의 사용자 정의 컴퓨팅 클러스터 유형이 있습니다. 사용하는 언어(SQL, Python, Java, Scala, Javascript 등)와 관계없이 이는 해당 데이터를 처리합니다. 즉, Snowflake에서 데이터로 작업하는 것이 훨씬 더 간단해집니다. 또한, 데이터 거버넌스는 컴퓨팅 클러스터와 완전히 분리되어 있습니다. 따라서 웨어하우스 설정 또는 사용하는 언어와 관계없이 Snowflake 거버넌스를 우회할 방법이 없습니다.\n\n이러한 가상 웨어하우스의 크기는 동적으로 조정되며 1초 이내에 다양한 크기의 웨어하우스를 대부분 조정할 수 있습니다! 즉, 코드에서 동적으로 컴퓨팅 환경의 크기를 조정하여 짧은 시간 내에 코드 섹션을 실행할 용량을 늘릴 수 있습니다. 그런 다음 동적으로 크기를 다시 조정하여 용량을 줄일 수 있습니다. Snowflake는 요금을 초 단위로 청구하기에(최소 60초) 짧은 시간 내에 해당 코드 섹션을 실행하는 데 추가 요금을 지불하지 않아도 됩니다.\n\n이 작업이 얼마나 쉬운지 알아보겠습니다. 코드 조각은 다음과 같습니다.\n\n```python\n    _ = session.sql(\"ALTER WAREHOUSE HOL_WH SET WAREHOUSE_SIZE = XLARGE WAIT_FOR_COMPLETION = TRUE\").collect()\n\n    # Some data processing code\n\n    _ = session.sql(\"ALTER WAREHOUSE HOL_WH SET WAREHOUSE_SIZE = XSMALL\").collect()\n```\n\n첫 번째 `ALTER WAREHOUSE` 문에 `WAIT_FOR_COMPLETION` 매개변수가 포함되어 있다는 점도 참고하십시오. 이 매개변수를 `TRUE`로 설정하면 크기 조정이 모든 컴퓨팅 리소스의 프로비저닝을 완료할 때까지 `ALTER WAREHOUSE` 명령의 반환을 차단하게 됩니다. 이렇게 하면 이를 사용하여 그 어떠한 데이터도 처리하기 전에 전체 클러스터를 확보할 수 있습니다.\n\n이 Quickstart를 진행하는 동안 이 패턴을 몇 번 더 사용하겠습니다. 따라서 이 내용을 이해하는 것이 중요합니다.\n\n\u003C!-- ------------------------ --\u003E\n## 날씨 로드\n\n\n이 단계에서는 가공 전 날씨 데이터를 Snowflake로 ‘로드’하겠습니다. 하지만 ‘로드’는 이 작업을 올바르게 설명하는 단어는 아닙니다. 왜냐하면 우리가 Snowflake의 고유한 데이터 공유 기능을 사용하기 때문입니다. 우리는 실질적으로 사용자 정의 ETL 프로세스를 사용하여 Snowflake 계정에 데이터를 복사할 필요가 없습니다. 대신 Snowflake 데이터 마켓플레이스에서 Weather Source가 공유하는 날씨 데이터에 바로 액세스할 수 있습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **3**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### Snowflake 데이터 마켓플레이스\n\nWeather Source는 선도적인 전 세계 날씨 및 기후 데이터 공급자입니다. 이 회사의 OnPoint Product Suite는 비즈니스가 여러 산업에 걸쳐 다양한 사용 사례에 대한 의미 있고 실행 가능한 인사이트를 빠르게 생성하는 데 필요한 날씨 및 기후 데이터를 제공합니다. 다음 단계에 따라 Snowflake 데이터 마켓플레이스에 등록된 Weather Source가 제공하는 `Weather Source LLC: frostbyte` 피드와 연결하겠습니다.\n\n* Snowsight에 로그인합니다.\n* 왼쪽 탐색 메뉴에 있는 `Marketplace` 링크를 클릭합니다.\n* 검색 상자에 ‘Weather Source LLC: frostbyte’를 입력하고 Return을 클릭합니다.\n* ‘Weather Source LLC: frostbyte’ 목록 타일을 클릭합니다.\n* 파란색 ‘Get’ 버튼을 클릭합니다.\n  * ‘Options’ 대화를 확장합니다.\n  * ‘Database name’을 ‘FROSTBYTE_WEATHERSOURCE’(전부 대문자)로 바꿉니다.\n  * 새로운 데이터베이스에 대한 액세스를 보유하기 위해 ‘HOL_ROLE’ 역할을 선택합니다.\n* 파란색 ‘Get’ 버튼을 클릭합니다.\n\n끝났습니다. 이제 이 데이터를 업데이트하기 위해 그 어떠한 작업도 수행할 필요가 없습니다. 공급자가 대신 데이터를 업데이트하며 데이터가 공유되고 있기에 공급자가 게시하는 모든 것을 사용자가 항상 확인하게 됩니다. 놀라운 일입니다. 항상 최신 상태인 서드 파티 데이터 세트에 대한 액세스를 얻는 것이 얼마나 간단했는지 생각해 보십시오!\n\n### 스크립트 실행\n\n왼쪽 탐색 메뉴에 있는 파일 탐색기의 VS Code에서 `steps/03_load_weather.sql` 스크립트를 열고 해당 스크립트를 실행합니다. Snowflake 마켓플레이스를 통해 공유된 데이터를 쿼리하는 것이 이렇게 간단합니다! Snowflake에 있는 다른 테이블이나 뷰에 액세스하는 것처럼 액세스합니다.\n\n```sql\nSELECT * FROM FROSTBYTE_WEATHERSOURCE.ONPOINT_ID.POSTAL_CODES LIMIT 100;\n```\n\n\u003C!-- ------------------------ --\u003E\n## POS 뷰 생성\n\n\n이 단계에서는 6개의 각기 다른 테이블을 결합하고 필요한 열만 골라 뷰를 생성하여 가공 전 POS 스키마를 간소화하겠습니다. 정말 멋진 부분은 Snowpark DataFrame API로 해당 뷰를 정의하게 된다는 것입니다! 그런 다음 증분적으로 모든 POS 테이블에 대한 변경 사항을 처리할 수 있도록 해당 뷰에서 Snowflake 스트림을 생성하겠습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **4**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### 스크립트 실행\n\n뷰와 스트림을 생성하려면 `steps/04_create_pos_view.py` 스크립트를 실행합니다. 2단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps\npython 04_create_pos_view.py\n```\n\n명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\n\n### Snowpark DataFrame API\n\n우선, `create_pos_view()` 함수에서 확인해야 하는 부분은 Snowpark DataFrame API를 사용하여 Snowflake 뷰를 정의하는 점입니다. 뷰에 있기를 원하는 모든 로직을 캡처하는 최종 DataFrame을 정의한 후 Snowpark `create_or_replace_view()` 메소드를 호출하기만 하면 됩니다. `create_pos_view()` 함수의 마지막 줄은 다음과 같습니다.\n\n```python\n    final_df.create_or_replace_view('POS_FLATTENED_V')\n```\n\nSnowpark Python DataFrame API에 대한 상세 정보는 [Snowpark Python에서 DataFrame으로 작업하기](https://docs.snowflake.com/ko/developer-guide/snowpark/python/working-with-dataframes.html) 페이지에서 확인하십시오.\n\n### 증분적 처리를 위한 스트림(CDC)\n\nSnowflake는 증분적인 데이터 처리를 매우 쉽게 만듭니다. 전통적으로 데이터 엔지니어는 테이블에서 새로운 기록만을 처리하기 위해 상위 워터마크(일반적으로 날짜/시간 열)를 기록해야 했습니다. 이 작업을 위해 어딘가에서 해당 워터마크를 추적 및 지속한 다음 이를 소스 테이블에 대한 모든 쿼리에서 사용해야 했습니다. 하지만 Snowflake 스트림을 사용하면 모든 힘든 작업을 Snowflake가 대신 수행합니다. 상세 정보는 [테이블 스트림을 사용한 변경 내용 추적](https://docs.snowflake.com/ko/user-guide/streams.html) 사용자 가이드에서 확인하십시오.\n\n기본 테이블 또는 뷰에 대해 Snowflake에서 [`STREAM`](https://docs.snowflake.com/ko/sql-reference/sql/create-stream.html) 객체를 생성하고 해당 스트림을 Snowflake에 있는 다른 테이블과 마찬가지로 쿼리하기만 하면 됩니다. 이 스트림은 수행한 마지막 DML 옵션 이후 변경된 기록만 반환합니다. 변경된 기록으로 작업하는 것을 돕기 위해 Snowflake 스트림은 다음 메타데이터 열과 기본 테이블 또는 뷰 열을 제공합니다.\n\n* METADATA$ACTION\n* METADATA$ISUPDATE\n* METADATA$ROW_ID\n\n이러한 스트림 메타데이터 열에 대한 상세 정보는 Snowflake 설명서의 [스트림 열](https://docs.snowflake.com/ko/user-guide/streams-intro.html#stream-columns) 섹션에서 확인하십시오.\n\n### 뷰의 스트림\n\nSnowflake의 증분적 및 CDC 스트림 기능에서 정말 멋진 부분은 뷰에서 스트림을 생성할 수 있다는 점입니다! 이 사례에서는 6개의 가공 전 POS 테이블을 결합한 뷰에서 스트림을 생성하겠습니다. 이 작업을 위한 코드는 다음과 같습니다.\n\n```python\ndef create_pos_view_stream(session):\n    session.use_schema('HARMONIZED')\n    _ = session.sql('CREATE OR REPLACE STREAM POS_FLATTENED_V_STREAM \\\n                        ON VIEW POS_FLATTENED_V \\\n                        SHOW_INITIAL_ROWS = TRUE').collect()\n```\n\n변경된 기록을 찾기 위해 `POS_FLATTENED_V_STREAM` 스트림을 쿼리할 때 Snowflake는 실질적으로 뷰에 포함된 6개의 테이블 중 아무 테이블에서 변경된 기록을 찾습니다. 이와 같은 비정규화된 스키마에 대한 증분적 및 CDC 프로세스를 구축하려고 시도한 경험이 있는 분이라면, 여기에서 Snowflake가 제공하는 매우 강력한 기능의 진가를 알아볼 것입니다.\n\n상세 정보는 Snowflake 설명서의 [뷰의 스트림](https://docs.snowflake.com/ko/user-guide/streams-intro.html#streams-on-views) 섹션에서 확인하십시오.\n\n\u003C!-- ------------------------ --\u003E\n## 화씨 섭씨 변환 UDF\n\n\n이 단계에서는 첫 번째 Snowpark Python 객체를 생성하고 이를 사용자 정의 함수(또는 UDF)인 Snowflake에 배포하겠습니다. 처음에는 UDF가 매우 단순하지만, 추후 단계에서는 서드 파티 Python 패키지를 포함하도록 업데이트할 것입니다. 또한, 이 단계에서는 새로운 개발자 명령줄 도구인 새로운 SnowCLI를 소개하겠습니다. SnowCLI는 개발자가 Snowpark Python 객체를 구축하고 이를 Snowflake로 배포하는 경험을 일관되게 만듭니다. SnowCLI에 대한 상세 정보는 다음과 같습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **5**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### 로컬에서 UDF 실행\n\n로컬에서 UDF를 테스트하려면 `steps/05_fahrenheit_to_celsius_udf/app.py` 스크립트를 실행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps/05_fahrenheit_to_celsius_udf\npython app.py 35\n```\n\nUDF를 개발하는 동안 간단히 로컬에서 VS Code로 이를 실행할 수 있습니다. 또한, UDF가 Snowflake의 데이터를 쿼리할 필요가 없다면 이 프로세스는 전부 로컬에서 진행됩니다.\n\n### UDF를 Snowflake에 배포\n\nUDF를 Snowflake에 배포하기 위해 SnowCLI 도구를 사용하겠습니다. SnowCLI 도구는 애플리케이션을 패키지로 만들고, 이를 Snowflake 스테이지에 복사하고, Snowflake에서 객체를 생성하는 모든 힘든 작업을 수행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps/05_fahrenheit_to_celsius_udf\nsnow function create\n```\n\n명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\n\n### Snowflake에서 UDF 실행\n\nSnowflake에서 UDF를 실행하는 방법에는 여러 가지가 있습니다. Snowflake에서 모든 UDF는 다음과 같이 SQL을 통해 호출할 수 있습니다.\n\n```sql\nSELECT ANALYTICS.FAHRENHEIT_TO_CELSIUS_UDF(35);\n```\n\n또한, SnowCLI 유틸리티를 사용하면 다음과 같이 VS Code의 터미널에서 UDF를 호출할 수 있습니다.\n\n```bash\nsnow function execute -f \"fahrenheit_to_celsius_udf(35)\"\n```\n\n결과적으로 SnowCLI 도구는 위 SQL 쿼리를 생성하고 이를 Snowflake 계정에 대해 실행합니다.\n\n### SnowCLI 도구 개요\n\n[SnowCLI](https://github.com/Snowflake-Labs/snowcli) 도구는 개발자를 위한 명령줄 도구이며 명령줄에서 `snow`로 실행됩니다.\n\n\u003E \n\nSnowCLI는 다음 Snowflake 객체의 개발 및 배포를 간소화합니다.\n\n* Snowpark Python UDF\n* Snowpark Python 저장 프로시저\n* Streamlit 애플리케이션\n\n이 Quickstart에서는 처음 두 개의 객체를 집중적으로 다루겠습니다. SnowCLI는 특히나 Snowpark Python UDF와 저장 프로시저를 위해 객체를 Snowflake에 배포하는 모든 힘든 작업을 수행합니다. SnowCLI 배포 명령이 대신 수행하는 단계를 간략히 요약하면 다음과 같습니다.\n\n* 서드 파티 패키지 처리\n  * Anaconda 채널에서 바로 액세스할 수 있는 패키지의 경우, SnowCLI는 `CREATE PROCEDURE` 또는 `CREATE FUNCTION` SQL 명령의 `PACKAGES` 목록에 이를 추가합니다.\n  * 현재 Anaconda 채널에서 제공되지 않는 패키지의 경우, SnowCLI는 코드를 다운로드하고 이를 프로젝트 압축 파일에 포함시킵니다.\n* 프로젝트에 있는 모든 것의 압축 파일 생성\n* Snowflake 스테이지에 해당 프로젝트 압축 파일 복사\n* Snowflake 함수 또는 저장 프로시저 객체 생성\n\n이렇게 하면 Python 애플리케이션을 해당하는 Snowflake 데이터베이스 객체로 만드는 것을 걱정하지 않고 개발 및 테스트할 수 있습니다.\n\n\u003E \n\u003E \n\u003E **참고** - 2023년 2월 1일 기준으로 SnowCLI 도구는 아직 미리 보기 단계에 있습니다.\n\n### Snowpark Python UDF에 대한 추가 정보\n\n이 단계에서는 아주 단순한 Python UDF를 Snowflake에 배포했습니다. 추후 단계는 서드 파티 패키지를 사용하도록 업데이트됩니다. 또한, SnowCLI 명령으로 이를 Snowflake에 배포했기 때문에 Snowflake에서 객체를 생성하기 위한 SQL DDL 구문을 걱정할 필요가 없었습니다. 단, 참고를 위해 [Python UDF 작성하기](https://docs.snowflake.com/ko/developer-guide/udf/python/udf-python.html) 개발자 가이드를 확인해 주시기 바랍니다.\n\nSnowCLI 도구가 함수를 배포하기 위해 생성한 SQL 쿼리는 다음과 같습니다.\n\n```sql\nCREATE OR REPLACE  FUNCTION fahrenheit_to_celsius_udf(temp_f float)\n         RETURNS float\n         LANGUAGE PYTHON\n         RUNTIME_VERSION=3.8\n         IMPORTS=('@HOL_DB.ANALYTICS.deployments/fahrenheit_to_celsius_udftemp_f_float/app.zip')\n         HANDLER='app.main'\n         PACKAGES=();\n```\n\n\u003C!-- ------------------------ --\u003E\n## 주문 업데이트 저장 프로시저\n\n\n이 단계에서는 첫 번째 Snowpark Python 저장 프로시저를 생성하고 이를 Snowflake에 배포하겠습니다. 이 저장 프로시저는 `HARMONIZED.POS_FLATTENED_V_STREAM` 스트림의 변경 사항을 대상 `HARMONIZED.ORDERS` 테이블과 병합합니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **6**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### 로컬에서 저장 프로시저 실행\n\n로컬에서 프로시저를 테스트하려면 `steps/06_orders_update_sp/app.py` 스크립트를 실행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps/06_orders_update_sp\npython app.py\n```\n\n저장 프로시저를 개발하는 동안 간단히 로컬에서 VS Code로 이를 실행할 수 있습니다. Python 코드는 노트북으로 로컬에서 실행되지만, Snowpark DataFrame 코드는 Snowflake 계정에 SQL 쿼리를 발급하게 됩니다.\n\n### 저장 프로시저를 Snowflake에 배포\n\n저장 프로시저를 Snowflake에 배포하기 위해 SnowCLI 도구를 사용하겠습니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps/06_orders_update_sp\nsnow procedure create\n```\n\n명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\n\n### Snowflake에서 저장 프로시저 실행\n\nSnowflake에서 저장 프로시저를 실행하는 방법에는 여러 가지가 있습니다. Snowflake에서 모든 저장 프로시저는 다음과 같이 SQL을 통해 호출할 수 있습니다.\n\n```sql\nCALL ORDERS_UPDATE_SP();\n```\n\n또한, SnowCLI 유틸리티를 사용하면 다음과 같이 VS Code의 터미널에서 UDF를 호출할 수 있습니다.\n\n```bash\nsnow procedure execute -p \"orders_update_sp()\"\n```\n\n결과적으로 SnowCLI 도구는 위 SQL 쿼리를 생성하고 이를 Snowflake 계정에 대해 실행합니다.\n\n### Snowpark Python 저장 프로시저에 대한 추가 정보\n\n이 단계에서는 Python 저장 프로시저를 Snowflake에 배포했습니다. 또한, SnowCLI 명령으로 이를 Snowflake에 배포했기 때문에 Snowflake에서 객체를 생성하기 위한 SQL DDL 구문을 걱정할 필요가 없었습니다. 단, 참고를 위해 [Snowpark(Python)로 저장 프로시저 작성하기](https://docs.snowflake.com/ko/sql-reference/stored-procedures-python.html) 가이드를 확인해 주시기 바랍니다.\n\nSnowCLI 도구가 프로시저를 배포하기 위해 생성한 SQL 쿼리는 다음과 같습니다.\n\n```sql\nCREATE OR REPLACE  PROCEDURE orders_update_sp()\n         RETURNS string\n         LANGUAGE PYTHON\n         RUNTIME_VERSION=3.8\n         IMPORTS=('@HOL_DB.HARMONIZED.deployments/orders_update_sp/app.zip')\n         HANDLER='app.main'\n         PACKAGES=('snowflake-snowpark-python','toml')\n        EXECUTE AS CALLER;\n```\n\n### Snowpark API에 대한 추가 정보\n\n이 단계에서는 데이터 변환을 위해 실질적으로 Snowpark DataFrame API를 사용하기 시작합니다. Snowpark API는 [Spark SQL API](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/index.html)로 동일한 기능을 제공합니다. 시작하려면 Snowpark session 객체를 생성해야 합니다. PySpark와 비슷하게 이는 `Session.builder.configs().create()` 메소드로 완수됩니다. 로컬에서 실행할 때는 `utils.snowpark_utils.get_snowpark_session()` 도우미 함수를 사용하여 대신 session 객체를 생성합니다. 하지만 Snowflake에 배포할 때는 Snowflake가 자동으로 대신 session 객체를 프로비저닝합니다. 또한, 계약에 따르면 Snowpark Python 저장 프로시저를 구축할 때 진입점(또는 핸들러) 함수에 대한 첫 번째 인수는 Snowpark session입니다.\n\n`steps/06_orders_update_sp/app.py` 스크립트에서 관찰할 수 있는 첫 번째 부분은 Snowflake에서 객체를 생성하고 객체 상태를 확인하기 위해 SQL을 사용하는 몇몇 함수가 있다는 것입니다. Snowpark API로 Snowflake에 SQL 문을 발급하려면 예상할 수 있듯이 `session.sql()` 함수를 사용합니다. 하나의 사례는 다음과 같습니다.\n\n```python\ndef create_orders_stream(session):\n    _ = session.sql(\"CREATE STREAM IF NOT EXISTS HARMONIZED.ORDERS_STREAM ON TABLE HARMONIZED.ORDERS \\\n                    SHOW_INITIAL_ROWS = TRUE;\").collect()\n```\n\n강조할 두 번째 부분은 소스 뷰에서 대상 테이블로 변경 사항을 병합하기 위해 DataFrame을 사용하는 방법입니다. Snowpark DataFrame API는 `merge()` 메소드를 제공합니다. 이는 결과적으로 Snowflake에서 `MERGE` 명령을 생성합니다.\n\n```python\n    source = session.table('HARMONIZED.POS_FLATTENED_V_STREAM')\n    target = session.table('HARMONIZED.ORDERS')\n\n    # TODO: Is the if clause supposed to be based on \"META_UPDATED_AT\"?\n    cols_to_update = {c: source[c] for c in source.schema.names if \"METADATA\" not in c}\n    metadata_col_to_update = {\"META_UPDATED_AT\": F.current_timestamp()}\n    updates = {**cols_to_update, **metadata_col_to_update}\n\n    # merge into DIM_CUSTOMER\n    target.merge(source, target['ORDER_DETAIL_ID'] == source['ORDER_DETAIL_ID'], \\\n                        [F.when_matched().update(updates), F.when_not_matched().insert(updates)])\n```\n\n다시 한번, Snowpark Python DataFrame API에 대한 상세 정보는 [Snowpark Python에서 DataFrame으로 작업하기](https://docs.snowflake.com/ko/developer-guide/snowpark/python/working-with-dataframes.html) 페이지에서 확인하십시오.\n\n\u003C!-- ------------------------ --\u003E\n## 일일 도시 지표 업데이트 저장 프로시저\n\n\n이 단계에서는 두 번째 Snowpark Python 저장 프로시저를 생성하고 이를 Snowflake에 배포하겠습니다. 이 저장 프로시저는 `ANALYTICS.DAILY_CITY_METRICS`라는 분석을 위해 집계된 최종 테이블을 생성하기 위해 `HARMONIZED.ORDERS` 데이터와 Weather Source 데이터를 결합합니다. 다른 Snowflake 스트림을 사용하여 해당 데이터를 `HARMONIZED.ORDERS` 테이블에서 증분적으로 처리하겠습니다. 또한, 다시 한번 Snowpark DataFrame `merge()` 메소드를 사용하여 데이터를 병합 또는 업서트하겠습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **7**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### 로컬에서 저장 프로시저 실행\n\n로컬에서 프로시저를 테스트하려면 `steps/07_daily_city_metrics_update_sp/app.py` 스크립트를 실행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps/07_daily_city_metrics_update_sp\npython app.py\n```\n\n저장 프로시저를 개발하는 동안 간단히 로컬에서 VS Code로 이를 실행할 수 있습니다. Python 코드는 노트북으로 로컬에서 실행되지만, Snowpark DataFrame 코드는 Snowflake 계정에 SQL 쿼리를 발급하게 됩니다.\n\n### 저장 프로시저를 Snowflake에 배포\n\n저장 프로시저를 Snowflake에 배포하기 위해 SnowCLI 도구를 사용하겠습니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps/07_daily_city_metrics_update_sp\nsnow procedure create\n```\n\n명령이 실행되는 동안 VS Code에서 스크립트를 열고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\n\n### Snowflake에서 저장 프로시저 실행\n\nSnowflake에서 저장 프로시저를 실행하는 방법에는 여러 가지가 있습니다. Snowflake에서 모든 저장 프로시저는 다음과 같이 SQL을 통해 호출할 수 있습니다.\n\n```sql\nCALL DAILY_CITY_METRICS_UPDATE_SP();\n```\n\n또한, SnowCLI 유틸리티를 사용하면 다음과 같이 VS Code의 터미널에서 UDF를 호출할 수 있습니다.\n\n```bash\nsnow procedure execute -p \"daily_city_metrics_update_sp()\"\n```\n\n결과적으로 SnowCLI 도구는 위 SQL 쿼리를 생성하고 이를 Snowflake 계정에 대해 실행합니다.\n\n### 데이터 모델링 모범 사례\n\n분석을 위해 데이터를 모델링할 때의 모범 사례는 테이블의 스키마를 명확히 정의하고 관리하는 것이었습니다. 가공 전 데이터를 Parquet에서 로드한 2단계에서는 Snowflake의 스키마 감지 기능의 이점을 활용하여 Parquet 파일과 동일한 스키마로 테이블을 생성했습니다. 이 단계에서는 DataFrame 구문에서 스키마를 확실하게 정의하고 이를 사용하여 테이블을 생성합니다.\n\n```python\ndef create_daily_city_metrics_table(session):\n    SHARED_COLUMNS= [T.StructField(\"DATE\", T.DateType()),\n                                        T.StructField(\"CITY_NAME\", T.StringType()),\n                                        T.StructField(\"COUNTRY_DESC\", T.StringType()),\n                                        T.StructField(\"DAILY_SALES\", T.StringType()),\n                                        T.StructField(\"AVG_TEMPERATURE_FAHRENHEIT\", T.DecimalType()),\n                                        T.StructField(\"AVG_TEMPERATURE_CELSIUS\", T.DecimalType()),\n                                        T.StructField(\"AVG_PRECIPITATION_INCHES\", T.DecimalType()),\n                                        T.StructField(\"AVG_PRECIPITATION_MILLIMETERS\", T.DecimalType()),\n                                        T.StructField(\"MAX_WIND_SPEED_100M_MPH\", T.DecimalType()),\n                                    ]\n    DAILY_CITY_METRICS_COLUMNS = [*SHARED_COLUMNS, T.StructField(\"META_UPDATED_AT\", T.TimestampType())]\n    DAILY_CITY_METRICS_SCHEMA = T.StructType(DAILY_CITY_METRICS_COLUMNS)\n\n    dcm = session.create_dataframe([[None]*len(DAILY_CITY_METRICS_SCHEMA.names)], schema=DAILY_CITY_METRICS_SCHEMA) \\\n                        .na.drop() \\\n                        .write.mode('overwrite').save_as_table('ANALYTICS.DAILY_CITY_METRICS')\n    dcm = session.table('ANALYTICS.DAILY_CITY_METRICS')\n```\n\n### 복잡한 집계 쿼리\n\n`merge_daily_city_metrics()` 함수에는 복잡한 집계 쿼리가 포함되어 있습니다. 이는 POS 및 Weather Source 데이터를 결합 및 집계하기 위해 사용됩니다. 표현된 복잡한 일련의 조인 및 집계를 살펴보고 5단계에서 생성한 Snowpark UDF도 활용하는 모습을 확인해 보십시오!\n\n그런 다음 복잡한 집계 쿼리는 Snowpark `merge()` 메소드를 사용하여 최종 분석 테이블과 병합됩니다. 아직 확인하지 않았다면 Snowflake 쿼리 내역을 확인하여 Snowpark API가 어떤 쿼리를 생성했는지 알아보십시오. 이 경우, Snowpark API는 병합을 비롯한 모든 복잡한 로직을 사용하고 실행할 단일 Snowflake 쿼리를 생성했을 것입니다!\n\n\u003C!-- ------------------------ --\u003E\n## 작업 조정\n\n\n이 단계에서는 새로운 Snowpark 파이프라인과 Snowflake의 기본 오케스트레이션 기능인 작업을 조정하겠습니다. 각 저장 프로시저를 위한 2개의 작업을 생성하고 이를 연결하겠습니다. 그런 다음 작업을 실행하겠습니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **8**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### 스크립트 실행\n\n이는 SQL 스크립트이므로 이를 실행하기 위해 네이티브 VS Code 확장 프로그램을 사용하겠습니다. 간단히 VS Code에서 `steps/08_orchestrate_jobs.sql` 스크립트를 열고 편집기 창의 오른쪽 상단 모서리에 있는 ‘Execute All Statements’ 버튼을 사용하여 모든 것을 실행합니다.\n\n실행되는 동안 VS Code에서 스크립트를 읽고 현황을 파악하기 위해 이 페이지를 계속 진행합니다.\n\n### 작업 실행\n\n이 단계에서는 작업 DAG를 위한 일정을 생성하지 않았습니다. 따라서 이 지점에서는 스스로 실행되지 않습니다. 이 스크립트는 다음과 같이 DAG를 수동으로 실행하게 됩니다.\n\n```sql\nEXECUTE TASK ORDERS_UPDATE_TASK;\n```\n\n이 작업을 방금 실행했을 때의 결과를 확인하려면 스크립트에서 이 주석이 달린 쿼리를 선택 및 실행(CMD/CTRL+Enter 바로 가기 키 사용)합니다.\n\n```sql\nSELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=\u003EDATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =\u003E 100))\nORDER BY SCHEDULED_TIME DESC\n;\n```\n\n작업 기록 출력에서 `ORDERS_UPDATE_TASK` 작업을 건너뛰었다는 것을 알 수 있습니다. `HARMONIZED.POS_FLATTENED_V_STREAM` 스트림에는 데이터가 없기에 이는 올바른 내용입니다. 몇 가지 새로운 데이터를 추가하고 다음 단계에서 다시 실행하겠습니다.\n\n### 작업에 대한 추가 정보\n\n작업은 Snowflake의 기본 일정 관리 또는 오케스트레이션 기능입니다. 작업으로 다음 SQL 코드 유형 중 하나를 실행할 수 있습니다.\n\n* 단일 SQL 문\n* 저장 프로시저 호출\n* Snowflake Scripting 개발자 가이드를 사용한 프로시저 로직\n\n이 Quickstart에서는 Snowpark 저장 프로시저를 호출하겠습니다 두 번째 작업을 생성하기 위한 SQL DDL 코드는 다음과 같습니다.\n\n```sql\nCREATE OR REPLACE TASK DAILY_CITY_METRICS_UPDATE_TASK\nWAREHOUSE = HOL_WH\nAFTER ORDERS_UPDATE_TASK\nWHEN\n  SYSTEM$STREAM_HAS_DATA('ORDERS_STREAM')\nAS\nCALL ANALYTICS.DAILY_CITY_METRICS_UPDATE_SP();\n```\n\n몇 가지 중요한 점을 말씀드리겠습니다. 우선, `WAREHOUSE` 절로 작업을 실행할 때 사용할 Snowflake 가상 웨어하우스를 지정합니다. `AFTER` 절을 통해 여러 작업 간의 관계를 정의할 수 있습니다. 또한, 이 관계의 구조는 오케스트레이션 도구 대부분이 제공하는 것처럼 방향성 비순환 그래프(또는 DAG)입니다. `AS` 절을 통해 작업이 실행되면 수행하는 작업을 정의할 수 있습니다. 이 경우, 저장 프로시저를 호출하는 것입니다.\n\n`WHEN` 절은 정말 훌륭합니다. 데이터를 증분적으로 처리하도록 하여 Snowflake에서 스트림이 작동하는 모습을 이미 확인했습니다. 뷰(여러 테이블을 결합함)에서 스트림을 생성하고 데이터를 증분적으로 처리하기 위해 해당 뷰에서 스트림을 생성하는 방법도 확인했습니다! `WHEN` 절에서는 지정된 스트림에 새로운 데이터가 있으면 참을 반환하는 `SYSTEM$STREAM_HAS_DATA()` 시스템 함수를 호출하고 있습니다. `WHEN` 절을 사용하면 가상 웨어하우스는 스트림에 새로운 데이터가 있을 때만 시작됩니다. 따라서 작업이 실행될 때 새로운 데이터가 없다면 웨어하우스가 시작되지 않고 요금이 부과되지 않습니다. 처리할 새로운 데이터가 있을 때만 요금이 부과됩니다. 훌륭한 기능입니다.\n\n앞서 말씀드렸듯이 루트 작업의 `SCHEDULE`을 정의하지 않았기에 이 DAG는 스스로 실행되지 않습니다. 이 Quickstart에서는 괜찮지만 현실에서는 일정을 정의해야 합니다. 상세 정보는 [CREATE TASK](https://docs.snowflake.com/ko/sql-reference/sql/create-task.html)에서 확인하십시오.\n\n또한, 작업에 대한 상세 정보는 [작업 소개](https://docs.snowflake.com/ko/user-guide/tasks-intro.html)에서 확인하십시오.\n\n### 작업 메타데이터\n\nSnowflake는 사용자가 수행하는 거의 모든 작업의 메타데이터를 보관하고 쿼리(및 이에 대한 모든 프로세스 유형을 생성)할 수 있도록 이러한 메타데이터를 제공합니다. 작업이라고 다르지 않습니다. Snowflake는 방대한 양의 메타데이터를 유지하여 작업 실행의 모니터링을 돕습니다. 다음은 작업 실행을 모니터링하기 위해 사용할 수 있는 몇 가지 샘플 SQL 쿼리입니다.\n\n```sql\n-- Get a list of tasks\nSHOW TASKS;\n\n-- Task execution history in the past day\nSELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=\u003EDATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =\u003E 100))\nORDER BY SCHEDULED_TIME DESC\n;\n\n-- Scheduled task runs\nSELECT\n    TIMESTAMPDIFF(SECOND, CURRENT_TIMESTAMP, SCHEDULED_TIME) NEXT_RUN,\n    SCHEDULED_TIME,\n    NAME,\n    STATE\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())\nWHERE STATE = 'SCHEDULED'\nORDER BY COMPLETED_TIME DESC;\n```\n\n### 작업 모니터링\n\n원하는 운영 또는 모니터링 프로세스를 자유롭게 생성할 수 있지만, Snowflake는 Snowsight UI에서 다양한 작업 관측 가능성 기능을 제공합니다. 다음 단계에 따라 직접 사용해 보십시오.\n\n1. Snowsight 탐색 메뉴에서 **Data** » **Databases**를 클릭합니다.\n2. 오른쪽 창에서 객체 탐색기를 사용하여 데이터베이스와 스키마로 이동합니다.\n3. 선택한 스키마에 대해 **Tasks**를 선택하고 확장합니다.\n4. 작업을 선택합니다. **Task Details**, **Graph** 및 **Run History** 하위 탭을 비롯한 작업 정보가 표시됩니다.\n5. **Graph** 탭을 선택합니다. 하위 작업의 계층 구조를 표시하는 작업 그래프가 나타납니다.\n6. 세부 정보를 보려면 작업을 선택합니다.\n\n작업 그래프는 다음과 같습니다.\n\n![assets/ui-snowsight-task-graph.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/ui-snowsight-task-graph.png)\n\n또한, 작업 실행 기록의 사례는 다음과 같습니다.\n\n![assets/ui-snowsight-task-run-history.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/ui-snowsight-task-run-history.png)\n\n상세 정보와 계정 수준 작업 기록을 확인하는 것에 대해 알아보려면 [작업 기록 보기](https://docs.snowflake.com/ko/user-guide/ui-snowsight-tasks.html) 설명서를 확인하십시오.\n\n\u003C!-- ------------------------ --\u003E\n## 증분적 처리\n\n\n이 단계에서는 새로운 데이터를 POS 주문 테이블에 추가한 다음 새로운 데이터를 처리하기 위해 전체 엔드 투 엔드 파이프라인을 실행하겠습니다. 또한, 이 전체 파이프라인은 Snowflake의 고급 스트림 및 CDC 기능을 활용하여 데이터를 증분적으로 처리하게 됩니다. 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **9**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### 스크립트 실행\n\n이는 SQL 스크립트이므로 이를 실행하기 위해 네이티브 VS Code 확장 프로그램을 사용하겠습니다. 간단히 VS Code에서 `steps/09_process_incrementally.sql` 스크립트를 열고 편집기 창의 오른쪽 상단 모서리에 있는 ‘Execute All Statements’ 버튼을 사용하여 모든 것을 실행합니다.\n\n실행되는 동안 현황을 간략히 알아보겠습니다. 2단계와 마찬가지로 Parquet의 데이터를 가공 전 POS 테이블로 로드하겠습니다. 2단계에서는 `ORDER_HEADER` 및 `ORDER_DETAIL`의 2022년 데이터를 제외한 모든 주문 데이터를 로드했습니다. 따라서 이제 나머지 데이터를 로드하겠습니다.\n\n이번에는 Python 대신 SQL을 통해 데이터를 로드하겠습니다. 하지만 프로세스는 동일합니다. 웨어하우스의 크기를 조정하겠습니다. 데이터를 더 빠르게 로드할 수 있도록 크기를 늘린 다음 작업이 끝나면 크기를 다시 줄이겠습니다. 또한, 새로운 데이터가 로드된 후 작업 DAG를 다시 실행하겠습니다. 이번에는 2개의 작업이 모두 실행되며 새로운 데이터를 처리합니다.\n\n### 작업 기록 보기\n\n이전 단계와 마찬가지로 이 작업 DAG를 실행했을 때의 결과를 확인하려면 스크립트에서 이 주석이 달린 쿼리를 선택 및 실행(CMD/CTRL+Enter 바로 가기 키 사용)합니다.\n\n```sql\nSELECT *\nFROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(\n    SCHEDULED_TIME_RANGE_START=\u003EDATEADD('DAY',-1,CURRENT_TIMESTAMP()),\n    RESULT_LIMIT =\u003E 100))\nORDER BY SCHEDULED_TIME DESC\n;\n```\n\n이번에는 `HARMONIZED.POS_FLATTENED_V_STREAM` 스트림에 새로운 데이터가 있기에 `ORDERS_UPDATE_TASK` 작업을 건너뛰지 않을 것입니다. 몇 분 후에 `ORDERS_UPDATE_TASK` 작업과 `DAILY_CITY_METRICS_UPDATE_TASK` 작업이 성공적으로 완료된 것을 확인할 수 있습니다.\n\n### 작업의 쿼리 내역\n\n작업을 이해하는 데 한 가지 중요한 점은 작업으로 실행되는 쿼리가 기본 쿼리 내역 UI 설정을 사용하면 나타나지 않는다는 것입니다. 방금 실행한 쿼리를 확인하려면 다음 작업을 수행해야 합니다.\n\n* 추후에 예정된 작업은 ‘System’으로 실행되니 이 테이블의 상단에서 필터(사용자 이름 포함)를 제거합니다.\n\n![](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/query_history_remove_filter1.png)\n\n* ‘Filter’를 클릭하고, ‘Queries executed by user tasks’ 필터 옵션을 추가하고, ‘Apply Filters’를 클릭합니다.\n\n![](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/query_history_remove_filter2.png)\n\n이제 작업이 실행하는 모든 쿼리를 확인할 수 있습니다! 쿼리 내역에서 각 MERGE 명령을 살펴보고 각 작업이 몇 개의 기록을 처리했는지 확인합니다. 방금 전체 파이프라인을 처리했으며 증분적으로 진행되었다는 사실을 기억해 주시기 바랍니다!\n\n\u003C!-- ------------------------ --\u003E\n## CI/CD를 통한 배포\n\n\n이 단계에서는 `FAHRENHEIT_TO_CELSIUS_UDF()` UDF에 변경 사항을 적용하고 이를 CI/CD 파이프라인을 통해 배포하겠습니다. 서드 파티 Python 패키지를 사용하기 위해 `FAHRENHEIT_TO_CELSIUS_UDF()` UDF를 업데이트하고, 이를 포크된 GitHub 리포지토리로 푸시하고, 마지막으로 GitHub Actions 워크플로우에서 SnowCLI를 사용하여 이를 배포하겠습니다! 콘텍스트에 적용하기 위해 데이터 흐름 개요의 **10**단계로 이동합니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n### 화씨 섭씨 변환 UDF 업데이트\n\n하드 코드된 온도 변환을 `scipy`의 패키지로 바꾸겠습니다. 우선, `steps/05_fahrenheit_to_celsius_udf/app.py` 스크립트에 몇 가지 변경 사항을 적용하겠습니다. 이 파일에서는 `import` 명령을 추가하고 `main()` 함수의 본문을 바꾸겠습니다. VS Code에서 `steps/05_fahrenheit_to_celsius_udf/app.py` 스크립트를 열고 다음 섹션을\n\n```python\nimport sys\n\ndef main(temp_f: float) -\u003E float:\n    return (float(temp_f) - 32) * (5/9)\n```\n\n아래 섹션으로 바꿉니다.\n\n```python\nimport sys\nfrom scipy.constants import convert_temperature\n\ndef main(temp_f: float) -\u003E float:\n    return convert_temperature(float(temp_f), 'F', 'C')\n```\n\n변경 사항을 저장하십시오.\n\n적용해야 하는 두 번째 변경 사항은 `scipy`를 `requirements.txt` 파일에 추가하는 것입니다. VS Code에서 `steps/05_fahrenheit_to_celsius_udf/requirements.txt` 파일을 열고, `scipy`를 포함한 새로운 줄을 추가하고, 파일을 저장합니다.\n\n### 로컬에서 변경 사항 테스트\n\n로컬에서 UDF를 테스트하려면 `steps/05_fahrenheit_to_celsius_udf/app.py` 스크립트를 실행합니다. 이전 단계와 마찬가지로 터미널에서 이를 실행하겠습니다. 따라서 상단 메뉴 모음의 VS Code에서 터미널(Terminal -\u003E New Terminal)을 열고 `pysnowpark` Conda 환경이 활성화되어 있는지 확인한 다음, 다음 명령(터미널에 리포지토리 루트가 열려 있음을 가정함)을 실행합니다.\n\n```bash\ncd steps/05_fahrenheit_to_celsius_udf\npip install -r requirements.txt\npython app.py 35\n```\n\n이번에는 종속 패키지가 설치되었는지 확인하기 위해 pip install도 실행하겠습니다. 함수가 성공적으로 실행된 후 CI/CD를 통해 이를 배포할 수 있습니다!\n\n### 포크된 GitHub 프로젝트 구성\n\nGitHub Actions 워크플로우를 Snowflake 계정과 연결하려면 Snowflake 자격 증명을 GitHub에 저장해야 합니다. GitHub의 Action Secrets는 CI/CD 파이프라인에 사용될 값과 변수를 안전하게 저장하기 위해 사용됩니다. 이 단계에서는 SnowCLI가 사용하는 각 매개변수의 비밀을 생성하겠습니다.\n\n리포지토리에서 페이지 상단 부근에 있는 `Settings` 탭을 클릭합니다. 설정 페이지에서 `Secrets and variables`를 클릭한 다음 왼쪽 탐색에 있는 `Actions` 탭을 클릭합니다. `Actions` 비밀을 선택해야 합니다. 아래에 나열된 각 비밀을 위해 오른쪽 상단 부근에 있는 `New repository secret`을 클릭하고 적절한 값(적절하게 조정)과 아래에 제공된 이름을 입력합니다.\n\n| Secret name | Secret value |\n|-------------|--------------|\n| SNOWSQL_ACCOUNT | myaccount |\n| SNOWSQL_USER | myusername |\n| SNOWSQL_PWD | mypassword |\n| SNOWSQL_ROLE | HOL_ROLE |\n| SNOWSQL_WAREHOUSE | HOL_WH |\n| SNOWSQL_DATABASE | HOL_DB |\n\n\u003E \n\u003E \n\u003E **팁** - SNOWSQL_ACCOUNT에서 계정 이름을 만드는 방법에 대한 상세 정보는 [Snowflake Python 커넥터 설치 가이드](https://docs.snowflake.com/ko/user-guide/python-connector-install.html#step-2-verify-your-installation)의 계정 이름을 다룬 부분에서 확인하십시오.\n\n모든 비밀을 추가했다면 페이지가 다음과 같을 것입니다.\n\n![assets/github-actions-secrets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/github-actions-secrets.png)\n\n\u003E \n\u003E \n\u003E **팁** - 더 좋은 비밀 관리 솔루션을 원한다면 [GitHub Actions 환경](https://docs.github.com/en/actions/reference/environments)을 활용할 수 있습니다. 환경을 통해 비밀을 그룹으로 묶고 각 환경의 보호 규칙을 정의할 수 있습니다.\n\n### 포크된 리포지토리로 변경 사항 푸시\n\n변경 사항이 준비 및 테스트되었고 Snowflake 자격 증명이 GitHub에 저장되어 있으니 이를 로컬 리포지토리로 커밋한 다음 포크된 리포지토리로 푸시하겠습니다. 이 작업은 명령줄에서 수행할 수 있지만, 이 단계에서는 쉽게 진행하기 위해 VS Code에서 수행하겠습니다.\n\n왼쪽 탐색 모음에서 ‘Source Control’ 확장 프로그램을 열며 시작합니다. 그러면 변경 사항이 적용된 2개의 파일이 나타납니다. 각 파일 이름의 오른쪽에 있는 `+`(더하기) 기호를 클릭하여 변경 사항을 실시합니다. 그럼 다음 ‘Message’ 상자에 메시지를 입력하고 파란색 `Commit` 버튼을 클릭하여 변경 사항을 로컬에서 커밋합니다. 버튼을 클릭하기 전의 모습은 다음과 같아야 합니다.\n\n![assets/vs_code_repo_commit.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/vs_code_repo_commit.png)\n\n이 지점에서 이러한 변경 사항은 로컬에서만 커밋되며 GitHub에서 포크된 리포지토리로 아직 푸시되지 않았습니다. 이 작업을 수행하기 위해 간단히 파란색 `Sync Changes` 버튼을 클릭하여 이러한 커밋을 GitHub로 푸시합니다. 버튼을 클릭하기 전의 모습은 다음과 같아야 합니다.\n\n![assets/vs_code_repo_push.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/vs_code_repo_push.png)\n\n### GitHub Actions 워크플로우 보기\n\n이 리포지토리는 이미 매우 단순한 GitHub Actions CI/CD 파이프라인으로 설정되어 있습니다. 워크플로우의 코드는 VS Code에서 `.github/workflows/build_and_deploy.yaml` 파일을 열어 검토할 수 있습니다.\n\n변경 사항을 GitHub의 포크된 리포지토리로 푸시하고 바로 워크플로우가 시작되었습니다. 결과를 확인하려면 GitHub 리포지토리의 홈페이지로 되돌아가 다음 작업을 수행합니다.\n\n* 리포지토리에서 페이지 상단 중앙 부근에 있는 `Actions` 탭을 클릭합니다.\n* 왼쪽 탐색 메뉴에서 `Deploy Snowpark Apps` 워크플로우의 이름을 클릭합니다.\n* 가장 최근 특정 실행(입력한 주석과 일치해야 함)의 이름을 클릭합니다.\n* 실행 개요 페이지에서 `deploy` 작업을 클릭한 다음 여러 단계의 출력을 열람합니다. 특히 `Deploy Snowpark apps` 단계의 출력을 검토하면 도움이 될 수 있습니다.\n\n![assets/github-actions-run-summary.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/github-actions-run-summary.png)\n\n지금쯤 `Deploy Snowpark apps` 단계의 출력이 익숙하게 여겨질 것입니다. 이는 이전 단계에서 SnowCLI를 실행했을 때 VS Code의 터미널에서 본 내용일 것입니다. 다를 수 있는 부분은 출력 순서입니다. 하지만 현황을 파악할 수 있을 것입니다.\n\n\u003C!-- ------------------------ --\u003E\n## 해체\n\n\nQuickstart를 완료하고 정리하고 싶다면 간단히 `steps/11_teardown.sql` 스크립트를 실행하면 됩니다. 이는 SQL 스크립트이므로 이를 실행하기 위해 네이티브 VS Code 확장 프로그램을 사용하겠습니다. 간단히 VS Code에서 `steps/11_teardown.sql` 스크립트를 열고 편집기 창의 오른쪽 상단 모서리에 있는 ‘Execute All Statements’ 버튼을 사용하여 모든 것을 실행합니다.\n\n\u003C!-- ------------------------ --\u003E\n## 결론\n\n\n이 Quickstart에서는 많은 내용을 다뤘습니다! 이렇게 Snowpark Python 저장 프로시저를 사용하여 강력한 데이터 엔지니어링 파이프라인을 구축하셨습니다. 이 파이프라인은 데이터를 증분적으로 처리하고, Snowflake 작업과 조정되고, CI/CD 파이프라인을 통해 배포됩니다. 또한, Snowflake의 새로운 개발자 CLI 도구 및 Visual Studio Code 확장 프로그램을 사용하는 방법을 배웠습니다. 간략한 시각적 요약은 다음과 같습니다.\n\n![assets/data_pipeline_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/data_pipeline_overview.png)\n\n하지만 실질적으로 Snowpark로 가능한 작업의 극히 일부만을 다뤘습니다. 기본 구성 요소와 사례를 이제 보유하고 계시기를 바랍니다. Snowpark Python으로 자신만의 데이터 엔지니어링 파이프라인을 구축하기 시작하셔야 합니다. 이제 무엇을 구축하시겠어요?\n\n### 다룬 내용\n\n이 Quickstart에서는 많은 내용을 다뤘습니다. 중요한 부분은 다음과 같습니다.\n\n* Snowflake의 테이블 형식\n* COPY를 사용한 데이터 수집\n* 스키마 추론\n* 데이터 공유 및 마켓플레이스(ETL 대신)\n* 증분적 처리를 위한 스트림(CDC)\n* 뷰의 스트림\n* Python UDF(서드 파티 패키지 포함)\n* Python 저장 프로시저\n* Snowpark DataFrame API\n* Snowpark Python 프로그램 가능성\n* 웨어하우스 탄력성(동적 규모 조정)\n* Visual Studio Code Snowflake 네이티브 확장 프로그램\n* SnowCLI\n* 작업(스트림 트리거 포함)\n* 작업 관측 가능성\n* GitHub Actions(CI/CD) 통합\n\n### 관련 리소스\n\n마지막으로 관련 리소스의 간략한 요약은 다음과 같습니다.\n\n* [GitHub의 소스 코드](https://github.com/Snowflake-Labs/sfguide-data-engineering-with-snowpark-python)\n* [Python용 Snowpark 개발자 가이드](https://docs.snowflake.com/ko/developer-guide/snowpark/python/index.html)\n  * [Python UDF 작성하기](https://docs.snowflake.com/ko/developer-guide/udf/python/udf-python.html)\n  * [Snowpark(Python)로 저장 프로시저 작성하기](https://docs.snowflake.com/ko/sql-reference/stored-procedures-python.html)\n  * [Snowpark Python에서 DataFrame으로 작업하기](https://docs.snowflake.com/ko/developer-guide/snowpark/python/working-with-dataframes.html)\n* 관련 도구\n  * [Snowflake Visual Studio Code 확장 프로그램](https://marketplace.visualstudio.com/items?itemName=snowflake.snowflake-vsc)\n  * [SnowCLI 도구](https://github.com/Snowflake-Labs/snowcli)\n","title":"Quickstart Article Body","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-fa30a87bf5","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":{"id":"container-e8fc956084","layout":"SIMPLE",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_last_modi":{"id":"quickstart-last-modified-6507b0f415","icon":{"id":"icon","icon":"calendar",":type":"snowflake-site/components/icon","appliedCssClassNames":"snowflake-icon-blue"},"lastModifiedDatePrefix":"Updated","lastModifiedDate":"2026-02-12",":type":"snowflake-site/components/quickstart/quickstart-last-modified","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"},"text":{"id":"text-c565f355af","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":{"id":"container-993b1c3f65","layout":"SIMPLE",":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":{"id":"container-285f8ad5c3","layout":"SIMPLE",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_table_of_":{"id":"container-edc7274f89","layout":"SIMPLE","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-4ac7afab82",":type":"snowflake-site/components/quickstart/quickstart-table-of-content","fragmentPath":"/content/dam/snowflake-site/ko/content-fragments/quickstarts/data-engineering-pipelines-with-snowpark-python-kr","headings":["\u003Ch2\u003E개요\u003C/h2\u003E","\u003Ch2\u003EQuickstart 설정\u003C/h2\u003E","\u003Ch2\u003ESnowflake 설정\u003C/h2\u003E","\u003Ch2\u003E가공 전 데이터 로드\u003C/h2\u003E","\u003Ch2\u003E날씨 로드\u003C/h2\u003E","\u003Ch2\u003EPOS 뷰 생성\u003C/h2\u003E","\u003Ch2\u003E화씨 섭씨 변환 UDF\u003C/h2\u003E","\u003Ch2\u003E주문 업데이트 저장 프로시저\u003C/h2\u003E","\u003Ch2\u003E일일 도시 지표 업데이트 저장 프로시저\u003C/h2\u003E","\u003Ch2\u003E작업 조정\u003C/h2\u003E","\u003Ch2\u003E증분적 처리\u003C/h2\u003E","\u003Ch2\u003ECI/CD를 통한 배포\u003C/h2\u003E","\u003Ch2\u003E해체\u003C/h2\u003E","\u003Ch2\u003E결론\u003C/h2\u003E"]},"quickstart_button":{"id":"quickstart-button-bf0f7a29f4",":type":"snowflake-site/components/quickstart/quickstart-button","fragmentPath":"/content/dam/snowflake-site/ko/content-fragments/quickstarts/data-engineering-pipelines-with-snowpark-python-kr","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-969a95d8e2","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":{"id":"container-c29bbfc24c","layout":"SIMPLE",":type":"snowflake-site/components/modal/modal-container",":items":{},":itemsOrder":[]},"experiencefragment-footer":{"id":"experiencefragment-0715b9ed96","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/ko/site/footer/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"additionalClasses":"sf-footer","id":"container-ae5740b0b4","layout":"SIMPLE",":type":"snowflake-site/components/container","appliedCssClassNames":"ui-background-02",":items":{"container_copy_1901439591":{"additionalClasses":"sf-footer__inner","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-96786c1985","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small",":items":{"flexible_column_cont":{"id":"flexible-column-container-cf7de52bf3","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":{"id":"container-f0cd39d166","layout":"SIMPLE",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer-grid__inner","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","container_1622723482":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy_":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy":"aem-GridColumn aem-GridColumn--default--12","container_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-0386f28819","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"container_1622723482":{"additionalClasses":"sf-footer__column","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-3528388b60","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"container":{"additionalClasses":"sf-footer__newsletter-group","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12","marketo_v2":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-784a4e5987","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"text":{"id":"text-25e48efb20","additionalClasses":"sf-footer__newsletter-title","text":"\u003Cp\u003E\u003Cb\u003E월간 뉴스레터 구독하기\u003C/b\u003E\u003C/p\u003E\r\n\u003Cp\u003ESnowflake의 최신 제품 정보, 전문가 인사이트 및 유용한 리소스를 이메일로 편리하게 받아보세요.\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-9dddd2aacb","marketoForm":{"edit":false,"formId":"45871","successUrl":null,"hidden":null,"script":null,"values":null},"formConfigured":true,"marketoConfigured":true,"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com",":type":"snowflake-site/components/form/marketo-v2"}},":itemsOrder":["text","marketo_v2"]}},":itemsOrder":["container"]},"container":{"columnClassNames":{"text_copy":"aem-GridColumn aem-GridColumn--default--12","text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-61de977fc0","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-medium",":items":{"text":{"id":"text-ff613db3cb","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003E제품\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/product/platform/\"\u003EPlatform\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/product/data-engineering/\"\u003EData Engineering\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/product/analytics/\"\u003EAnalytics\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/product/ai/\"\u003EAI\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/product/applications-and-collaboration/\"\u003EApplications &amp; Collaboration\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/pricing-options/\"\u003E요금\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-d92cbb966d","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=\"/en/support/\"\u003ESupport (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/support/\"\u003E우선 지원 (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://status.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E지원 현황 (EN)\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":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-2b9c049c89","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"text":{"id":"text-ede3278ef3","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003E산업용\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/solutions/industries/advertising-media-entertainment/\"\u003E광고, 미디어 및 엔터테인먼트\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/solutions/industries/financial-services/\"\u003E금융 서비스\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/solutions/industries/healthcare-and-life-sciences/\"\u003E헬스케어 및 라이프사이언스\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/solutions/industries/manufacturing/\"\u003E제조\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/solutions/industries/public-sector/\"\u003E공공 부문\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/solutions/industries/retail-consumer-goods/\"\u003E리테일/소비재\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/solutions/industries/technology/\"\u003E테크놀로지\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":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-79e171834c","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"text":{"id":"text-1ae12f69fc","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003E회사\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/company/overview/about-snowflake/\"\u003ESnowflake 소개\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/leadership-and-board/\"\u003E리더십 및 이사진 (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://careers.snowflake.com/us/en?_ga=2.189098923.1024280027.1746985324-1783381883.1746382047\"\u003E채용 (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://investors.snowflake.com/overview/default.aspx\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E투자자 관계 (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://trust.snowflake.com/\"\u003ETrust Center (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/brand-guidelines/\"\u003E브랜드 가이드라인 (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/contact/\"\u003E연락처\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/news/\"\u003E뉴스룸\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/esg/\"\u003EESG (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/snowflake-ventures/\"\u003ESnowflake Ventures (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/end-data-disparity/\"\u003E데이터 불평등 종식 (EN)\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_":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-6f443c4144","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-small",":items":{"text":{"id":"text-d9fcdd2835","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003E학습\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/ko/resources/\"\u003E리소스 라이브러리\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/webinars/demo/\"\u003E라이브 데모 (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/ko/fundamentals/\"\u003EFundamentals\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/training/\"\u003E교육 (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/resources/learn/certifications/\"\u003E자격 인증\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://learn.snowflake.com/en/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ESnowflake University (EN)\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/developers/guides/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E개발자가이드\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E설명서 (EN)\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","columnClassNames":{"container_112062425":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-f3518c50e2","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-none",":items":{"container_112062425":{"columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-742eb4db4b","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small",":items":{"flexible_column_cont":{"id":"flexible-column-container-6981c3295c","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":{"id":"container-7303577ab2","layout":"SIMPLE",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer__legal-container","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","text_copy_copy_16360_258165670":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-3513aecfac","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-none",":items":{"container":{"columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-55c5aa0204","layout":"RESPONSIVE_GRID","columnCount":12,":type":"snowflake-site/components/container","appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small",":items":{"image":{"id":"image-4a1c90a37e","additionalClasses":"sf-footer__logo","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/ko/site/footer/master/_jcr_content/root/container_573483281_/container_112062425/flexible_column_cont/flexible_column_content_container_1/container/container/image.coreimg.svg/1747882370694/nav-icon-snowflake-bug.svg","lazyEnabled":true,"alt":"Snowflake logo","imageLink":{"valid":true,"url":"/en/"},"width":"64","height":"64",":type":"snowflake-site/components/image"}},":itemsOrder":["image"]},"text_copy_copy_16360_258165670":{"id":"text-cce3c9ce25","additionalClasses":"sf-footer__legal-links","text":"\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/legal/privacy/privacy-policy/\"\u003E개인정보 처리방침\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/snowflake-site-terms/\"\u003E사이트 이용 약관\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://info.snowflake.com/Preference-center.html\"\u003E이메일 수신 설정\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Cbutton id=\"ot-sdk-btn\" class=\"ot-sdk-show-settings\"\u003E쿠키 설정\u003C/button\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/legal/privacy/privacy-policy/#12\"\u003E개인 정보를 공유하지 않습니다.\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/ko/legal/\"\u003E법률\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E© 2026 Snowflake Inc. All Rights Reserved&nbsp;ㅣ 스노우플레이크코리아 유한회사 ㅣ 대표자: 마이클파스콸스카펠리 ㅣ&nbsp;주소: 서울특별시 강남구 테헤란로 134, 10층(역삼동, 포스코타워 역삼) ㅣ 사업자등록번호: 523-87-02399\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-285f0c273a","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","cssContent":".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}.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}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container","text_copy_copy_16360_258165670","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-ffa32801ec","title":"New css","cssContent":"body:has(.snowflake-skip-to-content[style=\"top:82px;\"]) #subNav,body:has(.snowflake-skip-to-content[style=\"top:90px;\"]) #subNav,body:has(.snowflake-skip-to-content[style=\"top:98px;\"]) #subNav,.pushdown-banner-dismissed #subNav{top:var(--scroll-padding-top) !important;transition:300ms ease top}.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.4}.related-chip-25 .snowflake-content-chip-image{width:48px}.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:hover::after{right:24px;transition:300ms ease right}.related-chip-25 .snowflake-content-chip-content-without-tag{flex-grow:1;padding-right:24px}.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}.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,3.5vw,4rem) !important;line-height:.85 !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 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}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container_copy_1901439591","container_573483281_","markup_editor_copy"]}},":itemsOrder":["root"],"classNames":"aem-xf"},"markup_editor":{"id":"markup-editor-5a38594eb8","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"],"analyticsEnabled":true,"coveoConfig":{"pipeline":"snowflake.com","apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d","organizationId":"snowflakecomputingproduction8neljofn","searchHub":"snowflake.com"},"analyticsDebugMode":false,"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"quickstart-page-template","templateName":"quickstart-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/ko/developers/guides/data-engineering-pipelines-with-snowpark-python-kr","language":"ko","category":"general","pageName":"Snowpark Python을 사용한 데이터 엔지니어링 파이프라인","contentTags":["snowflake-site:taxonomy/product/data-engineering","snowflake-site:taxonomy/solution-center/certification/quickstart"]},"locale":"ko",":mappedPath":"/ko/developers/guides/data-engineering-pipelines-with-snowpark-python-kr/"}
  