1<!DOCTYPE html> 2<html lang="zh"> 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <meta name="theme-color" content="#2F5BEA"> 7 <title>æ°æ®å·¥ç¨å ¥é¨è·¯çº¿å¾(å¿ ç)</title> 8 <meta name="description" content="ãæåç ãï¼åå¨åé¢:æ¬æ¬¡æç« 主è¦åæä¸ä¸ªé¨åãå½å å¸åºãæµ·å¤å¸åºã两è 对æ¯ã"> 9 <link rel="icon" href="https://xiaowantree.com/content/images/size/w256h256/format/jpeg/2025/08/8---9----1-.jpg" type="image/jpeg"> 10 <link rel="canonical" href="https://xiaowantree.com/shu-ju-gong-cheng-ru-men-lu-xian-tu/"> 11 <meta name="referrer" content="no-referrer-when-downgrade"> 12 13 <meta property="og:site_name" content="å°ä¸åå°ä¸æåçç¥è¯æé¿è¥å°"> 14 <meta property="og:type" content="article"> 15 <meta property="og:title" content="æ°æ®å·¥ç¨å ¥é¨è·¯çº¿å¾(å¿ ç)"> 16 <meta property="og:description" content="ãæåç ãï¼åå¨åé¢:æ¬æ¬¡æç« 主è¦åæä¸ä¸ªé¨åãå½å å¸åºãæµ·å¤å¸åºã两è 对æ¯ã"> 17 <meta property="og:url" content="https://xiaowantree.com/shu-ju-gong-cheng-ru-men-lu-xian-tu/"> 18 <meta property="og:image" content="https://xiaowantree.com/content/images/2025/12/real_pixels_jpg-by-RohithDezinr.jpeg"> 19 <meta property="article:published_time" content="2025-12-16T08:31:00.000Z"> 20 <meta property="article:modified_time" content="2026-07-27T12:32:39.000Z"> 21 <meta property="article:tag" content="æ°ä»ç¥è¯ç¹"> 22 <meta property="article:tag" content="路线å¾"> 23 <meta property="article:tag" content="æ°æ®å·¥ç¨åºç¡"> 24 25 <meta property="article:publisher" content="https://www.facebook.com/ghost"> 26 <meta name="twitter:card" content="summary_large_image"> 27 <meta name="twitter:title" content="æ°æ®å·¥ç¨å ¥é¨è·¯çº¿å¾(å¿ ç)"> 28 <meta name="twitter:description" content="ãæåç ãï¼åå¨åé¢:æ¬æ¬¡æç« 主è¦åæä¸ä¸ªé¨åãå½å å¸åºãæµ·å¤å¸åºã两è 对æ¯ã"> 29 <meta name="twitter:url" content="https://xiaowantree.com/shu-ju-gong-cheng-ru-men-lu-xian-tu/"> 30 <meta name="twitter:image" content="https://xiaowantree.com/content/images/2025/12/real_pixels_jpg-by-RohithDezinr.jpeg"> 31 <meta name="twitter:label1" content="Written by"> 32 <meta name="twitter:data1" content="å°ä¸æ¥äº"> 33 <meta name="twitter:label2" content="Filed under"> 34 <meta name="twitter:data2" content="æ°ä»ç¥è¯ç¹, 路线å¾, æ°æ®å·¥ç¨åºç¡"> 35 <meta name="twitter:site" content="@ghost"> 36 <meta property="og:image:width" content="736"> 37 <meta property="og:image:height" content="588"> 38 39
39<script type="application/ld+json"> 40{ 41 "@context": "https://schema.org", 42 "@type": "Article", 43 "publisher": { 44 "@type": "Organization", 45 "name": "å°ä¸åå°ä¸æåçç¥è¯æé¿è¥å°", 46 "url": "https://xiaowantree.com/", 47 "logo": { 48 "@type": "ImageObject", 49 "url": "https://xiaowantree.com/content/images/2025/12/Cat-Paw-Sticker---Cat-Paw-High-Five---Discover---Share-GIFs.gif", 50 "width": 60, 51 "height": 60 52 } 53 }, 54 "author": { 55 "@type": "Person", 56 "name": "å°ä¸æ¥äº", 57 "image": { 58 "@type": "ImageObject", 59 "url": "https://xiaowantree.com/content/images/2025/07/------------_20250715062913_877-2.jpg", 60 "width": 1168, 61 "height": 960 62 }, 63 "url": "https://xiaowantree.com/author/xiaowan/", 64 "sameAs": [] 65 }, 66 "headline": "æ°æ®å·¥ç¨å ¥é¨è·¯çº¿å¾(å¿ ç)", 67 "url": "https://xiaowantree.com/shu-ju-gong-cheng-ru-men-lu-xian-tu/", 68 "datePublished": "2025-12-16T08:31:00.000Z", 69 "dateModified": "2026-07-27T12:32:39.000Z", 70 "image": { 71 "@type": "ImageObject", 72 "url": "https://xiaowantree.com/content/images/2025/12/real_pixels_jpg-by-RohithDezinr.jpeg", 73 "width": 736, 74 "height": 588 75 },
76 "keywords": "æ°ä»ç¥è¯ç¹, 路线å¾, æ°æ®å·¥ç¨åºç¡", 77 "description": "ãæåç ãï¼åå¨åé¢:æ¬æ¬¡æç« 主è¦åæä¸ä¸ªé¨åãå½å å¸åºãæµ·å¤å¸åºã两è 对æ¯ã", 78 "mainEntityOfPage": "https://xiaowantree.com/shu-ju-gong-cheng-ru-men-lu-xian-tu/" 79} 80 </script>
80 81 82 <meta name="generator" content="Ghost 6.53"> 83 <link rel="alternate" type="application/rss+xml" title="å°ä¸åå°ä¸æåçç¥è¯æé¿è¥å°" href="https://xiaowantree.com/rss/"> 84
84<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.69/umd/portal.min.js" data-i18n="true" data-ghost="https://xiaowantree.com/" data-key="21a6b98a8f6e0cbb6f2373f31a" data-api="https://xiaowantree.com/ghost/api/content/" data-locale="zh" crossorigin="anonymous"></script>
84<style id="gh-members-styles">.gh-post-upgrade-cta-content, 85.gh-post-upgrade-cta { 86 display: flex; 87 flex-direction: column; 88 align-items: center; 89 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 90 text-align: center; 91 width: 100%; 92 color: #ffffff; 93 font-size: 16px; 94} 95 96.gh-post-upgrade-cta-content { 97 border-radius: 8px; 98 padding: 40px 4vw; 99} 100 101.gh-post-upgrade-cta h2 { 102 color: #ffffff; 103 font-size: 28px; 104 letter-spacing: -0.2px; 105 margin: 0; 106 padding: 0; 107} 108 109.gh-post-upgrade-cta p { 110 margin: 20px 0 0; 111 padding: 0; 112} 113 114.gh-post-upgrade-cta small { 115 font-size: 16px; 116 letter-spacing: -0.2px; 117} 118 119.gh-post-upgrade-cta a { 120 color: #ffffff; 121 cursor: pointer; 122 font-weight: 500; 123 box-shadow: none; 124 text-decoration: underline; 125} 126 127.gh-post-upgrade-cta a:hover { 128 color: #ffffff; 129 opacity: 0.8; 130 box-shadow: none; 131 text-decoration: underline; 132} 133 134.gh-post-upgrade-cta a.gh-btn { 135 display: block; 136 background: #ffffff; 137 text-decoration: none; 138 margin: 28px 0 0; 139 padding: 8px 18px; 140 border-radius: 4px; 141 font-size: 16px; 142 font-weight: 600; 143} 144 145.gh-post-upgrade-cta a.gh-btn:hover { 146 opacity: 0.92; 147}</style>
147<script async src="https://js.stripe.com/v3/"></script>
147 148
148<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="21a6b98a8f6e0cbb6f2373f31a" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://xiaowantree.com/" data-locale="zh" crossorigin="anonymous"></script>
148 149
149<script defer src="https://cdn.jsdelivr.net/ghost/announcement-bar@~1.1/umd/announcement-bar.min.js" data-announcement-bar="https://xiaowantree.com/" data-api-url="https://xiaowantree.com/members/api/announcement/" crossorigin="anonymous"></script>
149 150 <link href="https://xiaowantree.com/webmentions/receive/" rel="webmention"> 151
151<script defer src="/public/cards.min.js?v=e3e7e3db28"></script>
151 152 <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=e3e7e3db28"> 153
153<script defer src="/public/member-attribution.min.js?v=e3e7e3db28"></script>
153<style>:root {--ghost-accent-color: #16d1aa;}</style> 154 <!-- Ghost Code Injection: Site Header --> 155<!-- Fixed version of your current setup. Keep this in Site Header only. -->
vendor: 65 bytes, lines 155-157
155 156 157<script async src="https://www.googletagmanager.com/gtag/js?id=
157G-MJ2YRQ6SYD
vendor: 12 bytes, line 157
157"></script>
158<script> 159
vendor: 133 bytes, lines 159-162
159window.dataLayer = window.dataLayer || []; 160 function gtag(){dataLayer.push(arguments);} 161 gtag('js', new Date()); 162 gtag('config', '
162G-MJ2YRQ6SYD
vendor: 4 bytes, line 162
162');
163</script>
163 164 165<link rel="stylesheet" href="https://unpkg.com/tocbot@4/dist/tocbot.css">
166<script src="https://unpkg.com/tocbot@4/dist/tocbot.min.js"></script>
166 167 168<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/a11y-light.min.css"> 169
170<script> 171 window.themeGlobal = window.themeGlobal || {}; 172 window.themeGlobal.autoloadResources = true; 173</script>
173 174 175<style> 176 :root { 177 --xw-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", 178 "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", 179 "Helvetica Neue", Arial, sans-serif; 180 --xw-text: #1f1f1f; 181 --xw-muted: #5f6368; 182 --xw-blue: #0b57d0; 183 --xw-border: #e0e0e0; 184 --xw-code-bg: #f0f4f9; 185 } 186 187 body, 188 p, 189 li, 190 h1, 191 h2, 192 h3, 193 h4, 194 h5, 195 h6, 196 td, 197 th, 198 div, 199 span, 200 blockquote, 201 a, 202 button, 203 input, 204 textarea { 205 font-family: var(--xw-font) !important; 206 -webkit-font-smoothing: antialiased; 207 letter-spacing: 0 !important; 208 } 209 210 .footer__copy span:nth-child(2), 211 .footer__copy a[href*="ghost.org"], 212 .footer__copy a[href*="brightthemes.com"], 213 .footer-copyright__link, 214 .footer-copyright { 215 display: none !important; 216 } 217 218 /* Article content: current Gemini/Google-like reading style, fixed syntax. */ 219 .post-template .content, 220 .page-template .content, 221 .post-template .gh-content, 222 .page-template .gh-content { 223 display: block !important; 224 max-width: 740px !important; 225 width: 100% !important; 226 margin-left: auto !important; 227 margin-right: auto !important; 228 color: var(--xw-text) !important; 229 font-size: 17px !important; 230 line-height: 1.75 !important; 231 font-weight: 400 !important; 232 } 233 234 .post-template .content p, 235 .page-template .content p, 236 .post-template .gh-content p, 237 .page-template .gh-content p { 238 margin-top: 0 !important; 239 margin-bottom: 0.8em !important; 240 } 241 242 .post-template .content p:empty, 243 .page-template .content p:empty, 244 .post-template .gh-content p:empty, 245 .page-template .gh-content p:empty { 246 display: none !important; 247 } 248 249 .content h1, 250 .content h2, 251 .content h3, 252 .gh-content h1, 253 .gh-content h2, 254 255 margin: 0; 256 padding-left: 0; 257 } 258 259 .toc-list { 260 counter-reset: none; 261 display: flex; 262 flex-direction: column; 263 gap: 6px; 264 line-height: 1.4; 265 margin: 0; 266 padding: 0; 267 } 268 269 .toc-list .toc-list { padding-left: 12px; } 270 .toc-list-item { padding-left: 0; } 271 272 .toc-link { 273 border-radius: 8px; 274 color: #374151; 275 display: block; 276 padding: 4px 6px; 277 text-decoration: none; 278 transition: all 0.2s ease; 279 } 280 281 .toc-link::before { 282 background-color: transparent; 283 max-height: 20px; 284 } 285 286 .toc-link:hover { 287 background: rgba(255, 102, 0, 0.08); 288 color: #ff6600; 289 } 290 291 .is-active-link { 292 background: rgba(255, 102, 0, 0.08); 293 color: var(--ghost-accent-color, #ff6600) !important; 294 font-weight: 600; 295 } 296 297 .toc-toggle { 298 align-items: center; 299 background: #fff; 300 border: 3px solid #111; 301 border-radius: 14px; 302 box-shadow: 6px 6px 0 #111; 303 color: #111; 304 cursor: pointer; 305 display: none; 306 height: 44px; 307 justify-content: center; 308 padding: 8px; 309 position: fixed; 310 right: 1.5rem !important; 311 top: 6rem !important; 312 width: 44px; 313 z-index: 100; 314 } 315 316 .toc-toggle .icon-close { display: none; } 317 .toc-toggle.active .icon-close { display: block; } 318 .toc-toggle.active .icon-menu { display: none; } 319 320 @media (max-width: 900px) { 321 .js-toc { 322 max-width: 320px; 323 right: 1rem !important; 324 top: 7rem !important; 325 } 326 327 .toc-toggle { 328 right: 1rem !important; 329 top: 5.5rem !important; 330 } 331 } 332 333 /* Roadmap embed */ 334 article.content.post-access-public > .roadmap-stage, 335 article.gh-content.post-access-public > .roadmap-stage { 336 max-width: none !important; 337 width: 100vw !important; 338 margin-left: calc(50% - 50vw) !important; 339 margin-right: calc(50% - 50vw) !important; 340 } 341 342 .roadmap-stage { 343 background: #f3f4f6; 344 display: flex; 345 justify-content: center; 346 padding: 28px 0; 347 } 348 349 .roadmap-stage > .roadmap-embed { 350 background: #fff; 351 border: 1px solid rgba(15, 23, 42, 0.08); 352 border-radius: 16px; 353 box-shadow: 0 18px 50px rgba(15, 23, 42, 0.08); 354 height: min(86vh, 980px); 355 margin: 0 auto; 356 max-width: none !important; 357 overflow: hidden; 358 position: relative; 359 width: min(1680px, calc(100vw - 64px)) !important; 360 } 361 362 .roadmap-toolbar { 363 display: flex !important; 364 gap: 10px !important; 365 left: 300px !important; 366 pointer-events: auto !important; 367 position: absolute !important; 368 top: 16px !important; 369 z-index: 9999 !important; 370 } 371 372 .rm-btn { 373 background: rgba(255, 255, 255, 0.92); 374 backdrop-filter: blur(10px); 375 border: 1px solid rgba(0, 0, 0, 0.10); 376 border-radius: 12px; 377 cursor: pointer; 378 font-size: 14px; 379 line-height: 1; 380 padding: 10px 12px; 381 } 382 383 .rm-exit { display: none; } 384 .roadmap-embed.is-active .rm-enter { display: none; } 385 .roadmap-embed.is-active .rm-exit { display: inline-flex; } 386 387 .roadmap-iframe { 388 border: 0; 389 height: 100%; 390 inset: 0; 391 pointer-events: none; 392 position: absolute; 393 width: 100%; 394 } 395 396 .roadmap-embed.is-active .roadmap-iframe { 397 pointer-events: auto; 398 } 399 400 .rm-btn.rm-enter { 401 animation: rm-pulse 2.2s ease-in-out infinite; 402 background: linear-gradient(135deg, #ef4444, #dc2626); 403 border: none; 404 box-shadow: 0 6px 18px rgba(239, 68, 68, 0.35), 405 inset 0 -1px 0 rgba(0, 0, 0, 0.15); 406 color: #fff; 407 font-weight: 600; 408 } 409 410 @keyframes rm-pulse { 411 0% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.45); } 412 70% { box-shadow: 0 0 0 10px rgba(239, 68, 68, 0); } 413 100% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0); } 414 } 415</style>
416 <link rel="preconnect" href="https://fonts.bunny.net"><link rel="stylesheet" href="https://fonts.bunny.net/css?family=fira-mono:400,700"><style>:root {--gh-font-heading: Fira Mono;}</style> 417 <link rel="stylesheet" href="/assets/vendor/phosphor/duotone.css?v=e3e7e3db28"> 418 <link rel="stylesheet" href="/assets/css/screen.css?v=e3e7e3db28"> 419 <link rel="stylesheet" href="/assets/css/ai-roadmap.css?v=e3e7e3db28"> 420 <link rel="stylesheet" href="/assets/css/reading-colors.css?v=e3e7e3db28"> 421 <link rel="stylesheet" href="/assets/css/interview-sidebar.css?v=e3e7e3db28"> 422 <style>:root { --academy-accent: #2F5BEA; }</style> 423
423<script defer src="/assets/js/theme.js?v=e3e7e3db28"></script>
423 424</head> 425<body class="post-template tag-knowledge-points tag-roadmap tag-data-engineering-foundations tag-hash-order-011-2 gh-font-heading-fira-mono"> 426 <a class="skip-link" href="#academy-main">è·³å°ä¸»è¦å 容</a> 427 <div class="app-shell"> 428 <header class="topbar" data-header> 429 <div class="topbar__left"> 430 <button class="icon-button mobile-only" type="button" data-sidebar-open aria-label="æå¼è¯¾ç¨ç®å½"> 431 <span class="ui-icon ui-icon--menu" aria-hidden="true"></span> 432 </button> 433 <a class="brand" href="https://xiaowantree.com" aria-label="è¿åå¦ä¹ é¦é¡µ"> 434 <img class="brand__logo" src="https://xiaowantree.com/content/images/2025/12/Cat-Paw-Sticker---Cat-Paw-High-Five---Discover---Share-GIFs.gif" alt="å°ä¸æ¥å¯"> 435 </a> 436 </div> 437 438 <nav class="main-nav" aria-label="主导èª"> 439 <ul class="nav-list"> 440 <li class="nav-xu-yan-shi-yong-qian-bi-kan is-current"><a href="https://xiaowantree.com/shu-ju-gong-cheng-ru-men-lu-xian-tu/">åºè¨ï¼ä½¿ç¨åå¿ çï¼</a></li> 441 <li class="nav-shu-cang-lu-xian-tu-guo-nei-qiu-zhi-ban"><a href="https://xiaowantree.com/shi-shi-roadmap/">æ°ä»è·¯çº¿å¾ï¼å½å æ±èçï¼</a></li> 442 <li class="nav-shu-cang-lu-xian-tu-hai-wai-qiu-zhi-ban"><a href="https://xiaowantree.com/xue-xi-lu-jing-hai-wai-qiu-zhi-ban/">æ°ä»è·¯çº¿å¾ï¼æµ·å¤æ±èçï¼</a></li> 443 <li class="nav-zi-liao"><a href="https://xiaowantree.com/">èµæ</a></li> 444 <li class="nav-dai-ma-ku-kai-fa-zhong"><a href="https://git.xiaowantree.com/">代ç åºï¼å¼åä¸ï¼</a></li> 445 </ul> 446 447 <a class="main-nav__service-link" href="/services/">æå¡</a> 448 </nav> 449 450 <div class="topbar__actions"> 451 <a class="mobile-service-link mobile-only" href="/services/">æå¡</a> 452 <button class="search-field" type="button" data-ghost-search aria-label="æç´¢è¯¾ç¨ä¸æç« "> 453 <span class="ui-icon ui-icon--search" aria-hidden="true"></span> 454 <span>æç´¢è¯¾ç¨ãæç« ãé®ç</span> 455 <kbd>âK</kbd> 456 </button> 457 458 <button class="topbar-signin-button" type="button" data-portal="signin">ç»å½ / 注å</button> 459 </div> 460</header> 461 462 <div class="app-grid lesson-grid"> 463 <div class="sidebar-scrim" data-sidebar-scrim></div> 464<button class="desktop-sidebar-toggle" type="button" data-sidebar-collapse aria-controls="academy-course-sidebar" aria-expanded="true" aria-label="æå 左侧å¦ä¹ è·¯å¾" title="æå 左侧å¦ä¹ è·¯å¾"> 465 <i class="ph-duotone ph-sidebar-simple" aria-hidden="true"></i> 466 <span class="desktop-sidebar-toggle__label">æ¶èµ·è·¯å¾</span> 467</button> 468<aside class="course-sidebar" id="academy-course-sidebar" data-course-sidebar aria-label="课ç¨å¯¼èª"> 469 <div class="sidebar-mobile-head mobile-only"> 470 <strong>课ç¨ç®å½</strong> 471 <button class="icon-button" type="button" data-sidebar-close aria-label="å ³é课ç¨ç®å½"><span class="ui-icon ui-icon--close" aria-hidden="true"></span></button> 472 </div> 473 474 <div class="course-sidebar__scroll" data-sidebar-scroll> 475 <nav class="feed-sidebar-nav" aria-label="å°ä¸å¨æ"> 476 <a class="learning-path-link feed-sidebar-link " href="/xiaowan-feed/"> 477 <span class="learning-path-link__logo learning-path-link__logo--feed" aria-hidden="true"><i class="ph-duotone ph-chat-circle-dots"></i></span> 478 <span><strong>Feed</strong><small>å°ä¸å¨æ</small></span> 479 <span class="feed-sidebar-link__count" data-feed-week-badge hidden></span> 480 </a> 481 </nav> 482 483 <div data-feed-tag-source hidden> 484 <span data-feed-tag-record 485 data-feed-published="2026-09-27T12:25:18.000+08:00" 486 data-feed-tags="ai|" 487 data-feed-tag-names="AI|"></span> 488 <span data-feed-tag-record 489 data-feed-published="2026-09-27T12:24:27.000+08:00" 490 data-feed-tags="system-design-2|hai-wai-qiu-zhi|" 491 data-feed-tag-names="system design|æµ·å¤æ±è|"></span> 492 <span data-feed-tag-record 493 data-feed-published="2026-09-27T12:23:23.000+08:00" 494 data-feed-tags="ai|" 495 data-feed-tag-names="AI|"></span>
496 <span data-feed-tag-record 497 data-feed-published="2026-09-04T15:39:08.000+08:00" 498 data-feed-tags="" 499 data-feed-tag-names=""></span> 500 <span data-feed-tag-record 501 data-feed-published="2026-09-04T15:29:50.000+08:00" 502 data-feed-tags="" 503 data-feed-tag-names=""></span> 504 <span data-feed-tag-record 505 data-feed-published="2026-08-22T21:50:08.000+08:00" 506 data-feed-tags="" 507 data-feed-tag-names=""></span> 508 <span data-feed-tag-record 509 data-feed-published="2026-07-31T14:22:29.000+08:00" 510 data-feed-tags="" 511 data-feed-tag-names=""></span> 512 <span data-feed-tag-record 513 data-feed-published="2026-07-30T14:42:51.000+08:00" 514 data-feed-tags="" 515 data-feed-tag-names=""></span> 516 <span data-feed-tag-record 517 data-feed-published="2026-07-30T14:18:56.000+08:00" 518 data-feed-tags="system-design-2|" 519 data-feed-tag-names="system design|"></span> 520 <span data-feed-tag-record 521 data-feed-published="2026-07-30T01:33:27.000+08:00" 522 data-feed-tags="ai|" 523 data-feed-tag-names="AI|"></span> 524 <span data-feed-tag-record 525 data-feed-published="2026-07-30T00:29:28.000+08:00" 526 data-feed-tags="hai-wai-qiu-zhi|" 527 data-feed-tag-names="æµ·å¤æ±è|"></span> 528 </div> 529 530 <nav class="learning-path-accordion" aria-label="éæ©å¦ä¹ è·¯å¾"> 531 <section class="learning-path-branch is-active is-expanded" data-path-branch> 532 <a class="learning-path-link is-active" href="/learning-path/" data-path-toggle aria-current="page" aria-expanded="true" aria-controls="path-content-data"> 533 <span class="learning-path-link__logo learning-path-link__logo--data" aria-hidden="true"><i class="ph-duotone ph-database"></i></span> 534 <span>Data Engineering å¦ä¹ è·¯å¾</span> 535 <i class="ph-duotone ph-caret-down learning-path-link__caret" aria-hidden="true"></i> 536 </a> 537 <div class="learning-path-branch__content" id="path-content-data" data-path-content> 538 <div class="course-groups"> 539 <section class="course-group-block" data-module="data-world-two-camps" data-module-name="OLTP vs OLAP"> 540 <button class="course-group-toggle" type="button" data-module-toggle="data-world-two-camps" aria-expanded="true"> 541 <span>OLTP vs OLAP</span> 542 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 543 </button> 544 <div class="lesson-list module-lesson-list" data-module-lessons="data-world-two-camps"> 545 <a class="lesson-nav-item" href="/a-oltp-vs-olap-two-camps/" data-lesson-id="6a6d814351469b00017baa80" data-lesson-title="a. 两个éµè¥" data-lesson-summary="çè§£ OLTP ä¸ OLAP çè®¾è®¡ç®æ ãå ¸åæ¥è¯¢ãè¡ååå¨å·®å¼ï¼ä»¥ååæç³»ç»ä¸ºä»ä¹éè¦ä¸ä¸å¡æ°æ®åºåå¼ã" data-module-name="OLTP vs OLAP" data-course-tags="hash-order-010 "> 546 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 547 <span class="lesson-nav-item__copy"> 548 <strong>a. 两个éµè¥</strong> 549 <small>6 åé</small> 550 </span> 551 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 552 </a> 553 </div> 554 </section> 555 <section class="course-group-block" data-module="data-modeling" data-module-name="Data Modeling æ°æ®å»ºæ¨¡"> 556 <button class="course-group-toggle" type="button" data-module-toggle="data-modeling" aria-expanded="false"> 557 <span>Data Modeling æ°æ®å»ºæ¨¡</span> 558 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 559 </button> 560 <div class="lesson-list module-lesson-list" data-module-lessons="data-modeling" hidden> 561 <a class="lesson-nav-item" href="/a-fact-tables/" data-lesson-id="6a66d2f7df916c00013cbfaa" data-lesson-title="a. Fact Tables" data-lesson-summary="çè§£äºå®è¡¨çç²åº¦ã度éä¸ä¸ç§å ¸åç±»åï¼äºå¡ãå¨æå¿«ç §åç´¯ç§¯å¿«ç §ã" data-module-name="Data Modeling æ°æ®å»ºæ¨¡" data-course-tags="hash-order-010 ">
562 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 563 <span class="lesson-nav-item__copy"> 564 <strong>a. Fact Tables</strong> 565 <small>5 åé</small> 566 </span> 567 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 568 </a> 569 <a class="lesson-nav-item" href="/b-dim-tables/" data-lesson-id="6a66d2f7df916c00013cbfb5" data-lesson-title="b. Dim Tables" data-lesson-summary="ç解维度表ä¸ç¼æ ¢åå维度ï¼SCDï¼ï¼ææ¡ Type 1ãType 2 å Type 3 çå·®å¼ã" data-module-name="Data Modeling æ°æ®å»ºæ¨¡" data-course-tags="hash-order-020 "> 570 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 571 <span class="lesson-nav-item__copy"> 572 <strong>b. Dim Tables</strong> 573 <small>3 åé</small> 574 </span> 575 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 576 </a> 577 <a class="lesson-nav-item" href="/c-database-modeling/" data-lesson-id="6a66d2f9df916c00013cbfc0" data-lesson-title="c. Database Modeling" data-lesson-summary="çè§£ schemaãäºå®è¡¨ä¸ç»´åº¦è¡¨çåå·¥ï¼ä»¥å主å¤é®å ³èåæå模åï¼å»ºç«æ°æ®ä»åºå»ºæ¨¡çåºç¡ã" data-module-name="Data Modeling æ°æ®å»ºæ¨¡" data-course-tags="hash-order-030 "> 578 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 579 <span class="lesson-nav-item__copy"> 580 <strong>c. Database Modeling</strong> 581 <small>4 åé</small> 582 </span> 583 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 584 </a> 585 <a class="lesson-nav-item" href="/d-data-model-sop/" data-lesson-id="6aa7ed7a51469b00017bb12b" data-lesson-title="d. Data model ç SOP" data-lesson-summary="ç¨åæ¥ SOP æåä¸å¡è¦ç´ ãéæ©äºå®è¡¨ãå®ä¹ç²åº¦ä¸ç»´åº¦ï¼å¹¶éè¿å¤å平尿¡ä¾ç»ä¹ 宿´ç建模æè·¯ã" data-module-name="Data Modeling æ°æ®å»ºæ¨¡" data-course-tags="hash-order-040 "> 586 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 587 <span class="lesson-nav-item__copy"> 588 <strong>d. Data model ç SOP</strong> 589 <small>8 åé</small> 590 </span> 591 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 592 </a> 593 </div> 594 </section> 595 <section class="course-group-block" data-module="data-warehouse" data-module-name="Data Warehouse æ°æ®ä»åº"> 596 <button class="course-group-toggle" type="button" data-module-toggle="data-warehouse" aria-expanded="false"> 597 <span>Data Warehouse æ°æ®ä»åº</span> 598 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 599 </button> 600 <div class="lesson-list module-lesson-list" data-module-lessons="data-warehouse" hidden> 601 <a class="lesson-nav-item" href="/a-etl/" data-lesson-id="6a66d752df916c00013cbfd3" data-lesson-title="a. ETL" data-lesson-summary="ä» ExtractionãTransformation å° Loadï¼çè§£ ETL çæ ¸å¿é¶æ®µã常è§å¤çæ¹å¼ä¸ SCD çç¥ã" data-module-name="Data Warehouse æ°æ®ä»åº" data-course-tags="hash-order-010 "> 602 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 603 <span class="lesson-nav-item__copy"> 604 <strong>a. ETL</strong> 605 <small>5 åé</small> 606 </span> 607 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 608 </a> 609 <a class="lesson-nav-item" href="/b-sql-database-and-nosql-database/" data-lesson-id="6a66d753df916c00013cbfde" data-lesson-title="b. SQLæ°æ®åºä¸NoSQLæ°æ®åº" data-lesson-summary="æ¯è¾ SQL ä¸ NoSQL æ°æ®åºçéç¨åºæ¯ï¼å¹¶çè§£ Redshift çåå¼åå¨ãdistkey ä¸ sortkeyã" data-module-name="Data Warehouse æ°æ®ä»åº" data-course-tags="hash-order-020 "> 610 <span class="lesson-nav-item__icon" aria-hidden="true"></span>
611 <span class="lesson-nav-item__copy"> 612 <strong>b. SQLæ°æ®åºä¸NoSQLæ°æ®åº</strong> 613 <small>5 åé</small> 614 </span> 615 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 616 </a> 617 <a class="lesson-nav-item" href="/c-data-warehouse-optimization/" data-lesson-id="6a66d753df916c00013cbfe9" data-lesson-title="c. æ´å¤çæ°æ®ä»åºä¼åææ®µ" data-lesson-summary="å´ç»å缩ãååºãå°æä»¶ãç©åè§å¾ãå®½è¡¨ä¸ SQL è°ä¼ï¼ç³»ç»ææ¡æ°æ®ä»åºæ§è½ä¼åã" data-module-name="Data Warehouse æ°æ®ä»åº" data-course-tags="hash-order-030 "> 618 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 619 <span class="lesson-nav-item__copy"> 620 <strong>c. æ´å¤çæ°æ®ä»åºä¼åææ®µ</strong> 621 <small>6 åé</small> 622 </span> 623 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 624 </a> 625 <a class="lesson-nav-item" href="/de-faq-warehouse-cn/" data-lesson-id="6aafbc3351469b00017bb220" data-lesson-title="é¢è¯å¸¸èé®é¢ï½æ°æ®ä»åºï¼å½å ï¼" data-lesson-summary="æ°æ®ä»åºé¢è¯å¸¸èé®é¢ï¼è¦ç维度建模ãETLãSCDãåå±ä¸æ§è½ä¼åã" data-module-name="Data Warehouse æ°æ®ä»åº" data-course-tags="hash-order-900 "> 626 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 627 <span class="lesson-nav-item__copy"> 628 <strong>é¢è¯å¸¸èé®é¢ï½æ°æ®ä»åºï¼å½å ï¼</strong> 629 <small>5 åé</small> 630 </span> 631 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 632 </a> 633 </div> 634 </section> 635 <section class="course-group-block" data-module="data-lake-lakehouse" data-module-name="Data Lake & Lakehouse"> 636 <button class="course-group-toggle" type="button" data-module-toggle="data-lake-lakehouse" aria-expanded="false"> 637 <span>Data Lake & Lakehouse</span> 638 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 639 </button> 640 <div class="lesson-list module-lesson-list" data-module-lessons="data-lake-lakehouse" hidden> 641 <a class="lesson-nav-item" href="/c-lakehouse-hu-cang/" data-lesson-id="6a5f3ca7c4edad0001d48356" data-lesson-title="c. Lakehouse æ¹ä»" data-lesson-summary="æ¬æä»ç» Lakehouse çæ ¸å¿æ¦å¿µï¼ä»¥åå®å¦ä½ç»å Data Lake ä¸ Data Warehouse çè½åãååé¨åå°éè¿ Delta Lake å®éªï¼æ¼ç¤ºäºå¡æ¥å¿ãæ°æ®çæ¬ãTime Travel å RESTORE çå®é æä½ã" data-module-name="Data Lake & Lakehouse" data-course-tags="hash-order-030 "> 642 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 643 <span class="lesson-nav-item__copy"> 644 <strong>c. Lakehouse æ¹ä»</strong> 645 <small>40 åé</small> 646 </span> 647 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 648 </a> 649 <a class="lesson-nav-item" href="/a-delta-lake-from-files-to-table/" data-lesson-id="6a66dd4ddf916c00013cbff5" data-lesson-title="a. æ°æ®æ¹åºç¡" data-lesson-summary="çè§£ Delta Lake å¦ä½éè¿ _delta_log 为 Parquet æä»¶è¡¥ä¸äºå¡ãSchema 管çãTime Travel ä¸ DML è½åã" data-module-name="Data Lake & Lakehouse" data-course-tags="hash-order-010 "> 650 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 651 <span class="lesson-nav-item__copy"> 652 <strong>a. æ°æ®æ¹åºç¡</strong> 653 <small>7 åé</small> 654 </span> 655 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 656 </a> 657 <a class="lesson-nav-item" href="/b-data-lake-data-swamp/" data-lesson-id="6a6c447a51469b00017baa20" data-lesson-title="b. æ°æ®æ¹çé®é¢ï¼Data Swampï¼" data-lesson-summary="çè§£æ°æ®æ¹ä¸ºä»ä¹ä¼å 缺ä¹äºå¡ãSchema 管çãå°æä»¶æ²»ç䏿°æ®æ²»çè½åèéå为 Data Swampã" data-module-name="Data Lake & Lakehouse" data-course-tags="hash-order-025 ">
658 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 659 <span class="lesson-nav-item__copy"> 660 <strong>b. æ°æ®æ¹çé®é¢ï¼Data Swampï¼</strong> 661 <small>9 åé</small> 662 </span> 663 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 664 </a> 665 <a class="lesson-nav-item" href="/f-medallion-jia-gou/" data-lesson-id="6a6c552851469b00017baa2f" data-lesson-title="e. Medallion æ¶æ" data-lesson-summary="çè§£æ¹ä»ä¸ç BronzeãSilverãGold åå±ï¼ä»¥åæ°æ®éç®ãææ¥å责任边ç为ä»ä¹éè¦ Medallion æ¶æã" data-module-name="Data Lake & Lakehouse" data-course-tags="hash-order-060 "> 666 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 667 <span class="lesson-nav-item__copy"> 668 <strong>e. Medallion æ¶æ</strong> 669 <small>5 åé</small> 670 </span> 671 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 672 </a> 673 <a class="lesson-nav-item" href="/g-metadata-catalog/" data-lesson-id="6a6c628351469b00017baa52" data-lesson-title="f. å æ°æ® & Catalog" data-lesson-summary="çè§£ Catalog å¦ä½è¿æ¥åå¨ã计ç®ä¸è¡¨æ ¼å¼ï¼ææ¡ä¸»æµ Catalog çè½åå·®å¼åéåæè·¯ã" data-module-name="Data Lake & Lakehouse" data-course-tags="hash-order-070 "> 674 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 675 <span class="lesson-nav-item__copy"> 676 <strong>f. å æ°æ® & Catalog</strong> 677 <small>10 åé</small> 678 </span> 679 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 680 </a> 681 <a class="lesson-nav-item" href="/g-lakehouse-optimization/" data-lesson-id="6a6d71d551469b00017baa71" data-lesson-title="g. Lakehouse ä¼å" data-lesson-summary="ææ¡ Data SkippingãZ-OrderãLiquid ClusteringãOPTIMIZEãVACUUM çæ¹ä»ä¼åææ®µåæ ¢æ¥è¯¢ææ¥é¡ºåºã" data-module-name="Data Lake & Lakehouse" data-course-tags="hash-order-080 "> 682 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 683 <span class="lesson-nav-item__copy"> 684 <strong>g. Lakehouse ä¼å</strong> 685 <small>13 åé</small> 686 </span> 687 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 688 </a> 689 <a class="lesson-nav-item" href="/de-faq-lakehouse-overseas/" data-lesson-id="6aafbc3451469b00017bb22d" data-lesson-title="é¢è¯å¸¸èé®é¢ï½Lakehouseï¼æµ·å¤ï¼" data-lesson-summary="æåä¸ªä¸»é¢æ´çæ¹ä»é¢è¯é®é¢ï¼è¦ç弿¾è¡¨æ ¼å¼ãETLãæ§è½ãæ²»çä¸åºæ¯é¢ã" data-module-name="Data Lake & Lakehouse" data-course-tags="hash-order-900 "> 690 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 691 <span class="lesson-nav-item__copy"> 692 <strong>é¢è¯å¸¸èé®é¢ï½Lakehouseï¼æµ·å¤ï¼</strong> 693 <small>6 åé</small> 694 </span> 695 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 696 </a> 697 </div> 698 </section> 699 <section class="course-group-block" data-module="spark" data-module-name="Spark åå¸å¼è®¡ç®å¼æ"> 700 <button class="course-group-toggle" type="button" data-module-toggle="spark" aria-expanded="false"> 701 <span>Spark åå¸å¼è®¡ç®å¼æ</span> 702 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 703 </button> 704 <div class="lesson-list module-lesson-list" data-module-lessons="spark" hidden> 705 <a class="lesson-nav-item" href="/a-spark-he-xin-gai-nian/" data-lesson-id="6a585696c4edad0001d4801e" data-lesson-title="a. Spark æ ¸å¿æ¦å¿µ" data-lesson-summary="ä»åæºç¶é¢åºåï¼çè§£ Spark çåå¸å¼è®¡ç®æ¨¡åï¼ææ¡ DriverãExecutorãPartitionãDataFrameãæ°æ§æ±å¼ä»¥å Transformation ä¸ Actionã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-010 ">
706 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 707 <span class="lesson-nav-item__copy"> 708 <strong>a. Spark æ ¸å¿æ¦å¿µ</strong> 709 <small>15 åé</small> 710 </span> 711 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 712 </a> 713 <a class="lesson-nav-item" href="/b-zhi-xing-yuan-li/" data-lesson-id="6a5c3c08c4edad0001d4819c" data-lesson-title="b. æ§è¡åç" data-lesson-summary="ä»ä¸æ¬¡ Action åºåï¼æè§£ Spark å¦ä½æå»º DAGãè¯å«å®½çªä¾èµãæ Shuffle åå Stageï¼å¹¶æ Partition 转æ¢ä¸ºå¯å¹¶è¡æ§è¡ç Taskã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-020 "> 714 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 715 <span class="lesson-nav-item__copy"> 716 <strong>b. æ§è¡åç</strong> 717 <small>13 åé</small> 718 </span> 719 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 720 </a> 721 <a class="lesson-nav-item" href="/c-spark-sql-you-hua-qi/" data-lesson-id="6a5c3d83c4edad0001d481b4" data-lesson-title="c. Spark SQL & ä¼åå¨" data-lesson-summary="çè§£ DataFrame ä¸ SQL å¦ä½ç»è¿ Catalyst çæç©ç计åï¼å¹¶ææ¡è°è¯ä¸æ¨ãJoin çç¥éæ©å AQE è¿è¡æ¶ä¼åçæ ¸å¿æºå¶ã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-030 "> 722 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 723 <span class="lesson-nav-item__copy"> 724 <strong>c. Spark SQL & ä¼åå¨</strong> 725 <small>18 åé</small> 726 </span> 727 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 728 </a> 729 <a class="lesson-nav-item" href="/d-zuo-ye-ceng-diao-you/" data-lesson-id="6a5c431fc4edad0001d481c8" data-lesson-title="d. ä½ä¸å±è°ä¼" data-lesson-summary="以 Spark UI ä¸ºå ¥å£ï¼ç³»ç»ææ¥æ°æ®å¾æãShuffle è¨èãå°æä»¶ãSpill ä¸ OOMï¼å¹¶éè¿ååºã广æåç¼åä¼åæ ¢ä½ä¸ã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-040 "> 730 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 731 <span class="lesson-nav-item__copy"> 732 <strong>d. ä½ä¸å±è°ä¼</strong> 733 <small>10 åé</small> 734 </span> 735 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 736 </a> 737 <a class="lesson-nav-item" href="/e-bu-shu-yu-zi-yuan/" data-lesson-id="6a5c43adc4edad0001d481dd" data-lesson-title="e. é¨ç½²ä¸èµæº" data-lesson-summary="çè§£ Spark å¨ YARN ä¸ Kubernetes ä¸çé¨ç½²æ¹å¼ï¼å¦ä¼é ç½® Executor èµæºï¼å¹¶ææ¡ Structured Streaming çå¾®æ¹ãWatermark ä¸ Checkpointã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-050 "> 738 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 739 <span class="lesson-nav-item__copy"> 740 <strong>e. é¨ç½²ä¸èµæº</strong> 741 <small>7 åé</small> 742 </span> 743 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 744 </a> 745 <a class="lesson-nav-item" href="/de-faq-spark-english/" data-lesson-id="6aafbc0751469b00017bb1ec" data-lesson-title="é¢è¯å¸¸èé®é¢ï½Sparkï¼è±æï¼å«é¨åçæ¡ï¼" data-lesson-summary="è±æ Spark é®é¢æ¸ åï¼ä»¥ååæå·²æçåºç¡ä¸æ¶æé®çã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-900 "> 746 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 747 <span class="lesson-nav-item__copy"> 748 <strong>é¢è¯å¸¸èé®é¢ï½Sparkï¼è±æï¼å«é¨åçæ¡ï¼</strong> 749 <small>9 åé</small> 750 </span> 751 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 752 </a> 753 <a class="lesson-nav-item" href="/de-faq-spark-cn/" data-lesson-id="6aafbc3051469b00017bb1f9" data-lesson-title="é¢è¯å¸¸èé®é¢ï½Sparkï¼å½å ï¼60 é¢ï¼" data-lesson-summary="60 é Spark é¢è¯å¸¸èé®é¢ï¼ä¿çåæé¾åº¦ä¸æ ç¾ï¼æé¾åº¦å段å¤ä¹ ã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-910 ">
754 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 755 <span class="lesson-nav-item__copy"> 756 <strong>é¢è¯å¸¸èé®é¢ï½Sparkï¼å½å ï¼60 é¢ï¼</strong> 757 <small>7 åé</small> 758 </span> 759 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 760 </a> 761 <a class="lesson-nav-item" href="/de-faq-spark-sql-cn/" data-lesson-id="6aafbc3151469b00017bb206" data-lesson-title="é¢è¯å¸¸èé®é¢ï½Spark SQLï¼å½å ï¼" data-lesson-summary="Spark SQL é¢è¯å¸¸èé®é¢ï¼è¦ç DataFrameãCatalystãHive éæä¸æ¥è¯¢è°ä¼ã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-920 "> 762 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 763 <span class="lesson-nav-item__copy"> 764 <strong>é¢è¯å¸¸èé®é¢ï½Spark SQLï¼å½å ï¼</strong> 765 <small>5 åé</small> 766 </span> 767 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 768 </a> 769 <a class="lesson-nav-item" href="/de-faq-pyspark-cn/" data-lesson-id="6aafbc3251469b00017bb213" data-lesson-title="é¢è¯å¸¸èé®é¢ï½PySparkï¼å½å ï¼" data-lesson-summary="PySpark é¢è¯å¸¸èé®é¢ï¼è¦ç SparkSessionãRDDãDataFrame 䏿§è½ä¼åã" data-module-name="Spark åå¸å¼è®¡ç®å¼æ" data-course-tags="hash-order-930 "> 770 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 771 <span class="lesson-nav-item__copy"> 772 <strong>é¢è¯å¸¸èé®é¢ï½PySparkï¼å½å ï¼</strong> 773 <small>4 åé</small> 774 </span> 775 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 776 </a> 777 </div> 778 </section> 779 <section class="course-group-block" data-module="cloud-platform" data-module-name="äºå¹³å°"> 780 <button class="course-group-toggle" type="button" data-module-toggle="cloud-platform" aria-expanded="false"> 781 <span>äºå¹³å°</span> 782 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 783 </button> 784 <div class="lesson-list module-lesson-list" data-module-lessons="cloud-platform" hidden> 785 <a class="lesson-nav-item" href="/dbt/" data-lesson-id="6aa8d21d51469b00017bb154" data-lesson-title="dbt" data-lesson-summary="åå¤ Data Engineer æè Analytics Engineer é¢è¯ï¼dbt å°åºéè¦å¦ä»ä¹ï¼å¦å°ä»ä¹ç¨åº¦ï¼" data-module-name="äºå¹³å°" data-course-tags="hash-order-010 "> 786 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 787 <span class="lesson-nav-item__copy"> 788 <strong>dbt</strong> 789 <small>5 åé</small> 790 </span> 791 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 792 </a> 793 </div> 794 </section> 795 <section class="course-group-block" data-module="data-governance" data-module-name="Data Governance æ°æ®æ²»ç"> 796 <button class="course-group-toggle" type="button" data-module-toggle="data-governance" aria-expanded="false"> 797 <span>Data Governance æ°æ®æ²»ç</span> 798 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 799 </button> 800 <div class="lesson-list module-lesson-list" data-module-lessons="data-governance" hidden> 801 <a class="lesson-nav-item" href="/a-what-is-data-governance/" data-lesson-id="6a99288051469b00017baf1a" data-lesson-title="a. Data Governance å ¨æ¯ï¼ä»æ°æ®èµäº§å°å¯ä¿¡æ°æ®äº§å" data-lesson-summary="ä»å®ä¹åºåï¼çè§£ Data GovernanceãData Management ä¸ Data Quality çåºå«ï¼å¹¶ææ¡æ°æ®æ²»ççå ä¸ªæ ¸å¿ç®æ ã" data-module-name="Data Governance æ°æ®æ²»ç" data-course-tags="hash-order-010 "> 802 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 803 <span class="lesson-nav-item__copy"> 804 <strong>a. Data Governance å ¨æ¯ï¼ä»æ°æ®èµäº§å°å¯ä¿¡æ°æ®äº§å</strong> 805 <small>52 åé</small> 806 </span>
807 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 808 </a> 809 </div> 810 </section> 811 <section class="course-group-block" data-module="system-design" data-module-name="System Design ç³»ç»è®¾è®¡"> 812 <button class="course-group-toggle" type="button" data-module-toggle="system-design" aria-expanded="false"> 813 <span>System Design ç³»ç»è®¾è®¡</span> 814 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 815 </button> 816 <div class="lesson-list module-lesson-list" data-module-lessons="system-design" hidden> 817 <a class="lesson-nav-item" href="/schema-bian-geng-data-engineerying-gai-zen-yao-zuo/" data-lesson-id="6a60ad9b4875ab0001917c8e" data-lesson-title="Schema åæ´-Data Engineeråºè¯¥æä¹å" data-lesson-summary="æ´çäºschemaåæ´çè¯ï¼Data Engineerå¯ä»¥ä»å 个æ¹é¢å»èèï¼éNetflixãpaypal Databricks Uber Airbnbçå ¬å¸çåæ³ï¼ä¹ç²è´´äºåæã" data-module-name="System Design ç³»ç»è®¾è®¡" data-course-tags="hash-featured-order-010 "> 818 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 819 <span class="lesson-nav-item__copy"> 820 <strong>Schema åæ´-Data Engineeråºè¯¥æä¹å</strong> 821 <small>20 åé</small> 822 </span> 823 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 824 </a> 825 <a class="lesson-nav-item" href="/a-data-storage-s3/" data-lesson-id="6a66e326df916c00013cc003" data-lesson-title="a. æ°æ®åå¨ï¼S3" data-lesson-summary="çè§£ S3 ä½ä¸ºæ°æ®æ¹åå¨çæ ¸å¿å®ä½ã容éåä½ãåå¨å±çº§ä¸ææ¬æè¡¡ã" data-module-name="System Design ç³»ç»è®¾è®¡" data-course-tags="hash-order-010 "> 826 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 827 <span class="lesson-nav-item__copy"> 828 <strong>a. æ°æ®åå¨ï¼S3</strong> 829 <small>3 åé</small> 830 </span> 831 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 832 </a> 833 <a class="lesson-nav-item" href="/b-compute-resources/" data-lesson-id="6a66e327df916c00013cc00e" data-lesson-title="b. 计ç®èµæºï¼Computeï¼" data-lesson-summary="ç解计ç®èµæºãCPU è´è½½ãEC2ãåç´ä¸æ°´å¹³æ©å±ãç¼å以å ETL å·¥å ·çåºå±å ³ç³»ã" data-module-name="System Design ç³»ç»è®¾è®¡" data-course-tags="hash-order-020 "> 834 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 835 <span class="lesson-nav-item__copy"> 836 <strong>b. 计ç®èµæºï¼Computeï¼</strong> 837 <small>6 åé</small> 838 </span> 839 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 840 </a> 841 <a class="lesson-nav-item" href="/d-system-design-case-study/" data-lesson-id="6a66e328df916c00013cc019" data-lesson-title="d. ç³»ç»è®¾è®¡ââæ¡ä¾ç ç©¶" data-lesson-summary="以 Robinhood æ°æ®æ¹ä¸ºæ¡ä¾ï¼æè§£æå ¥ãåå¨ãå¤çãæ¥è¯¢ãéªè¯ä¸ç¨æ·äº¤äºå±çæ¶æåèã" data-module-name="System Design ç³»ç»è®¾è®¡" data-course-tags="hash-order-040 "> 842 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 843 <span class="lesson-nav-item__copy"> 844 <strong>d. ç³»ç»è®¾è®¡ââæ¡ä¾ç ç©¶</strong> 845 <small>9 åé</small> 846 </span> 847 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 848 </a> 849 <a class="lesson-nav-item" href="/e-system-design-questions/" data-lesson-id="6a66e329df916c00013cc024" data-lesson-title="e. ç³»ç»è®¾è®¡é®é¢ï¼questionsï¼" data-lesson-summary="éè¿ TinyURL ä¸é³ä¹æ¨è两个é¢ç®ï¼ç»ä¹ æ°æ®å·¥ç¨ç³»ç»è®¾è®¡çéæ±åæä¸æ¶æè¡¨è¾¾ã" data-module-name="System Design ç³»ç»è®¾è®¡" data-course-tags="hash-order-050 "> 850 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 851 <span class="lesson-nav-item__copy"> 852 <strong>e. ç³»ç»è®¾è®¡é®é¢ï¼questionsï¼</strong> 853 <small>1 åé</small> 854 </span>
855 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 856 </a> 857 <a class="lesson-nav-item" href="/f-system-design-interview-seven-step-framework/" data-lesson-id="6a66e32adf916c00013cc02f" data-lesson-title="f. ç³»ç»è®¾è®¡é¢è¯ç 7 æ¥æ¡æ¶" data-lesson-summary="ææ¡æ°æ®å·¥ç¨ç³»ç»è®¾è®¡é¢è¯ç䏿¥æ¡æ¶ï¼éæ±ãè§æ¨¡ãæ¶æãæ¨¡åãæµæ°´çº¿ãæ·±æä¸ SLAã" data-module-name="System Design ç³»ç»è®¾è®¡" data-course-tags="hash-order-060 "> 858 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 859 <span class="lesson-nav-item__copy"> 860 <strong>f. ç³»ç»è®¾è®¡é¢è¯ç 7 æ¥æ¡æ¶</strong> 861 <small>6 åé</small> 862 </span> 863 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 864 </a> 865 </div> 866 </section> 867 <section class="course-group-block" data-module="sql" data-module-name="SQL"> 868 <button class="course-group-toggle" type="button" data-module-toggle="sql" aria-expanded="false"> 869 <span>SQL</span> 870 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 871 </button> 872 <div class="lesson-list module-lesson-list" data-module-lessons="sql" hidden> 873 <a class="lesson-nav-item" href="/a-calculate-metrics-with-sql/" data-lesson-id="6a66e32cdf916c00013cc03a" data-lesson-title="a. éè¿SQLè®¡ç®ææ " data-lesson-summary="éè¿å ç±»ä¸å¡é¢ä¸è¾å ¥è¾åºç»ä¹ ï¼ææ¡èåãè¿æ¥ãçªå£å½æ°ãæ¥æè®¡ç®å SQL ææ è®¾è®¡ã" data-module-name="SQL" data-course-tags="hash-order-010 "> 874 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 875 <span class="lesson-nav-item__copy"> 876 <strong>a. éè¿SQLè®¡ç®ææ </strong> 877 <small>20 åé</small> 878 </span> 879 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 880 </a> 881 <a class="lesson-nav-item" href="/b-create-tables/" data-lesson-id="6a66e32edf916c00013cc045" data-lesson-title="b. 表å建" data-lesson-summary="çè§£ Redshift 建表è¯å¥ä¸çæ°æ®ç±»åãDISTKEY ä¸ SORTKEYï¼ä»¥åå®ä»¬å¯¹åå¨åæ¥è¯¢çå½±åã" data-module-name="SQL" data-course-tags="hash-order-020 "> 882 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 883 <span class="lesson-nav-item__copy"> 884 <strong>b. 表å建</strong> 885 <small>1 åé</small> 886 </span> 887 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 888 </a> 889 </div> 890 </section> 891 <section class="course-group-block" data-module="product-sense" data-module-name="Product Sense 产å & ä¸å¡"> 892 <button class="course-group-toggle" type="button" data-module-toggle="product-sense" aria-expanded="false"> 893 <span>Product Sense 产å & ä¸å¡</span> 894 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 895 </button> 896 <div class="lesson-list module-lesson-list" data-module-lessons="product-sense" hidden> 897 <a class="lesson-nav-item" href="/a-tlq-product-sense/" data-lesson-id="6a66ecdfdf916c00013cc05a" data-lesson-title="a. TLQ" data-lesson-summary="éè¿ TLQ å·¥ä¸è®¾å¤æ¡ä¾ï¼çè§£è¿å®æ¶æ°æ®æ¶æå¦ä½å¨å¯é æ§ãæ´æ°é¢ç䏿æ¬ä¹é´ååºæè¡¡ã" data-module-name="Product Sense 产å & ä¸å¡" data-course-tags="hash-order-010 "> 898 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 899 <span class="lesson-nav-item__copy"> 900 <strong>a. TLQ</strong> 901 <small>3 åé</small> 902 </span> 903 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 904 </a> 905 <a class="lesson-nav-item" href="/b-auto-product-sense/" data-lesson-id="6a66ecdfdf916c00013cc065" data-lesson-title="b. Auto" data-lesson-summary="éè¿ Auto å ¨çåæ¡ä¾ï¼çè§£æ°æ®ç®¡éèªå¨åãæ°æ®è´¨éæ ¡éªä¸å¯æ©å±è®¾è®¡å¦ä½åé ä¸å¡ä»·å¼ã" data-module-name="Product Sense 产å & ä¸å¡" data-course-tags="hash-order-020 ">
906 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 907 <span class="lesson-nav-item__copy"> 908 <strong>b. Auto</strong> 909 <small>2 åé</small> 910 </span> 911 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 912 </a> 913 <a class="lesson-nav-item" href="/c-caching-scalability-optimization/" data-lesson-id="6a66ece0df916c00013cc070" data-lesson-title="c. ç¼åï¼æ©å±æ§ä¼åï¼" data-lesson-summary="éè¿ééååæµé峰弿¡ä¾ï¼çè§£ Redis ç¼åå¦ä½é使æ¬ãæåå¼¹æ§ä¸ç¨æ·ä½éªã" data-module-name="Product Sense 产å & ä¸å¡" data-course-tags="hash-order-030 "> 914 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 915 <span class="lesson-nav-item__copy"> 916 <strong>c. ç¼åï¼æ©å±æ§ä¼åï¼</strong> 917 <small>1 åé</small> 918 </span> 919 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 920 </a> 921 <a class="lesson-nav-item" href="/d-machine-learning-real-time-application/" data-lesson-id="6a66ece0df916c00013cc07b" data-lesson-title="d. æºå¨å¦ä¹ ï¼å®æ¶ååºç¨ï¼" data-lesson-summary="éè¿é¤é¥®æºå¨è§è§æ¡ä¾ï¼çè§£ S3ãAirflow ä¸ SageMaker å¦ä½æ¯ææºå¨å¦ä¹ ç³»ç»çè§æ¨¡åè½å°ã" data-module-name="Product Sense 产å & ä¸å¡" data-course-tags="hash-order-040 "> 922 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 923 <span class="lesson-nav-item__copy"> 924 <strong>d. æºå¨å¦ä¹ ï¼å®æ¶ååºç¨ï¼</strong> 925 <small>2 åé</small> 926 </span> 927 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 928 </a> 929 </div> 930 </section> 931 <section class="course-group-block" data-module="projects" data-module-name="宿项ç®"> 932 <button class="course-group-toggle" type="button" data-module-toggle="projects" aria-expanded="false"> 933 <span>宿项ç®</span> 934 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 935 </button> 936 <div class="lesson-list module-lesson-list" data-module-lessons="projects" hidden> 937 <p class="module-empty">å°æªåå¸è¯¾ç¨</p> 938 </div> 939 </section> 940 <section class="course-group-block" data-module="de-common-questions" data-module-name="é¢è¯å¸¸èé®é¢ · è¡¥å ä¸é¢"> 941 <button class="course-group-toggle" type="button" data-module-toggle="de-common-questions" aria-expanded="false"> 942 <span>é¢è¯å¸¸èé®é¢ · è¡¥å ä¸é¢</span> 943 <span><span class="module-count-badge is-empty" data-module-count>0</span><i class="group-caret" aria-hidden="true"></i></span> 944 </button> 945 <div class="lesson-list module-lesson-list" data-module-lessons="de-common-questions" hidden> 946 <a class="lesson-nav-item" href="/de-faq-hadoop-cn/" data-lesson-id="6aafbc3651469b00017bb23a" data-lesson-title="é¢è¯å¸¸èé®é¢ï½Hadoopï¼å½å ï¼" data-lesson-summary="Hadoop é¢è¯å¸¸èé®é¢ï¼ä¿çåæé¾åº¦æ ç¾ï¼è¦çæ ¸å¿ç»ä»¶ãåå¨ãè°åº¦ä¸å®¹éã" data-module-name="é¢è¯å¸¸èé®é¢ · è¡¥å ä¸é¢" data-course-tags="hash-order-010 "> 947 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 948 <span class="lesson-nav-item__copy"> 949 <strong>é¢è¯å¸¸èé®é¢ï½Hadoopï¼å½å ï¼</strong> 950 <small>5 åé</small> 951 </span> 952 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 953 </a> 954 <a class="lesson-nav-item" href="/de-faq-flink-cn/" data-lesson-id="6aafbc3751469b00017bb247" data-lesson-title="é¢è¯å¸¸èé®é¢ï½Flinkï¼å½å ï¼" data-lesson-summary="Flink é¢è¯å¸¸èé®é¢ï¼è¦çæµå¤çãç¶æãçªå£ãWatermark ä¸å®¹éã" data-module-name="é¢è¯å¸¸èé®é¢ · è¡¥å ä¸é¢" data-course-tags="hash-order-020 "> 955 <span class="lesson-nav-item__icon" aria-hidden="true"></span>
956 <span class="lesson-nav-item__copy"> 957 <strong>é¢è¯å¸¸èé®é¢ï½Flinkï¼å½å ï¼</strong> 958 <small>7 åé</small> 959 </span> 960 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 961 </a> 962 <a class="lesson-nav-item" href="/de-faq-kafka-cn/" data-lesson-id="6aafbc3851469b00017bb254" data-lesson-title="é¢è¯å¸¸èé®é¢ï½Kafkaï¼å½å ï¼" data-lesson-summary="Kafka é¢è¯å¸¸èé®é¢ï¼è¦ç TopicãPartitionãConsumer Groupãå¯é æ§ä¸æ§è½ã" data-module-name="é¢è¯å¸¸èé®é¢ · è¡¥å ä¸é¢" data-course-tags="hash-order-030 "> 963 <span class="lesson-nav-item__icon" aria-hidden="true"></span> 964 <span class="lesson-nav-item__copy"> 965 <strong>é¢è¯å¸¸èé®é¢ï½Kafkaï¼å½å ï¼</strong> 966 <small>6 åé</small> 967 </span> 968 <span class="access-state access-state--locked" aria-label="éè¦ä¼åæé"></span> 969 </a> 970 </div> 971 </section> 972 </div> 973 </div> 974 </section> 975 976 <section class="ar-side" aria-label="AI + Data å¦ä¹ è·¯å¾"> 977 <nav id="nav" aria-label="AI + Data 两æ¡å¦ä¹ è·¯å¾"> 978 <a class="hub-parent" href="/ai-data-learning-path/"><span class="path-icon"><i class="ph-duotone ph-chart-line-up" aria-hidden="true"></i></span><span>AI + Data å¦ä¹ è·¯å¾<small>两æ¡èä¸å¦ä¹ è·¯å¾</small></span><i class="ph-duotone ph-caret-down" aria-hidden="true"></i></a> 979 <div class="hub-children"> 980 <a class="path-button" href="/ai-data-learning-path/#ai-data"><span class="path-icon"><i class="ph-duotone ph-flow-arrow" aria-hidden="true"></i></span><span class="child-path-label">AI for Data Engineers<small>æ°æ®å·¥ç¨å¸ç AI è¿é¶ · 10 ç« </small></span><i class="ph-duotone ph-caret-right caret" aria-hidden="true"></i></a> 981 <a class="path-button" href="/ai-data-learning-path/#ai"><span class="path-icon"><i class="ph-duotone ph-cpu" aria-hidden="true"></i></span><span class="child-path-label">AI Engineer<small>AI åºç¨ä¸ Agent å·¥ç¨ Â· 17 ç« </small></span><i class="ph-duotone ph-caret-right caret" aria-hidden="true"></i></a> 982 </div> 983 </nav> 984</section> 985 986 <section class="learning-path-branch " data-path-branch> 987 <a class="learning-path-link " href="/ai-learning-path/" data-path-toggle> 988 <span class="learning-path-link__logo learning-path-link__logo--ai" aria-hidden="true"><i class="ph-duotone ph-brain"></i></span> 989 <span>AI å¦ä¹ è·¯å¾</span> 990 <i class="ph-duotone ph-caret-down learning-path-link__caret" aria-hidden="true"></i> 991 </a> 992 </section> 993 </nav> 994 995 <div class="sidebar-section-divider" role="separator" aria-label="èä¸å®æèµæº"> 996 <span>èä¸å®æ</span> 997 </div> 998 999 <nav class="sidebar-resource-links" aria-label="èä¸å®æèµæº"> 1000 <a class="sidebar-resource-link sidebar-resource-link--services" href="/services/?from=academy-sidebar" target="_blank" rel="noopener noreferrer"> 1001 <span class="learning-path-link__logo learning-path-link__logo--services" aria-hidden="true"><i class="ph-duotone ph-handshake"></i></span> 1002 <span> 1003 <strong>æ±èæå¡</strong> 1004 <small>Mock Interview · DE 项ç®</small> 1005 </span> 1006 <span class="sidebar-resource-link__arrow" aria-hidden="true"><i class="ph-duotone ph-arrow-up-right"></i></span> 1007 </a> 1008 1009 <a class="sidebar-resource-link sidebar-resource-link--featured " href="/featured-articles/?from=academy-sidebar"> 1010 <span class="learning-path-link__logo learning-path-link__logo--featured" aria-hidden="true"><i class="ph-duotone ph-book-open-text"></i></span> 1011 <span> 1012 <strong>深度精é</strong> 1013 <small>å¼å¾åå¤é 读ç好æç« </small> 1014 </span> 1015 <span class="sidebar-resource-link__count">5</span> 1016 </a> 1017 1018 <a class="sidebar-resource-link sidebar-resource-link--projects " href="/projects/?from=academy-sidebar"> 1019 <span class="learning-path-link__logo learning-path-link__logo--projects" aria-hidden="true"><i class="ph-duotone ph-kanban"></i></span>
1020 <span> 1021 <strong>宿项ç®åº</strong> 1022 <small>æç¥è¯åæä½å</small> 1023 </span> 1024 <span class="sidebar-resource-link__count">7</span> 1025 </a> 1026 1027 <a class="sidebar-resource-link sidebar-resource-link--interviews " href="/interview-questions/?from=academy-sidebar"> 1028 <span class="learning-path-link__logo learning-path-link__logo--interviews" aria-hidden="true"><i class="ph-duotone ph-briefcase"></i></span> 1029 <span> 1030 <strong>DE é¢è¯é¢åº</strong> 1031 <small>å½å 䏿µ·å¤å ¬å¸çé¢</small> 1032 </span> 1033 <span class="sidebar-resource-link__count">54</span> 1034 </a> 1035 1036 1037 <a class="sidebar-resource-link sidebar-resource-link--skills " href="/skills/?from=academy-sidebar"> 1038 <span class="learning-path-link__logo learning-path-link__logo--skills" aria-hidden="true"><i class="ph-duotone ph-toolbox"></i></span> 1039 <span> 1040 <strong>Skills å·¥å ·ç®±</strong> 1041 <small>å¯å®è£ ç AI æ±èå·¥å ·</small> 1042 </span> 1043 <span class="sidebar-resource-link__count">1</span> 1044 </a> 1045 </nav> 1046 </div> 1047 1048 <button class="invite-card" type="button" data-portal="signup"> 1049 <span class="invite-card__gift" aria-hidden="true">â¦</span> 1050 <span><strong>注åå è´¹ä¼å</strong><small>ä¿å课ç¨å¹¶è·åå¦ä¹ æ´æ°</small></span> 1051 <span aria-hidden="true">â</span> 1052 </button> 1053</aside> 1054 1055 <main class="page-main lesson-main" id="academy-main"> 1056 <a class="back-link" href="/learning-path/"><span aria-hidden="true">â</span> è¿å课ç¨ç®å½</a> 1057 1058 <article class="lesson-article post tag-knowledge-points tag-roadmap tag-data-engineering-foundations tag-hash-order-011-2 post-access-public" data-lesson-article data-lesson-id="68fa2955512f5e0001d71394"> 1059 <header class="lesson-header" id="lesson-top"> 1060 <span class="eyebrow">æ°ä»ç¥è¯ç¹</span> 1061 <h1>æ°æ®å·¥ç¨å ¥é¨è·¯çº¿å¾(å¿ ç)</h1> 1062 <p>ãæåç ãï¼åå¨åé¢:æ¬æ¬¡æç« 主è¦åæä¸ä¸ªé¨åãå½å å¸åºãæµ·å¤å¸åºã两è 对æ¯ã</p> 1063 <div class="lesson-meta"> 1064 <span>â· 23 åé</span> 1065 <span>â ä¸çº§</span> 1066 <span>â å 费课ç¨</span> 1067 </div> 1068 </header> 1069 1070 <figure class="lesson-feature-image "> 1071 <img srcset="/content/images/size/w320/2025/12/real_pixels_jpg-by-RohithDezinr.jpeg 320w, /content/images/size/w640/2025/12/real_pixels_jpg-by-RohithDezinr.jpeg 640w, /content/images/size/w960/2025/12/real_pixels_jpg-by-RohithDezinr.jpeg 960w, /content/images/size/w1600/2025/12/real_pixels_jpg-by-RohithDezinr.jpeg 1600w" sizes="(max-width: 820px) calc(100vw - 32px), (max-width: 1240px) 720px, 880px" src="/content/images/size/w960/2025/12/real_pixels_jpg-by-RohithDezinr.jpeg" alt="æ°æ®å·¥ç¨å ¥é¨è·¯çº¿å¾(å¿ ç)"> 1072 1073 </figure> 1074 1075 <div class="lesson-body gh-content" data-lesson-content><p>åå¨åé¢:æ¬æ¬¡æç« 主è¦åæä¸ä¸ªé¨åãå½å å¸åºãæµ·å¤å¸åºã两è 对æ¯ãï¼å³ä¾§ç®å½çå使ç¹å°ï¼å·²ç»å¨ä¿®æ¹cssï¼ä½æ¯ç®åè¿æ²¡æ¾å°åéçæä»æ¹æå¿µ</p><h2 id="%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B%E5%85%A5%E9%97%A8%E8%B7%AF%E7%BA%BF%E5%9B%BE%EF%BC%88%E5%9B%BD%E5%86%85%E5%B8%82%E5%9C%BA%EF%BC%89"><strong>æ°æ®å·¥ç¨å ¥é¨è·¯çº¿å¾ï¼å½å å¸åºï¼</strong></h2><h3 id="%E5%BC%95%E8%A8%80"><strong>å¼è¨</strong></h3><p>å¨å½å å¸åºï¼æ°æ®å·¥ç¨å²ä½æ´å¼ºè°<strong>ç论ä¸åç</strong>ï¼è¦çè§£æ°æ®ä»åºçåå±é»è¾ãå¤§æ°æ®ç»ä»¶çååå ³ç³»ï¼ä»¥å稳å®ãé«æçæ°æ®å¤çæµç¨ã</p><p>ç¸æ¯äºå¹³å°æä½ï¼ä¼ä¸æ´çéä½ æ¯å¦çè§£<strong>Hadoop çæä½ç³»çåç</strong>ãè½å¦è®¾è®¡æ¸ æ°çæ°ä»ç»æï¼ä»¥åæ¯å¦è½åæç³»ç»ç¶é¢ã</p><hr><h3 id="%E5%85%88%E8%81%8A%E7%AD%96%E7%95%A5%EF%BC%9A%E5%88%AB%E8%BF%B7%E4%BF%A1%E2%80%9C%E5%88%B7-leetcode-%E6%8B%BF-offer%E2%80%9D"><strong>å èçç¥ï¼å«è¿·ä¿¡âå· LeetCode æ¿ Offerâ</strong></h3><p>æ°æ®å·¥ç¨å²ä½å¹¶ä¸æ¯ç®æ³é©±å¨çå·¥ä½ãå½å é¢è¯æ´å ³å¿ï¼</p><blockquote>ä½ æ¯å¦çè§£ä¸æ¡æ°æ®ä»ééå°åæçå ¨æµç¨ï¼ ä½ è½å¦è§£éæ¸ æ¥ä¸ä¸ªåå¸å¼ä»»å¡æ¯å¦ä½è¿è¡çï¼ åºç°å»¶è¿ãå¾æææ°æ®é误æ¶ï¼ä½ æä¹å®ä½é®é¢ï¼</blockquote><p><a href="https://xiaowantree.com/">xiaowantree.com</a> éé¢ä¼å®ææ´æ°ä¼è´¨æç« ï¼å¤§å®¶å¯ä»¥æ³¨åå è´¹æè ä»è´¹è§çï¼å¦æéè¦äºè§£äº§åï¼è¯·ç¹å»è¿éï¼å©åæ¨çofferä¹è·¯ã</p><hr><h3 id="%E8%A6%81%E6%8B%BF%E5%88%B0%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B-offer%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E8%BF%99%E4%BA%9B"><strong>è¦æ¿å°æ°æ®å·¥ç¨ Offerï¼ä½ éè¦è¿äº</strong></h3><ul><li><strong>SQL ä¸ Hive åºç¡å</strong>ï¼è½çç»åå¤è¡¨ JOINãçªå£å½æ°ãååºåæ¡¶æ¥è¯¢ã</li><li><strong>åå¸å¼è®¡ç®åçï¼</strong><ul><li><strong>Hadoop åºç¡</strong>ï¼HDFS åå¨åçï¼åãå¤å¶ãNameNodeãDataNodeï¼ï¼MapReduce æ§è¡è¿ç¨ï¼Map/Shuffle/Reduce æµç¨
1075ï¼ã</li><li><strong>Sparkï¼ç¦»çº¿æ¹å¤çï¼</strong>ï¼RDD â DataFrame â Catalyst ä¼åå¨ â Tungsten æ§è¡å¼æãçè§£ ShuffleãSkewãAQEãèªéåºæ§è¡ã</li><li><strong>Flinkï¼å®æ¶æµå¤çï¼</strong>ï¼äºä»¶æ¶é´ä¸å¤çæ¶é´ãçªå£æºå¶ãæ°´ä½çº¿ï¼Watermarkï¼ãç¶æç®¡çãCheckpointãååæºå¶ã</li></ul></li><li><strong>è°åº¦ä¸ä¾èµç®¡ç</strong>ï¼AirflowãDolphinScheduler åçï¼DAGãå¹çãä»»å¡éè·ä¸æ°æ®åå¡«ã</li><li><strong>æ°æ®å»ºæ¨¡ä¸è´¨éæ²»ç</strong>ï¼ODSâDWDâDWSâADS åå±å»ºæ¨¡ææ³ï¼æ°æ®åç¡®æ§ã宿´æ§ãä¸è´æ§æ£æ¥ã</li></ul><hr><h3 id="%E4%B8%80%E3%80%81%E5%AD%A6%E4%B9%A0-sql%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B%E7%9A%84%E2%80%9C%E6%AF%8D%E8%AF%AD%E2%80%9D"><strong>ä¸ãå¦ä¹ SQLï¼æ°æ®å·¥ç¨çâæ¯è¯â</strong></h3><h4 id="1-%E6%8E%A8%E8%8D%90%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90">1. æ¨èå¦ä¹ èµæº</h4><ul><li><a href="https://leetcode.com/?ref=xiaowantree.com">Leetcode</a>ï¼ ä¾§ésqlé¢ç®çç»ä¹ </li><li><a href="https://datalemur.com/?ref=xiaowantree.com">DataLemur</a>ï¼ä¾§éé¢è¯çº§SQLé¢ï¼è´´è¿å®æ</li><li><a href="https://www.stratascratch.com/?ref=xiaowantree.com">StrataScratch</a>ï¼å«çå®ä¸å¡åºæ¯çSQLç»ä¹ </li></ul><h4 id="2-%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E7%82%B9">2. å¿ é¡»ææ¡çæ ¸å¿ç¥è¯ç¹</h4><h5 id="%EF%BC%881%EF%BC%89%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%E4%B8%8E%E8%81%9A%E5%90%88">ï¼1ï¼åºç¡æä½ä¸èå</h5><ul><li>JOINç±»åï¼éç¹ææ¡INNER JOINãLEFT JOINãFULL OUTER JOINï¼<strong>å ä¹ä¸ç¨RIGHT JOIN</strong></li><li>GROUP BYèåï¼æç¡®COUNTä¸COUNT(DISTINCT)çåºå«ï¼åå¸å¼ç¯å¢ä¸COUNT(DISTINCT)éåº¦æ ¢ï¼</li></ul><p>åºæ°ç¼©åï¼å°é«åºæ°ç»´åº¦è½¬ä¸ºä½åºæ°ï¼ä¾å¦æå¹´é¾åæ¡¶ï¼</p><pre><code class="language-sql">SELECT 1076 CASE WHEN age > 30 THEN 'old' ELSE 'young' END as age_bucket, 1077 COUNT(1) 1078FROM users 1079GROUP BY 1 1080 1081</code></pre><p>CASE WHEN+èåï¼ä¾å¦ç»è®¡è¿æè®¢åæ°ï¼</p><pre><code class="language-sql">COUNT(CASE WHEN status = 'expired' THEN order_id END) 1082 1083</code></pre><h5 id="%EF%BC%882%EF%BC%89%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%84%E5%AF%B9%E6%AF%94%EF%BC%9Acte%E5%AD%90%E6%9F%A5%E8%AF%A2%E8%A7%86%E5%9B%BE%E4%B8%B4%E6%97%B6%E8%A1%A8">ï¼2ï¼æ¥è¯¢ç»æå¯¹æ¯ï¼CTE/åæ¥è¯¢/è§å¾/临æ¶è¡¨</h5> 1084<!--kg-card-begin: html--> 1085<table> 1086<thead> 1087<tr> 1088<th>ç±»å</th> 1089<th>éç¨åºæ¯</th> 1090<th>注æäºé¡¹</th> 1091</tr> 1092</thead> 1093<tbody> 1094<tr> 1095<td>åæ¥è¯¢ï¼Subqueryï¼</td> 1096<td>å ä¹ä¸ç¨</td> 1097<td>严éé使°æ®ç®¡éå¯è¯»æ§</td> 1098</tr> 1099<tr> 1100<td>临æ¶è¡¨ï¼Temp Tableï¼</td> 1101<td>ééå¤ä½¿ç¨ææ®µé»è¾</td> 1102<td>ä¼è¢«ç©åï¼è½æååç»æ§è¡æç</td> 1103</tr> 1104<tr> 1105<td>è§å¾ï¼Viewï¼</td> 1106<td>éé¿æåå¨é»è¾ï¼è¶ åºèªå®ä¹ç®¡éæ§è¡å¨æï¼</td> 1107<td>ä¸å卿°æ®ï¼ä» ä¿åæ¥è¯¢é»è¾</td> 1108</tr> 1109<tr> 1110<td>CTEï¼å ¬å ±è¡¨è¡¨è¾¾å¼ï¼</td> 1111<td>å ¶ä»ææåºæ¯</td> 1112<td>ææå代ç å¯è¯»æ§ï¼ä¼å ç¨</td> 1113</tr> 1114</tbody> 1115</table> 1116<!--kg-card-end: html--> 1117<h5 id="%EF%BC%883%EF%BC%89%E5%88%86%E5%B8%83%E5%BC%8F%E7%8E%AF%E5%A2%83%E4%B8%AD%E7%9A%84sql%E9%80%BB%E8%BE%91">ï¼3ï¼åå¸å¼ç¯å¢ä¸çSQLé»è¾</h5><ul><li>触åâæ°æ®æ··æ´ï¼Shuffleï¼âçå ³é®åï¼JOINãGROUP BYãORDER BYï¼éæ³¨ææ§è½ï¼</li><li>é«å¯æ©å±æ§å ³é®åï¼Mapç«¯ç´æ¥æ§è¡ï¼ï¼SELECTãFROMãWHEREãLIMITï¼æçé«ï¼</li></ul><h5 id="%EF%BC%884%EF%BC%89%E7%AA%97%E5%8F%A3%E5%87%BD%E6%95%B0%EF%BC%9A%E9%9D%A2%E8%AF%95%E9%AB%98%E9%A2%91%E8%80%83%E7%82%B9">ï¼4ï¼çªå£å½æ°ï¼é¢è¯é«é¢èç¹</h5><p>åºç¡è¯æ³ï¼</p><pre><code class="language-sql">RANK() OVER ( 1118 PARTITION BY <ååºå段> -- æä»ä¹åç»ï¼å¦é¨é¨ãå½å®¶ï¼ 1119 ORDER BY <æåºå段> -- ç»å æåºè§å 1120 ROWS BETWEEN <åNè¡> PRECEDING AND <åNè¡> FOLLOWING -- çªå£èå´ 1121) 1122 1123</code></pre><ul><li>è¥ä¸æå®<code>ROWS BETWEEN</code>ï¼é»è®¤æ¯âä»çªå£èµ·å§è¡å°å½åè¡âï¼ç´¯ç§¯è®¡ç®ï¼ã</li></ul><h6 id="rankdenserankrownumber%E7%9A%84%E5%8C%BA%E5%88%AB">RANK/DENSE_RANK/ROW_NUMBERçåºå«</h6> 1124<!--kg-card-begin: html--> 1125<style> 1126/* Pretty, responsive table (Notion-like) */ 1127/* âââ theme vars âââ */ 1128:root{ 1129 --tbl-bg:#fff; 1130 --tbl-text:#111827; 1131 --tbl-muted:#6b7280; 1132 --tbl-border:#e5e7eb; 1133 --tbl-border-strong:#d1d5db; 1134 --tbl-radius:12px; 1135 --tbl-accent:#f59e0b; /* accent color (amber). tweak to fit your brand */ 1136} 1137 1138/* wrapper (keeps layout from breaking on small screens) */ 1139.xw-table-wrap{margin:1rem 0;} 1140 1141/* base table */ 1142.xw-table{ 1143 width:100%; 1144 border-collapse:separate; 1145 border-spacing:0; 1146 background:var(--tbl-bg); 1147 color:var(--tbl-text); 1148 font-size:14.5px; 1149 line-height:1.6; 1150 border:1px solid var(--tbl-border); 1151 border-radius:var(--tbl-radius); 1152 overflow:hidden; 1153} 1154 1155/* caption */ 1156.xw-table caption{ 1157 text-align:left; 1158 font-weight:600; 1159 padding:.75rem 1rem; 1160 color:var(--tbl-muted); 1161} 1162 1163/* header */ 1164.xw-table thead th{ 1165 background:linear-gradient(0deg,rgba(245,158,11,.08),rgba(245,158,11,.08)); 1166 text-align:left; 1167 font-weight:600; 1168 padding:.75rem 1rem; 1169 border-bottom:1px solid var(--tbl-border-strong); 1170} 1171 1172/* cells */ 1173.xw-table th, 1174.xw-table td{ 1175 padding:.75rem 1rem; 1176 vertical-align:top; 1177} 1178 1179.xw-table tbody tr + tr td{ 1180 border-top:1px solid var(--tbl-border); 1181} 1182 1183/* hover highlight */ 1184.xw-table tbody tr:hover{ 1185 background:rgba(245,158,11,.06); 1186} 1187 1188/* code styling for function names */ 1189.xw-table code{ 1190 background:rgba(0,0,0,.04); 1191 padding:.15rem .35rem; 1192 border-radius:.35rem; 1193 font-family:ui-monospace,"Noto Sans Mono",SFMono-Regular,Menlo,Consolas,monospace; 1194 font-size:.95em; 1195} 1196
1197/* compact variant (optional): add class "xw-compact" on table */ 1198.xw-table.xw-compact{font-size:13.5px;} 1199.xw-table.xw-compact th, 1200.xw-table.xw-compact td{padding:.55rem .75rem;} 1201 1202/* mobile: stack rows as cards */ 1203@media (max-width:640px){ 1204 .xw-table thead{display:none;} 1205 .xw-table, 1206 .xw-table tbody, 1207 .xw-table tr, 1208 .xw-table td{display:block;width:100%;} 1209 .xw-table tr{ 1210 border-top:1px solid var(--tbl-border); 1211 padding:.25rem 0; 1212 } 1213 .xw-table tr:first-child{border-top:0;} 1214 .xw-table td{ 1215 display:grid; 1216 grid-template-columns:38% 1fr; 1217 gap:.5rem; 1218 padding:.55rem 1rem; 1219 } 1220 .xw-table td::before{ 1221 content:attr(data-label); 1222 font-weight:600; 1223 color:var(--tbl-muted); 1224 } 1225} 1226</style> 1227 1228<div class="xw-table-wrap"> 1229 <table class="xw-table"> 1230 <caption>çªå£å½æ°æåå·®å¼å¯¹æ¯</caption> 1231 <thead> 1232 <tr> 1233 <th scope="col">彿°</th> 1234 <th scope="col">æ éå¤å¼æ¶</th> 1235 <th scope="col">æéå¤å¼æ¶ï¼å¦å¹¶å第1ï¼</th> 1236 </tr> 1237 </thead> 1238 <tbody> 1239 <tr> 1240 <td data-label="彿°"><code>RANK</code></td> 1241 <td data-label="æ éå¤å¼æ¶">ç»æä¸è´</td> 1242 <td data-label="æéå¤å¼æ¶ï¼å¦å¹¶å第1ï¼">è·³è¿æåï¼å¹¶å1åä¸ä¸åæ¯3ï¼</td> 1243 </tr> 1244 <tr> 1245 <td data-label="彿°"><code>DENSE_RANK</code></td> 1246 <td data-label="æ éå¤å¼æ¶">ç»æä¸è´</td> 1247 <td data-label="æéå¤å¼æ¶ï¼å¦å¹¶å第1ï¼">ä¸è·³è¿æåï¼å¹¶å1åä¸ä¸åæ¯2ï¼</td> 1248 </tr> 1249 <tr> 1250 <td data-label="彿°"><code>ROW_NUMBER</code></td> 1251 <td data-label="æ éå¤å¼æ¶">ç»æä¸è´</td> 1252 <td data-label="æéå¤å¼æ¶ï¼å¦å¹¶å第1ï¼">强å¶å¯ä¸æåï¼ææ°æ®èªç¶é¡ºåºåé ï¼</td> 1253 </tr> 1254 </tbody> 1255 </table> 1256</div> 1257 1258<!--kg-card-end: html--> 1259<h6 id="%E5%AE%9E%E6%88%98%E5%9C%BA%E6%99%AF%EF%BC%9A">å®æåºæ¯ï¼</h6><p>è¿ç»ç»å½ï¼é¢è¯å¸¸èï¼ä¸é¢åªç»åºç¤ºä¾ï¼å ¶ä»<a href="https://xiaowantree.com/gao-pin-sqlti/" rel="noreferrer">é«é¢sqlèé¢</a>å¨è¿é â <a href="https://xiaowantree.com/gao-pin-sqlti/" rel="noreferrer">é«é¢SQLèé¢</a>ï¼</p><pre><code class="language-sql">select a.user_id, 1260 a.date_rslt, 1261 count(1) as cnt 1262from( 1263 select 1264 t.user_id, 1265 t.login_time, 1266 date_sub(login_time, INTERVAL t.num DAY) date_rslt 1267 from 1268 ( 1269 select user_id, 1270 login_time, 1271 row_number() over(partition by user_id order by login_time) num 1272 from login_log 1273 ) t 1274) a 1275group by a.user_id, a.date_rslt; 1276 1277</code></pre><ul><li>注æï¼éç¡®ä¿æ¯ä¸ªæ¥æé½ææ°æ®ï¼å³ä½¿æ¶å ¥ä¸º0ï¼ï¼å¦åç»æä¼éã</li></ul><h5 id="%EF%BC%885%EF%BC%89%E6%95%B0%E6%8D%AE%E5%86%99%E5%85%A5%EF%BC%9Ainsert-intoinsert-overwritemerge">ï¼5ï¼æ°æ®åå ¥ï¼INSERT INTO/INSERT OVERWRITE/MERGE</h5><ul><li>INSERT INTOï¼ä» è¿½å æ°æ®ï¼<strong>ææéå¤</strong>ï¼éæé TRUNCATE/DELETE使ç¨</li><li>INSERT OVERWRITEï¼è¦çç®æ ååºæ°æ®ï¼å¤§åæå¸¸ç¨</li><li>MERGEï¼å¯¹æ¯æ°æ§æ°æ®ï¼ä» æ´æ°/å é¤å·®å¼è¡ï¼ç¼ºç¹æ¯è¶ å¤§è§æ¨¡æ°æ®ä¸éåº¦æ ¢</li></ul><hr><h3 id="%E4%BA%8C%E3%80%81%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97%E5%8E%9F%E7%90%86"><strong>äºãåå¸å¼è®¡ç®åç</strong></h3><p><strong>1. å¤§æ°æ®çæçåºå±é»è¾ </strong></p><ul><li><strong>HDFSï¼</strong>åå¸å¼æä»¶ç³»ç»ï¼éç¨ååå¨ä¸å¤å¯æ¬æºå¶ä¿éå¯é æ§ãéç¹çè§£ NameNode / DataNode çèè´£ãæä»¶åå ¥æµç¨ãå¿è·³ä¸æ 鿢å¤ã</li><li><strong>MapReduceï¼</strong>ææ©çåå¸å¼è®¡ç®æ¨¡åï¼ç± Mapï¼æ å°ï¼å Reduceï¼èåï¼ä¸¤é¶æ®µç»æãçè§£ Shuffle é¶æ®µçæ°æ®å¾æåæåºä»£ä»·ã</li><li><strong>Sparkï¼</strong>Hadoop çå级æ¼è¿ãæ ¸å¿æ¦å¿µå æ¬ RDDãDAGãçªä¾èµä¸å®½ä¾èµãShuffle æºå¶ãCatalyst ä¼åå¨åå å管çã</li><li><strong>Flinkï¼</strong>宿¶æµå¤çæ¡æ¶ãè¦ææ¡æç/æ çæµãäºä»¶æ¶é´ï¼Event Timeï¼ãWatermarkãçªå£è®¡ç®ãç¶æç®¡çä¸ Checkpointã</li></ul><p><strong>2. æ ¸å¿æ§è½ä¸ç¨³å®æ§è¯é¢</strong></p><ul><li><strong>Shuffle æºå¶ï¼</strong> 代价é«ä½å¿ è¦ï¼ä¼åææ®µå æ¬å¹¿æå°è¡¨ãåæ¡¶ãé¢èåã</li><li><strong>æ°æ®å¾æï¼</strong> 使ç¨éæºçï¼Saltingï¼æååºè°ä¼ï¼Spark 3.x å¯å¯ç¨ AQE èªéåºæ§è¡ã</li><li><strong>Exactly-once ä¸è´æ§ï¼</strong> éè¿ Checkpoint + å¹ç Sink å®ç°ã</li><li><strong>èµæºè°åº¦ï¼</strong> çè§£ YARN / Kubernetes è°åº¦ææ³ä¸ä»»å¡å¹¶åæ§å¶ã</li></ul><h4 id="%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%9A"><strong>常è§é¢è¯é¢ï¼</strong></h4><ul><li>è§£é Hadoop ç MapReduce æ§è¡æµç¨ã</li><li>Spark ç宽ä¾èµåçªä¾èµæä»ä¹åºå«ï¼</li><li>Flink ç Watermark æ¯å¦ä½å¤çå»¶è¿æ°æ®çï¼</li></ul><hr><h3 id="%E4%B8%89%E3%80%81%E6%95%B0%E6%8D%AE%E5%BB%BA%E6%A8%A1%E4%B8%8E%E6%95%B0%E6%8D%AE%E8%B4%A8%E9%87%8F%EF%BC%9A%E8%AE%A9%E6%95%B0%E6%8D%AE%E2%80%9C%E8%83%BD%E7%94%A8%E3%80%81%E6%95%A2%E7%94%A8%E3%80%81%E5%A5%BD%E7%94%A8%E2%80%9D"><strong>ä¸ãæ°æ®å»ºæ¨¡ä¸æ°æ®è´¨éï¼è®©æ°æ®âè½ç¨ãæ¢ç¨ã好ç¨â</strong></h3><h4 id="1-%E5%88%86%E5%B1%82%E5%BB%BA%E6%A8%A1%E6%80%9D%E6%83%B3"><strong>1. åå±å»ºæ¨¡ææ³</strong></h4><p>å½å ä¸»æµæ¶æï¼<strong>ODS â DWD â DWS â ADS</strong></p> 1278<!--kg-card-begin: html--> 1279<table> 1280<thead> 1281<tr> 1282<th><strong>å±çº§</strong></th> 1283<th><strong>主è¦ä½ç¨</strong></th> 1284</tr> 1285</thead> 1286<tbody> 1287<tr> 1288<td>ODS</td> 1289<td>åå¨åå§æ°æ®ï¼è½»æ¸ æ´</td> 1290</tr> 1291<tr> 1292<td>DWD</td> 1293<td>äºå®å±ï¼ä¿è¯å£å¾ç»ä¸</td> 1294</tr> 1295<tr> 1296<td>DWS</td> 1297<td>å ¬å ±ææ å±ï¼ç¨äºå¤ç¨</td> 1298</tr> 1299<tr> 1300<td>ADS</td> 1301<td>åºç¨å±ï¼ä¸ºæ¥è¡¨/åææä¾é«ææ¥è¯¢</td> 1302</tr> 1303</tbody> 1304</table> 1305<!--kg-card-end: html--> 1306<h4 id="2-%E6%A8%A1%E5%9E%8B%E7%B1%BB%E5%9E%8B%E4%B8%8E%E5%8F%96%E8%88%8D"><strong>2. 模åç±»åä¸åè</strong></h4><ul><li><strong>èå¼å»ºæ¨¡</strong>ï¼æ°æ®ä¸è´æ§å¼ºï¼éåé«åå ¥ãæ¥è¯¢å¤æçç³»ç»ã</li><li><strong>维度建模</strong>ï¼äºå®è¡¨+维度表ï¼ï¼åæåä»»å¡å¸¸ç¨ã</li><li><strong>宽表ï¼One Big Tableï¼</strong>ï¼æ¥è¯¢å¿«ä½åä½å¤ï¼éååºå®æ¥è¡¨ã</li></ul><h4 id="3-%E6%95%B0%E6%8D%AE%E8%B4%A8%E9%87%8F%E4%B8%8E%E6%B2%BB%E7%90%86"><strong>3. æ°æ®è´¨é䏿²»ç</strong></h4><ul><li><strong>è´¨é维度</strong>
1306ï¼åç¡®æ§ã宿´æ§ãä¸è´æ§ãæ¶ææ§ã</li><li><strong>æ²»çæ¹æ³</strong>ï¼<ul><li>âåå
¥-æ ¡éª-åå¸ï¼W-A-Pï¼â 模å¼ï¼</li><li>建ç«å¼å¸¸çæ§ä¸å¯¹è´¦æºå¶ï¼</li><li>PII æ°æ®è±æä¸æéå级ã</li></ul></li></ul><p><strong>常è§é¢è¯é¢ï¼</strong></p><ul><li>å¦ä½ä¿è¯ç¦»çº¿ä¸å®æ¶æ°æ®å£å¾ä¸è´ï¼</li><li>ä»ä¹æ¯ WAP 模å¼ï¼å¨æ°ä»å¼åä¸å¦ä½è½å°ï¼</li><li>è¯´è¯´ä½ çè§£çæ°æ®è´¨éæ²»çä½ç³»ã</li></ul><hr><h3 id="%E5%9B%9B%E3%80%81%E4%BD%9C%E5%93%81%E9%9B%86%E9%A1%B9%E7%9B%AE%EF%BC%88%E4%B8%8D%E6%98%AF%E5%BF%85%E9%A1%BB%EF%BC%8C%E4%BD%86%E6%9C%89%E5%88%99%E6%9E%81%E5%85%B7%E5%8A%A0%E5%88%86%EF%BC%89"><strong>åãä½åé项ç®ï¼ä¸æ¯å¿
é¡»ï¼ä½æåæå
·å åï¼</strong></h3><p>å½å
æèä¸å±ç¤ºä½åéçåé人è¾å°ï¼å¦æä½ è½å±ç¤ºä¸å¥å®æ´ç Demoï¼å°ä¼å¤§å¹
è±é¢èåºã</p><h4 id="%E5%8F%AF%E9%80%89%E5%B1%95%E7%A4%BA%E6%96%B9%E5%90%91%EF%BC%9A"><strong>å¯éå±ç¤ºæ¹åï¼</strong></h4><ul><li><strong>å°åæ°ä»é¡¹ç®</strong>ï¼æ¨¡æçµåæ¥å¿ â Hive â DWD â DWS â æ¥è¡¨ã</li><li><strong>æ¹æµä¸ä½ç¤ºä¾</strong>ï¼å®ç°å®æ¶ææ çæ¿ã</li><li><strong>æ°æ®æ²»çæ¡ä¾</strong>ï¼èªå¨æ ¡éªèæ¬ + ææ å¯¹è´¦ç³»ç»ã</li></ul><p>建议å¨ç®åä¸éä¸<strong>æ¶æå¾</strong>ä¸<strong>æ ¸å¿ä»£ç 龿¥ï¼GitHub/Giteeï¼</strong>ï¼è½æææåææ¯è¯´æåã</p><hr><h3 id="%E4%BA%94%E3%80%81%E6%80%BB%E7%BB%93%EF%BC%9A2025-%E5%B9%B4%E5%85%A5%E9%97%A8%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B%EF%BC%88%E5%9B%BD%E5%86%85%EF%BC%89%E2%80%94%E2%80%94%E4%BB%A5%E7%90%86%E8%AE%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E5%8E%9F%E7%90%86%E4%B8%BA%E7%8E%8B"><strong>äºãæ»ç»ï¼2025 å¹´å
¥é¨æ°æ®å·¥ç¨ï¼å½å
ï¼ââ以ç论为æ¬ï¼åç为ç</strong></h3><p>å½ä¸å½å
ä¼ä¸æ´çéä½ æ¯å¦è½ï¼</p><ul><li>çè§£ Hadoop çæä½ç³»åå
¶åçï¼</li><li>设计åççæ°ä»å屿¨¡åï¼</li><li>讲æ¸
æ¥æ¹æµç³»ç»çååæºå¶ï¼</li><li>å¨é¢è¯ä¸éè¿åçè§£éé®é¢çè§£å³æè·¯ã</li></ul><p>çæ£çç«äºåï¼ä¸å¨äºç¨åªä¸ªäºï¼èå¨äºä½ è½å¦<strong>ç¨æ¸
æ°çé»è¾è®²æç½ä¸ä¸ªç³»ç»ä¸ºä»ä¹è¿ä¹è®¾è®¡</strong>ã</p><blockquote>妿è¿ä»½è·¯çº¿å¾å¯¹ä½ æå¸®å©ï¼æ¬¢è¿åäº«ç»æ£å¨å¦ä¹ æ°æ®å·¥ç¨çæåã</blockquote><blockquote>ä¹å¯ä»¥åéä½ çé®é¢å° <a href="/cdn-cgi/l/email-protection#4f3e28227d7d797e7c7e0f28222e2623612c2022"><span class="__cf_email__" data-cfemail="6c1d0b015e5e5a5d5f5d2c0b010d0500420f0301">[email protected]</span></a>ï¼æä¼æé常è§èç¹æ´çæä¸ä¸ç¯æç« ã</blockquote><hr><hr><h2 id="%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B%E5%85%A5%E9%97%A8%E8%B7%AF%E7%BA%BF%E5%9B%BE%EF%BC%88%E6%B5%B7%E5%A4%96%EF%BC%89">æ°æ®å·¥ç¨å
¥é¨è·¯çº¿å¾ï¼æµ·å¤ï¼</h2><h3 id="%E5%BC%95%E8%A8%80-1">å¼è¨</h3><p>æ³æ¾å°ä¸ä»½æ°æ®å·¥ç¨ç¸å
³å·¥ä½å¹¶ä¸å®¹æï¼ä½æ¯ä¹æ²¡ææ³è±¡ä¸çé£ä¹é¾ãå¨ç½ä¸çå°å¾å¤äººé½è¯´è¿å
¥å
¬å¸åå°±æ¯åâSQL Boyâçè¨è®ºåï¼å´å¨å¦ä¹ é¶æ®µåç°ææ¯è¦å¦ âââ SparkãFlinkï¼ HadoopãDatalakeã Lakehouseçç</p><p>è¦æç¡®å
¥é¨æ¹åãææ¡å¦ä¹ æ¹æ³ï¼ä½ éè¦ä¸äºæå¼ãæ¬æå°æè§£æ°æ®å·¥ç¨æéçå
¨é¨æ¥éª¤ï¼</p><h3 id="%E5%85%88%E8%81%8A%E7%AD%96%E7%95%A5%EF%BC%9A%E5%88%AB%E8%BF%B7%E4%BF%A1%E2%80%9C%E5%88%B7leetcode%E6%8B%BFoffer%E2%80%9D">å
èçç¥ï¼å«è¿·ä¿¡âå·LeetCodeæ¿Offerâ</h3><p>å¾å¤äººè§å¾å·å¤ä¸å®æ°éçLeetCodeé¢ç®ï¼å·¥ä½å°±ä¼èªå¨æ¾ä¸é¨ãä½ç°å®å ä¹ä»ä¸æ¯è¿æ ·ï¼</p><blockquote><a href="https://xiaowantree.com/">xiaowantree.com</a> éé¢ä¼å®ææ´æ°ä¼è´¨æç« ï¼å¤§å®¶å¯ä»¥æ³¨åå
è´¹æè
ä»è´¹è§çï¼å¦æéè¦äºè§£äº§åï¼è¯·ç¹å»è¿éï¼å©åæ¨çofferä¹è·¯ã</blockquote><h3 id="%E8%A6%81%E6%8B%BF%E5%88%B0%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8Boffer%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E8%BF%99%E4%BA%9B">è¦æ¿å°æ°æ®å·¥ç¨Offerï¼ä½ éè¦è¿äº</h3><h4 id="1-%E5%8F%AF%E9%AA%8C%E8%AF%81%E7%9A%84%E6%A0%B8%E5%BF%83%E6%8A%80%E8%83%BD">1. å¯éªè¯çæ ¸å¿æè½</h4><ul><li>SQLä¸Pythonï¼åºç¡ä¸çåºç¡ï¼</li><li>åå¸å¼è®¡ç®è½åï¼ä¸éä¸ï¼Snowflake/Spark/BigQueryï¼</li><li>ä»»å¡ç¼æç¥è¯ï¼ä¸éä¸ï¼Airflow/Mage/Databricks Workflowsï¼</li><li>æ°æ®å»ºæ¨¡ä¸æ°æ®è´¨é管æ§è½å</li></ul><h4 id="2-%E8%83%BD%E8%AF%81%E6%98%8E%E8%83%BD%E5%8A%9B%E7%9A%84%E2%80%9C%E7%A1%AC%E9%80%9A%E8%B4%A7%E2%80%9D">2. è½è¯æè½åçâ硬éè´§â</h4><ul><li>1个以ä¸å¯å±ç¤ºçä½åé项ç®</li><li>å¨LinkedInåé¢è¯ä¸è½ä½ç°ç个人åç</li></ul><hr><h3 id="%E4%B8%80%E3%80%81%E5%AD%A6%E4%B9%A0sql%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B%E7%9A%84%E2%80%9C%E6%AF%8D%E8%AF%AD%E2%80%9D">ä¸ãå¦ä¹ SQLï¼æ°æ®å·¥ç¨çâæ¯è¯â</h3><p>åé¿SQLå°±çäºæ¾å¼æ°æ®å·¥ç¨å·¥ä½ââSQLæ¯ä½ å¿
é¡»ææ¡çæåºç¡è¯è¨ã</p><h4 id="1-%E6%8E%A8%E8%8D%90%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90-1">1. æ¨èå¦ä¹ èµæº</h4><ul><li><a href="https://leetcode.com/?ref=xiaowantree.com">Leetcode</a>ï¼ ä¾§ésqlé¢ç®çç»ä¹ </li><li><a href="https://datalemur.com/?ref=xiaowantree.com">DataLemur</a>ï¼ä¾§éé¢è¯çº§SQLé¢ï¼è´´è¿å®æ</li><li>
1306<a href="https://www.stratascratch.com/?ref=xiaowantree.com">StrataScratch</a>ï¼å«çå®ä¸å¡åºæ¯çSQLç»ä¹ </li></ul><h4 id="2-%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E7%82%B9-1">2. å¿ é¡»ææ¡çæ ¸å¿ç¥è¯ç¹</h4><p>ï¼1ï¼åºç¡æä½ä¸èå</p><ul><li>JOINç±»åï¼éç¹ææ¡INNER JOINãLEFT JOINãFULL OUTER JOINï¼<strong>å ä¹ä¸ç¨RIGHT JOIN</strong></li><li>GROUP BYèåï¼æç¡®COUNTä¸COUNT(DISTINCT)çåºå«ï¼åå¸å¼ç¯å¢ä¸COUNT(DISTINCT)éåº¦æ ¢ï¼</li></ul><p>åºæ°ç¼©åï¼å°é«åºæ°ç»´åº¦è½¬ä¸ºä½åºæ°ï¼ä¾å¦æå¹´é¾åæ¡¶ï¼</p><pre><code class="language-sql">SELECT 1307 CASE WHEN age > 30 THEN 'old' ELSE 'young' END as age_bucket, 1308 COUNT(1) 1309FROM users 1310GROUP BY 1 1311 1312</code></pre><p>CASE WHEN+èåï¼ä¾å¦ç»è®¡è¿æè®¢åæ°ï¼</p><pre><code class="language-sql">COUNT(CASE WHEN status = 'expired' THEN order_id END) 1313 1314</code></pre><p>ï¼2ï¼æ¥è¯¢ç»æå¯¹æ¯ï¼CTE/åæ¥è¯¢/è§å¾/临æ¶è¡¨</p> 1315<!--kg-card-begin: html--> 1316<table> 1317<thead> 1318<tr> 1319<th>ç±»å</th> 1320<th>éç¨åºæ¯</th> 1321<th>注æäºé¡¹</th> 1322</tr> 1323</thead> 1324<tbody> 1325<tr> 1326<td>åæ¥è¯¢ï¼Subqueryï¼</td> 1327<td>å ä¹ä¸ç¨</td> 1328<td>严éé使°æ®ç®¡éå¯è¯»æ§</td> 1329</tr> 1330<tr> 1331<td>临æ¶è¡¨ï¼Temp Tableï¼</td> 1332<td>ééå¤ä½¿ç¨ææ®µé»è¾</td> 1333<td>ä¼è¢«ç©åï¼è½æååç»æ§è¡æç</td> 1334</tr> 1335<tr> 1336<td>è§å¾ï¼Viewï¼</td> 1337<td>éé¿æåå¨é»è¾ï¼è¶ åºèªå®ä¹ç®¡éæ§è¡å¨æï¼</td> 1338<td>ä¸å卿°æ®ï¼ä» ä¿åæ¥è¯¢é»è¾</td> 1339</tr> 1340<tr> 1341<td>CTEï¼å ¬å ±è¡¨è¡¨è¾¾å¼ï¼</td> 1342<td>å ¶ä»ææåºæ¯</td> 1343<td>ææå代ç å¯è¯»æ§ï¼ä¼å ç¨</td> 1344</tr> 1345</tbody> 1346</table> 1347<!--kg-card-end: html--> 1348<p>ï¼3ï¼åå¸å¼ç¯å¢ä¸çSQLé»è¾</p><ul><li>触åâæ°æ®æ··æ´ï¼Shuffleï¼âçå ³é®åï¼JOINãGROUP BYãORDER BYï¼éæ³¨ææ§è½ï¼</li><li>é«å¯æ©å±æ§å ³é®åï¼Mapç«¯ç´æ¥æ§è¡ï¼ï¼SELECTãFROMãWHEREãLIMITï¼æçé«ï¼</li></ul><p>ï¼4ï¼çªå£å½æ°ï¼é¢è¯é«é¢èç¹</p><p>åºç¡è¯æ³ï¼</p><pre><code class="language-sql">RANK() OVER ( 1349 PARTITION BY <ååºå段> -- æä»ä¹åç»ï¼å¦é¨é¨ãå½å®¶ï¼ 1350 ORDER BY <æåºå段> -- ç»å æåºè§å 1351 ROWS BETWEEN <åNè¡> PRECEDING AND <åNè¡> FOLLOWING -- çªå£èå´ 1352) 1353 1354</code></pre><ul><li>è¥ä¸æå®<code>ROWS BETWEEN</code>ï¼é»è®¤æ¯âä»çªå£èµ·å§è¡å°å½åè¡âï¼ç´¯ç§¯è®¡ç®ï¼ã</li></ul><p>RANK/DENSE_RANK/ROW_NUMBERçåºå«</p> 1355<!--kg-card-begin: html--> 1356<table> 1357<thead> 1358<tr> 1359<th>彿°</th> 1360<th>æ éå¤å¼æ¶</th> 1361<th>æéå¤å¼æ¶ï¼å¦å¹¶å第1ï¼</th> 1362</tr> 1363</thead> 1364<tbody> 1365<tr> 1366<td>RANK</td> 1367<td>ç»æä¸è´</td> 1368<td>è·³è¿æåï¼å¹¶å1åä¸ä¸åæ¯3ï¼</td> 1369</tr> 1370<tr> 1371<td>DENSE_RANK</td> 1372<td>ç»æä¸è´</td> 1373<td>ä¸è·³è¿æåï¼å¹¶å1åä¸ä¸åæ¯2ï¼</td> 1374</tr> 1375<tr> 1376<td>ROW_NUMBER</td> 1377<td>ç»æä¸è´</td> 1378<td>强å¶å¯ä¸æåï¼ææ°æ®èªç¶é¡ºåºåé ï¼</td> 1379</tr> 1380</tbody> 1381</table> 1382<!--kg-card-end: html--> 1383<p>å®æåºæ¯ï¼æ»å¨è®¡ç®</p><p>æé¨é¨è®¡ç®30天æ»å¨æ¶å ¥ï¼é¢è¯å¸¸èï¼ï¼</p><pre><code class="language-sql">SELECT 1384 revenue_date, 1385 SUM(revenue) OVER ( 1386 PARTITION BY department 1387 ORDER BY revenue_date 1388 ROWS BETWEEN 30 PRECEDING AND CURRENT ROW 1389 ) as thirty_day_rolling_revenue 1390FROM daily_sales 1391 1392</code></pre><ul><li>注æï¼éç¡®ä¿æ¯ä¸ªæ¥æé½ææ°æ®ï¼å³ä½¿æ¶å ¥ä¸º0ï¼ï¼å¦åç»æä¼éã</li></ul><p>ï¼5ï¼æ°æ®åå ¥ï¼INSERT INTO/INSERT OVERWRITE/MERGE</p><ul><li>INSERT INTOï¼ä» è¿½å æ°æ®ï¼<strong>ææéå¤</strong>ï¼éæé TRUNCATE/DELETE使ç¨</li><li>INSERT OVERWRITEï¼è¦çç®æ ååºæ°æ®ï¼å¤§åæå¸¸ç¨</li><li>MERGEï¼å¯¹æ¯æ°æ§æ°æ®ï¼ä» æ´æ°/å é¤å·®å¼è¡ï¼ç¼ºç¹æ¯è¶ å¤§è§æ¨¡æ°æ®ä¸éåº¦æ ¢</li></ul><hr><h3 id="%E4%BA%8C%E3%80%81%E5%AD%A6%E4%B9%A0python%EF%BC%88%E6%88%96scala%EF%BC%89%EF%BC%9A%E7%AA%81%E7%A0%B4sql%E7%9A%84%E5%B1%80%E9%99%90">äºãå¦ä¹ Pythonï¼æScalaï¼ï¼çªç ´SQLçå±é</h3><p>SQLè½å¥½ï¼ä½æå±éæ§ãè¦å¤ç夿é»è¾ï¼å¦APIè°ç¨ãèªå®ä¹å½æ°ï¼ï¼éææ¡PythonæScalaã</p><h4 id="1-%E8%AF%AD%E8%A8%80%E9%80%89%E6%8B%A9%EF%BC%9Apython%E8%BF%98%E6%98%AFscala%EF%BC%9F">1. è¯è¨éæ©ï¼Pythonè¿æ¯Scalaï¼</h4><ul><li>é¶åºç¡ï¼éPythonï¼å ¥é¨å¿«ãçæå ¨ï¼è½å¿«éåºææï¼</li><li>
1392æç¼ç¨åºç¡ï¼å¯è¯Scalaï¼éæç±»åï¼å¯¹schemaåæ°æ®è´¨éç®¡æ§æ´ä¸¥æ ¼ï¼éåSpark深度å¼åï¼</li></ul><h4 id="2-%E6%A0%B8%E5%BF%83%E5%AD%A6%E4%B9%A0%E5%86%85%E5%AE%B9">2. æ ¸å¿å¦ä¹ å
容</h4><p><strong>ï¼1ï¼åºç¡ï¼æ°æ®ç±»åä¸ç»æ</strong></p><ul><li>åºç¡ç±»åï¼stringãintegerãdecimalãboolean</li><li>å¤æç»æï¼listï¼æ°ç»ï¼ãdictionaryï¼åå
¸ï¼ãstackï¼æ ï¼ãqueueï¼éåï¼</li><li>éå¿
éä½é¢è¯å¯è½èï¼heapï¼å ï¼ãtreeï¼æ ï¼ãgraphï¼å¾ï¼ï¼ä¸ç¨æ·±é»ï¼äºè§£åºç¡å³å¯ï¼</li></ul><p><strong>ï¼2ï¼ç®æ³åºç¡</strong></p><ul><li>å¿
å¦ï¼å¾ªç¯ãçº¿æ§æ¥æ¾ãäºåæ¥æ¾</li><li>å¿
æï¼å¤§O表示æ³ï¼è½åææ¶é´/空é´å¤æåº¦ï¼</li><li>éå¿
éä½é¢è¯å¯è½èï¼å¨æè§åãè´ªå¿ç®æ³ãè¿ªæ°æ¯ç¹æç®æ³ï¼ä¸ç¨æ·±é»ï¼</li></ul><p><strong>ï¼3ï¼æ°æ®å·¥ç¨å®æåºæ¯</strong></p><ol><li>ç¼åAirflow DAGï¼ç¨Pythonå®ä¹æ°æ®ç®¡éæµç¨ï¼æå¸¸ç¨åºæ¯ï¼</li><li>è°ç¨REST APIï¼ç¨<code>requests</code>åºå¤çGET/POST/PUT请æ±ï¼è·åå¤é¨æ°æ®ï¼</li><li>ç¼åSpark UDFï¼<ul><li>é¨ååºæ¯ä¸éç¨ Python UDF å¤çæ°æ®ï¼ä½æ³¨æï¼Spark 1.x/2.x çæ¬ä¸ Python UDF æ§è½è¾å·®ï¼è¥ä½¿ç¨æ§çæ¬ï¼å»ºè®®ç¨ Scala ç¼å UDFã</li></ul></li></ol><p><strong>ï¼4ï¼ä»£ç æµè¯</strong></p><ul><li>Pythonï¼ç¨<code>pytest</code>æ¡æ¶æµè¯ä»£ç ãæ¨èæé
<code>Chispa</code>åº ââ å®ä¸é¨ç¨äºæµè¯ PySpark ä»»å¡ï¼åè½é常å®ç¨ã</li><li>Scalaï¼ç¨<code>JUnit</code>æ¡æ¶</li></ul><hr><h3 id="%E4%B8%89%E3%80%81%E5%AD%A6%E4%B9%A0%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97%EF%BC%9A%E5%A4%84%E7%90%86%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E7%9A%84%E6%A0%B8%E5%BF%83">ä¸ãå¦ä¹ åå¸å¼è®¡ç®ï¼å¤çæµ·éæ°æ®çæ ¸å¿</h3><p>åå¸å¼è®¡ç®çæ ¸å¿æ¯âå¤å°æºå¨ååï¼æ¯å°å¤çä¸å°é¨åæ°æ®âï¼çªç ´åæºç®åéå¶ãéä¸éä¸ï¼Spark/BigQuery/Snowflakeã</p><h4 id="1%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%EF%BC%9A%E6%95%B0%E6%8D%AE%E6%B7%B7%E6%B4%97%EF%BC%88shuffle%EF%BC%89"><strong>1.æ ¸å¿æ¦å¿µï¼æ°æ®æ··æ´ï¼Shuffleï¼</strong></h4><ul><li>ä½ç¨ï¼ç¡®ä¿ç¹å®æ°æ®å°ç¹å®æºå¨ï¼å¦âæç¨æ·æ±æ»æ¶æ¯æ°âï¼éåä¸ç¨æ·æ°æ®å°å䏿ºå¨ï¼</li><li>触ååºæ¯ï¼ä»
JOINãGROUP BYãORDER BYæ¶å¿
é¡»Shuffle</li><li>误åºï¼Shuffle䏿¯âåäºâââå®è®©åå¸å¼è®¡ç®é»è¾æ¥è¿åæºï¼ä½è¶
å¤§è§æ¨¡æ°æ®ä¸ä¼ææ§è½ç¶é¢</li></ul><h4 id="2-%E8%B6%85%E5%A4%A7%E8%A7%84%E6%A8%A1%E5%9C%BA%E6%99%AF%EF%BC%9Ashuffle%E4%BC%98%E5%8C%96%E6%8A%80%E5%B7%A7">2. è¶
å¤§è§æ¨¡åºæ¯ï¼Shuffleä¼åæå·§</h4><ul><li>广æè¿æ¥ï¼Broadcast JOINï¼ï¼å°è¡¨ï¼<5GBï¼å¹¿æå°ææèç¹ï¼æ éShuffle</li><li>åæ¡¶è¿æ¥ï¼Bucket JOINï¼ï¼å¤§è¡¨å
åæ¡¶ï¼åç»å¤æ¬¡JOINå¯å¤ç¨ï¼åå°éå¤Shuffle</li><li>æ°æ®éååºï¼ææ¶é´ï¼å¦æå¤©ï¼ååºï¼é¿å
JOINå
¨éæ°æ®</li><li>累积表设计ï¼è®¡ç®âææ´»âæ¶ç¨âæ¥æ´»ç´¯ç§¯è¡¨âï¼ä¸ç¨æ«30天åå§æ°æ®</li></ul><h4 id="3-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%80%BE%E6%96%9C%EF%BC%88skew%EF%BC%89">3. 常è§é®é¢ï¼æ°æ®å¾æï¼Skewï¼</h4><ul><li>é®é¢ï¼æå°æºå¨æ°æ®éè¿å¤§äºå
¶ä»æºå¨ï¼ææ
¢æ´ä½é度</li><li>è§£å³æ¹æ¡ï¼<ul><li>Spark 3.x+ï¼å¯ç¨âèªéåºæ§è¡ï¼Adaptive Executionï¼âï¼Databricksæ¯ææå¥½ï¼</li><li>Spark 3.x以ä¸ï¼å¯¹JOIN/GROUP BYå
³é®åâå çï¼Saltingï¼âï¼ç¨éæºæ°å¹³è¡¡æ°æ®åå¸</li></ul></li></ul><h4 id="4-%E8%BE%93%E5%87%BA%E6%95%B0%E6%8D%AE%EF%BC%9Aparquet%E6%96%87%E4%BB%B6%EF%BC%88%E9%87%8D%E7%82%B9%EF%BC%89">4. è¾åºæ°æ®ï¼Parquetæä»¶ï¼éç¹ï¼</h4><ul><li>ç¹æ§ï¼æ¯æâè¡ç¨é¿åº¦ç¼ç ï¼Run-Length Encodingï¼âï¼å缩çæé«ï¼æ¾å°Airbnbæ°æ®éå缩90%+ï¼</li><li>åºæ¯ï¼ç¨Sparkå¤çåï¼é常以Parquetæ ¼å¼åå
¥S3/GCP/Azure</li><li>注ï¼Snowflake/BigQueryç¨èªç æ ¼å¼ï¼å¯åèå
¶ä»ä¸é¡¹èµæï¼å¦â西é
徿°æ®Guyâçå
容ï¼</li></ul><hr><h3 id="%E5%9B%9B%E3%80%81%E6%95%B0%E6%8D%AE%E5%BB%BA%E6%A8%A1%E4%B8%8E%E6%95%B0%E6%8D%AE%E8%B4%A8%E9%87%8F%EF%BC%9A%E5%81%9A%E2%80%9C%E5%8F%AF%E7%94%A8%E7%9A%84%E5%A5%BD%E6%95%B0%E6%8D%AE%E2%80%9D">åãæ°æ®å»ºæ¨¡ä¸æ°æ®è´¨éï¼åâå¯ç¨çå¥½æ°æ®â</h3><p>æ°æ®å·¥ç¨å¸çâ产åâæ¯æ°æ®ââéæ»¡è¶³âåç¡®ãæç¨ãåè§âä¸ä¸ªæ åã</p><h4 id="1-%E6%95%B0%E6%8D%AE%E8%B4%A8%E9%87%8F%E7%9A%843%E4%B8%AA%E6%A0%B8%E5%BF%83%E6%A0%87%E5%87%86">1. æ°æ®è´¨éç3ä¸ªæ ¸å¿æ å</h4><ul><li>åç¡®æ§ï¼æ éå¤ãæ NULLãæ ¼å¼æ£ç¡®ãè¡æ°ç¬¦å颿</li><li>æç¨æ§ï¼æææ¡£ãååè§èãæ¥è¯¢é«æï¼é¿å
å·¨é¢äºèµæºææ¬ï¼</li><li>åè§æ§ï¼ä¸åå¨å¤ä½ç个人身份信æ¯ï¼PIIï¼ï¼ä¿æ¤ç¨æ·éç§</li></ul><h4 id="2-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E9%AB%98%E8%B4%A8%E9%87%8F%E6%95%B0%E6%8D%AE%EF%BC%9F">2. å¦ä½å®ç°é«è´¨éæ°æ®ï¼</h4><p>ï¼1ï¼ç¡®ä¿åç¡®æ§ï¼æ ¡éª+èªå¨å</p><ul><li>é¦è½®æ ¡éªï¼è®©æ°æ®åæå¸åä¸ï¼åèAirbnbçMIDASæµç¨ï¼</li><li>èªå¨åæ ¡éªï¼ç¨Great Expectationsçå·¥å
·ï¼åµå
¥æ°æ®ç®¡é</li><li>å
³é®æ¨¡å¼ï¼éµå¾ªâåå
¥-æ ¡éª-åå¸ï¼Write-Audit-Publishï¼âï¼ä¸åæ ¼æ°æ®ä¸è¿ç产</li></ul><p>ï¼2ï¼æåæç¨æ§ï¼ææ¡£+建模</p><ul><li>ææ¡£å
è¡ï¼æå»ºç®¡éåï¼å
åéæ±ææ¡£ã确认 stakeholderï¼é¿å
éå¤å¼åï¼</li></ul><p>
1392æ°æ®å»ºæ¨¡ä¸éä¸ï¼æåºæ¯éï¼ï¼</p> 1393<!--kg-card-begin: html--> 1394<table> 1395<thead> 1396<tr> 1397<th>建模类å</th> 1398<th>æ ¸å¿é»è¾</th> 1399<th>éç¨åºæ¯</th> 1400</tr> 1401</thead> 1402<tbody> 1403<tr> 1404<td>å ³ç³»å建模</td> 1405<td>åå°æ°æ®éå¤ï¼æ¥è¯¢è¾å¤æ</td> 1406<td>åå¨ææ¬ææï¼æ°æ®ä¸è´æ§è¦æ±é«</td> 1407</tr> 1408<tr> 1409<td>维度建模ï¼Kimballï¼</td> 1410<td>æå为äºå®è¡¨+维度表ï¼å¹³è¡¡åå¨ä¸è®¡ç®</td> 1411<td>夿°ä¸å¡åæåºæ¯</td> 1412</tr> 1413<tr> 1414<td>åä¸å¤§è¡¨ï¼One Big Tableï¼</td> 1415<td>äºå®+维度åå¹¶ï¼æ¥è¯¢æå¿«ï¼æ°æ®éå¤å¤</td> 1416<td>è®¡ç®ææ¬ææï¼æ¥è¯¢åºæ¯åºå®</td> 1417</tr> 1418</tbody> 1419</table> 1420<!--kg-card-end: html--> 1421<p>ï¼3ï¼ç¡®ä¿åè§ï¼éç§ä¿æ¤</p><ul><li>è¯å«PIIï¼ä»»ä½å¯å®ä½å°å ·ä½ç¨æ·çä¿¡æ¯é½ç®ï¼å¦ææºå·ãé®ç®±ãç²¾åå°åï¼</li><li>å¤çæ¹å¼ï¼å¿ååå¤çï¼å¹³è¡¡âé¿æåæéæ±âä¸âç¨æ·éç§â</li></ul><hr><h3 id="%E4%BA%94%E3%80%81%E6%89%93%E9%80%A0%E4%BD%9C%E5%93%81%E9%9B%86%E9%A1%B9%E7%9B%AE%EF%BC%9A%E8%AE%A9offer%E4%B8%BB%E5%8A%A8%E6%89%BE%E4%BD%A0">äºãæé ä½åé项ç®ï¼è®©Offer䏻卿¾ä½ </h3><p>ä½å鿝âè½åè¯æâç硬éè´§ï¼æä¹åçè¿ä¸ä¸ªå¾å ¸åçä¾åï¼ä»æ¯å 为å¼åè¿ä¸æ¬¾äº§åï¼è¿ä¸ªäº§åçææ´»è¾¾å°äº4wäººï¼æè¢«é¡¶çº§ç§æå ¬å¸å½åäºï¼æä»¥è¯´å¦æä½ ç°å¨æå¾å¤å è¶³çæ¶é´ï¼æé常æ¨èå¯ä»¥ç¨èªå·±çä¸ä¸ç¥è¯å»å¼åä¸ä¸ªå°äº§åï¼è½ç¶ä¸ä¸å®ä¼å¾å°å¸åºç认å¯ï¼ä½æ¯ä½ å¯ä»¥æç¤¾äº¤åªä½åæä½ çåçï¼åé¢è¯å®å±ç¤ºä½ çè½åï¼ä¼ç»ä½ å åä¸å°ã</p><h4 id="1-%E9%A1%B9%E7%9B%AE%E9%80%89%E6%8B%A93%E4%B8%AA%E5%8E%9F%E5%88%99">1. 项ç®éæ©3个åå</h4><ul><li>éä½ çç±çé¢åï¼è½æ¯æä½ 3ä¸ªææ¯å¨5-10å°æ¶çæå ¥ï¼ä¸çç±å¾é¾åæï¼</li><li>å å«å端å±ç¤ºï¼ç¨Tableau/Power BIåå¯è§åï¼æç¨JavaScriptæç®åç½ç«ï¼æ¹ä¾¿å±ç¤º</li><li>é¾åº¦å¹é ï¼å«åâä¸é®å®æâç项ç®ï¼å¤ªç®å没ç«äºåï¼ï¼è¦å å«âæ°æ®ç®¡é+è´¨éæ ¡éª+èªå¨åè¿è¡â</li></ul><h4 id="2-%E9%A1%B9%E7%9B%AE%E5%BF%85%E9%A1%BB%E5%8C%85%E5%90%AB%E7%9A%844%E4%B8%AA%E8%A6%81%E7%B4%A0">2. 项ç®å¿ é¡»å å«ç4个è¦ç´ </h4><ol><li>宿´ææ¡£ï¼è¯´æè¾å ¥/è¾åºæ°æ®éãè´¨éæ ¡éªè§åãè¿è¡é¢ç</li><li>ç产ç¯å¢è¿è¡ï¼ç¨Heroku Schedulerï¼æ¯æ5-10ç¾å ï¼æèªå»ºAirflowé群ï¼è¯æç®¡éå¯è½å°</li><li>ç¨ç鍿æ¯ï¼èå ¥Spark/Snowflake/Iceberg/Delta Lakeçï¼è´´åè¡ä¸è¶å¿</li><li>弿ºå°GitHubï¼éæ¸ æ°READMEï¼æ¹ä¾¿é¢è¯å®æ¥ç</li></ol><hr><h3 id="%E5%85%AD%E3%80%81%E6%89%93%E9%80%A0%E4%B8%AA%E4%BA%BAip%EF%BC%9A%E9%9D%A2%E8%AF%95%E4%B8%8E%E4%BA%BA%E8%84%89%E7%9A%84%E2%80%9C%E5%8A%A0%E5%88%86%E9%A1%B9%E2%80%9D">å ãæé 个人IPï¼é¢è¯ä¸äººèçâå å项â</h3><p>ææè½+ä½åéåï¼IP è½å¸®ä½ âè±é¢èåºâã</p><h4 id="1-linkedin%E4%BA%BA%E8%84%89%E6%90%AD%E5%BB%BA">1. LinkedIn人èæå»º</h4><p>ï¼1ï¼éç¹è¿æ¥ä¸¤ç±»äºº</p><ul><li>æèç»ç/ç头ï¼è®©ä»ä»¬è®°ä½ä½ ï¼å³ä½¿å½åæ ç©ºç¼ºï¼æªæ¥å¯è½ææºä¼ï¼</li><li>åè¡ï¼äºç¸å享æ±èæå·§ï¼ç¼è§£æ±èåå</li></ul><p>ï¼2ï¼äººèæå»ºæå·§</p><ul><li>å âäºå¨âåâæ±å æ¨âï¼è¯è®ºå¯¹æ¹å 容ãå享è§è§£ï¼å»ºç«ä¿¡ä»»ååæéæ±</li><li>ç¨âæé®âå¼åºï¼æ³å æ¨æ¶ï¼å é®âæ¨ç®åè´è´£çä¸å¡ä¸ï¼æ°æ®ç®¡é主è¦è§£å³ä»ä¹é®é¢ï¼âï¼æ¯ç´æ¥è¦å æ¨æåçé«</li><li>æ¥åâä½åå¤çâï¼åæå20æ¡ç§ä¿¡å¯è½ä» 1-2æ¡åå¤ï¼ä¼å èç³»ä¸ä½ èµåç¸è¿ç人</li></ul><p>ï¼3ï¼åä½å 容ï¼è®©æ´å¤äººè®¤è¯ä½ </p><ul><li>å享å¦ä¹ ç¬è®°ï¼å¦âSpark Shuffleä¼å宿âï¼ï¼æä¹æ¯è¿ä¸ä¸¤å¹´æå¼å§å »æäºåæç« çä¹ æ¯ï¼å士çå¦ä¹ çæ´»ä¹è®©ææ´å æ¸ æ¥ä»ä¹æ¯å¥½çæç« ï¼ä¹ååå®å®æåå°äºåæç« å¸¦ç»æç好å¤ï¼å¨è¿éæå¯ä»¥å享ä¸ä¸ªå°æå·§ï¼ä½ åå®åä½ è¦åè¿å¤´ççä½ çè¿ç¯æç« ï¼å¦æä½ æ¯è¯»è ï¼ä½ 伿¿æçä¸å»åï¼å¦æè¯»è 䏿¯é£ä¹çä¸ä¸ï¼ä»è½å¤çæåï¼æ³å¥½è¿äºé®é¢ï¼æç¸ä¿¡ä½ å¯ä»¥ååºä¸ä¸ªå¾æ£çæç« ã</li><li>è®°å½é¡¹ç®å¤çï¼å¦âç¨Snowflakeæå»ºçµåæ°æ®ç®¡éç踩åè®°å½âï¼</li><li>æä¹æ¯é å 容åä½èµäºä¸äºé±ï¼èä¸éçä½ è¶åä½ ä¼ç¥éçè¶å¤ââå å
1421®¹åä½çåéè¿è¶ æ³è±¡ï¼</li></ul><h4 id="2-%E9%9D%A2%E8%AF%95%EF%BC%9A%E5%81%9A%E2%80%9C%E7%9C%9F%E5%AE%9E%E7%9A%84%E4%BA%BA%E2%80%9D%EF%BC%8C%E5%88%AB%E5%81%9A%E2%80%9C%E7%AD%94%E9%A2%98%E6%9C%BA%E5%99%A8%E2%80%9D">2. é¢è¯ï¼åâçå®ç人âï¼å«åâç颿ºå¨â</h4><p>ï¼1ï¼é¢è¯ååå¤</p><ul><li>ç ç©¶é¢è¯å®ï¼æ¥LinkedInï¼äºè§£å ¶å¨å ¬å¸çå¹´éãè´è´£ä¸å¡</li><li>é®ç头ç»èï¼æç¡®âç¨ä»ä¹ææ¯ââå¢éè§æ¨¡ââæå飿 ¼â</li></ul><p>ï¼2ï¼é¢è¯ä¸è¦å±ç°ç3个ç¹è´¨</p><ul><li>çæ ï¼å¯¹å²ä½åä¸å¡è¡¨ç°åºå ´è¶£</li><li>æ²ç¨³ï¼åçé®é¢æ¶é»è¾æ¸ æ°ï¼ä¸æ ä¸å¿</li><li>好å¥ï¼ä¸»å¨é®âè¿ä¸ªæ°æ®ç®¡éå½åæå¤§çæææ¯ä»ä¹âï¼å±ç°æè深度</li></ul><hr><h3 id="%E6%80%BB%E7%BB%93%EF%BC%9A2025%E5%B9%B4%E5%85%A5%E9%97%A8%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B%EF%BC%8C%E9%9A%BE%E4%BD%86%E5%8F%AF%E8%A1%8C%EF%BC%8Cai-%E7%9A%84%E5%8F%91%E5%B1%95%E6%9C%89%E7%82%B9%E6%8A%B9%E6%9D%80%E4%BA%86ds%E7%9A%84%E5%B8%82%E5%9C%BA%EF%BC%8C%E4%BD%86%E6%98%AFai%E4%B9%9F%E4%BB%8D%E7%84%B6%E9%9C%80%E8%A6%81%E6%95%B0%E6%8D%AE">æ»ç»ï¼2025å¹´å ¥é¨æ°æ®å·¥ç¨ï¼é¾ä½å¯è¡ï¼AI çåå±æç¹æ¹æäºDSçå¸åºï¼ä½æ¯AIä¹ä»ç¶éè¦æ°æ®</h3><p>å½åå°±ä¸å¸åºç¡®å®ä¸¥å³»ï¼ä½ä¼ç§çå·¥ç¨å¸åååå ¬å¸ï¼å¾å¾å¨å°å¢ä¸æé¿ãè·çè¿ä»½è·¯çº¿å¾èµ°ï¼è½å¸®ä½ æ´æ¥è¿çæ³ç data engineering å²ä½ï¼</p><blockquote><strong>äºå¨ï¼ä½ è§å¾è¿æåªäºå ³é®æè½ï¼</strong> ææ¯å¦éæ¼äºä»ä¹éè¦å 容ï¼å¯ä»¥åé®ä»¶ <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2b5a4c4619191d1a181a6b4c464a424705484446">[email protected]</a>æè å¨å°çº¢ä¹¦ç§ä¿¡åè¯æï¼ä½ çéæ±ä¼è¢«ä¼å 满足ã</blockquote><p>è¥è§å¾è¿ä»½è·¯çº¿å¾æç¨ï¼æ¬¢è¿åäº«ç»æåï¼</p><hr><h2 id="%E6%B5%B7%E5%86%85%E5%A4%96%E5%AF%B9%E6%AF%94">æµ·å å¤å¯¹æ¯</h2><p>å½å ï¼</p><p>é¢è¯æ´åâç¬è¯åâåâç¥è¯è¦çåâï¼é¢è¯å®å¸¸ä»åºå±åçåå ¥ââä¾å¦é®ä½ Hadoop çæ§è¡æµç¨ãSpark ç Shuffle 为ä»ä¹æ ¢ãFlink ç Exactly-once å¦ä½å®ç°ãæ°ä»ç DWD å DWS å代表ä»ä¹å«ä¹ãä½ å¯è½éè¦ç½æ¿æå SQLãç»åºæ°æ®åå±å¾æè§£éæ°æ®å¾æçè§£å³æ¹æ¡ãæ ¸å¿ç®çæ¯å¤æï¼<strong>ä½ æ¯å¦çè§£æ´ä¸ªæ°æ®ä½ç³»çè¿ä½é»è¾</strong>ã</p><p>æµ·å¤ï¼</p><p>ä»ä»¬å ³æ³¨ä½ å¨çå®åºæ¯ä¸å¦ä½è®¾è®¡ç³»ç»ãå¦ä½åºå¯¹ææãå¦ä½åæè¡¡ãä¾å¦é®ä½ ï¼âå¨é¡¹ç®éå¦ä½ä¿è¯ pipeline çç¨³å®æ§ï¼âãâéå°æ°æ®å»¶è¿æ¶ä½ æä¹ debugï¼âãâ为ä»ä¹éæ© Snowflake è䏿¯ BigQueryï¼âçè³â妿è¦éæä½ çæ°æ®æ¨¡åï¼ä½ ä¼å¦ä½åï¼âãæ ¸å¿ç®çæ¯å¤æï¼<strong>ä½ è½å¦ç¬ç«è®¾è®¡ä¸è½å°å·¥ç¨ç³»ç»</strong>ã</p> 1422<!--kg-card-begin: html--> 1423<table> 1424<thead> 1425<tr> 1426<th><strong>é¢è¯ç»´åº¦</strong></th> 1427<th><strong>å½å æ°æ®å·¥ç¨å²ä½</strong></th> 1428<th><strong>æµ·å¤æ°æ®å·¥ç¨å²ä½</strong></th> 1429</tr> 1430</thead> 1431<tbody> 1432<tr> 1433<td>é¢è¯éç¹</td> 1434<td>ç论åçï¼HadoopãSparkãFlinkãæ°ä»å»ºæ¨¡ãæ°æ®å¾æãSQL æå</td> 1435<td>å·¥ç¨è½å°ï¼Pipeline 设计ãAirflow/dbtãäºå¹³å°ï¼AWS/GCP/Azureï¼å®è·µ</td> 1436</tr> 1437<tr> 1438<td>é¢å飿 ¼</td> 1439<td>ææ¯ç¬è¯é¢+å£å¤´é®çï¼èç¹å¯éãè¦çå ¨é¢</td> 1440<td>ç³»ç»è®¾è®¡+项ç®å¤çï¼æ³¨éæç»´ä¸åºæ¯åæ</td> 1441</tr> 1442<tr> 1443<td>è¯ä¼°æ ¸å¿</td> 1444<td>åççè§£æ·±åº¦ãæ§è¡é»è¾æ¯å¦éå½»</td> 1445<td>å·¥ç¨ç»éªãå¯ç»´æ¤æ§ãé®é¢åæä¸æ²éè½å</td> 1446</tr> 1447<tr> 1448<td>åçæ¹å¼</td> 1449<td>注éåºç¡ç¥è¯ãææ¯ç»èä¸å ¬å¼å表达ï¼ä½æ¯å¤§åçèå¯ä¼æåçæç徿·±ï¼å¦ææå®ä¹ ç»åçè¯ä¸»è¦è¿æ¯çè§£å³é®é¢çæè·¯</td> 1450<td>æ³¨éæ äºæ§ãæèè¿ç¨ä¸å·¥ç¨æè¡¡</td> 1451</tr> 1452<tr> 1453<td>æåå ³é®</td> 1454<td>æå®åºç¡ãçææ¡æ¶åçãæ¸ æ°è®²è§£æ°æ®æµ</td> 1455<td>è½è®²åºå³çè¿ç¨ã项ç®å¤çé»è¾ãä½ç°å®æè½å</td> 1456</tr> 1457</tbody> 1458</table> 1459<!--kg-card-end: html--> 1460</div> 1461 1462 1463 <footer class="lesson-footer"> 1464 <div> 1465 <strong data-completion-title>宿å伿´æ°ä½ çå¦ä¹ è¿åº¦</strong>
1466 <span data-completion-copy>ä½ å¯ä»¥éæ¶è¿åå¦ä¹ è·¯å¾ï¼èªç±éæ©ä¸ä¸èã</span> 1467 </div> 1468 <button class="primary-button" type="button" data-complete-lesson="68fa2955512f5e0001d71394">æ è®°å®æ <span aria-hidden="true">â</span></button> 1469 </footer> 1470 1471 </article> 1472 </main> 1473 1474 <aside class="right-rail article-rail" id="article-reading-rail" data-article-toc-panel aria-label="æç« é è¯»è¾ å©"> 1475 <section class="rail-section reading-progress-section"> 1476 <div class="reading-progress-heading"> 1477 <span class="rail-eyebrow">⣠é 读è¿åº¦</span> 1478 <strong data-reading-progress>0%</strong> 1479 </div> 1480 <div class="horizontal-progress" role="progressbar" aria-label="æç« é 读è¿åº¦" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" data-reading-progressbar><i></i></div> 1481 </section> 1482 <nav class="rail-section toc-section" aria-label="æ¬é¡µç®å½" data-reading-toc> 1483 <div class="toc-section__header"> 1484 <strong>æ¬é¡µç®å½</strong> 1485 <button type="button" data-toc-density-toggle aria-controls="article-toc-items" aria-expanded="true" hidden>åªç大纲</button> 1486 </div> 1487 <a class="is-root is-active" href="#lesson-top" data-toc-link="lesson-top">æ°æ®å·¥ç¨å ¥é¨è·¯çº¿å¾(å¿ ç)</a> 1488 <div id="article-toc-items" data-toc-items></div> 1489 </nav> 1490 <button class="rail-secondary-button" type="button" data-bookmark="68fa2955512f5e0001d71394">â æ¶èè¿è课</button> 1491</aside> 1492 <button class="article-toc-toggle" type="button" data-article-toc-toggle aria-controls="article-reading-rail" aria-expanded="false" aria-label="æå¼æ¬é¡µç®å½"> 1493 <i class="ph-duotone ph-list-bullets" aria-hidden="true"></i> 1494 <span class="article-toc-toggle__label">ç®å½</span> 1495 </button> 1496</div> 1497 1498 </div> 1499 <!-- Ghost Code Injection: Site Header --> 1500<!-- DE Academy safe version: GA4 + isolated roadmap styles only. --> 1501 1502<!-- Keep this block only if GA4 is not already installed by another Ghost integration. -->
vendor: 109 bytes, lines 1502-1503
1502 1503<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
vendor: 63 bytes, line 1503
1503<script async src="https://www.googletagmanager.com/gtag/js?id=
1503G-MJ2YRQ6SYD
vendor: 12 bytes, line 1503
1503"></script>
1504<script> 1505
vendor: 133 bytes, lines 1505-1508
1505window.dataLayer = window.dataLayer || []; 1506 function gtag(){dataLayer.push(arguments);} 1507 gtag('js', new Date()); 1508 gtag('config', '
1508G-MJ2YRQ6SYD
vendor: 4 bytes, line 1508
1508');
1509</script>
1509 1510 1511<!-- Optional roadmap embed compatibility. All selectors are scoped to #roadmapEmbed. --> 1512<style> 1513 #roadmapEmbed { 1514 background: #fff; 1515 border: 1px solid rgba(15, 23, 42, 0.08); 1516 border-radius: 16px; 1517 box-shadow: 0 18px 50px rgba(15, 23, 42, 0.08); 1518 height: min(86vh, 980px); 1519 margin: 28px auto; 1520 max-width: 1680px; 1521 overflow: hidden; 1522 position: relative; 1523 width: min(100%, calc(100vw - 64px)); 1524 } 1525 1526 #roadmapEmbed .roadmap-toolbar { 1527 display: flex; 1528 flex-wrap: wrap; 1529 gap: 10px; 1530 left: 16px; 1531 pointer-events: auto; 1532 position: absolute; 1533 top: 16px; 1534 z-index: 10; 1535 } 1536 1537 #roadmapEmbed .rm-btn { 1538 align-items: center; 1539 background: rgba(255, 255, 255, 0.94); 1540 border: 1px solid rgba(15, 23, 42, 0.14); 1541 border-radius: 10px; 1542 cursor: pointer; 1543 display: inline-flex; 1544 font: inherit; 1545 font-size: 14px; 1546 line-height: 1; 1547 padding: 10px 12px; 1548 } 1549 1550 #roadmapEmbed .rm-exit { 1551 display: none; 1552 } 1553 1554 #roadmapEmbed.is-active .rm-enter { 1555 display: none; 1556 } 1557 1558 #roadmapEmbed.is-active .rm-exit { 1559 display: inline-flex; 1560 } 1561 1562 #roadmapEmbed .roadmap-iframe { 1563 border: 0; 1564 height: 100%; 1565 inset: 0; 1566 pointer-events: none; 1567 position: absolute; 1568 width: 100%; 1569 } 1570 1571 #roadmapEmbed.is-active .roadmap-iframe { 1572 pointer-events: auto; 1573 } 1574 1575 #roadmapEmbed .rm-enter { 1576 background: #dc2626; 1577 border-color: #dc2626; 1578 color: #fff; 1579 font-weight: 600; 1580 } 1581 1582 @media (max-width: 700px) { 1583 #roadmapEmbed { 1584 border-radius: 12px; 1585 height: 76vh; 1586 margin: 20px auto; 1587 width: 100%; 1588 } 1589 1590 #roadmapEmbed .roadmap-toolbar { 1591 left: 10px; 1592 top: 10px; 1593 } 1594 } 1595</style>
1596<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"5c190cf9e68b43378c6b04174de597d5","r":1,"spa":2}' crossorigin="anonymous"></script>
1596 1597</body> 1598</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.