{"id":97911,"date":"2025-02-17T18:35:44","date_gmt":"2025-02-17T15:05:44","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/"},"modified":"2025-02-17T18:35:44","modified_gmt":"2025-02-17T15:05:44","slug":"building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/","title":{"rendered":"\u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0628\u0631\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0648\u0631\u0632\u0634\u06cc \u0628\u0627 AWS"},"content":{"rendered":"<div data-article-id=\"2284044\" id=\"article-body\">\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D8%AF%D8%B1%DB%8C%D8%A7%DA%86%D9%87_%D8%AF%D8%A7%D8%AF%D9%87_%D9%87%D8%A7%DB%8C_%D8%AA%D8%AC%D8%B2%DB%8C%D9%87_%D9%88_%D8%AA%D8%AD%D9%84%DB%8C%D9%84_%D9%88%D8%B1%D8%B2%D8%B4%DB%8C\" >\u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0648\u0631\u0632\u0634\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D9%86%D9%85%D8%A7%DB%8C_%DA%A9%D9%84%DB%8C_%D8%A7%D8%B2_%D8%AE%D8%AF%D9%85%D8%A7%D8%AA_AWS_%D9%85%D9%88%D8%B1%D8%AF_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87\" >\u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc \u0627\u0632 \u062e\u062f\u0645\u0627\u062a AWS \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D8%AA%D9%81%D8%B3%DB%8C%D8%B1_%D9%BE%D8%B1%D9%88%DA%98%D9%87\" >\u062a\u0641\u0633\u06cc\u0631 \u067e\u0631\u0648\u0698\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D9%85%D8%B1%D8%A7%D8%AD%D9%84_%D8%AA%D9%86%D8%B8%DB%8C%D9%85\" >\u0645\u0631\u0627\u062d\u0644 \u062a\u0646\u0638\u06cc\u0645<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7%DB%8C\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#IAM_%D9%86%D9%82%D8%B4%D9%85%D8%AC%D9%88%D8%B2%D9%87%D8%A7\" >IAM \u0646\u0642\u0634\/\u0645\u062c\u0648\u0632\u0647\u0627:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%DA%A9%D9%86%D8%B3%D9%88%D9%84_Cloudshell_%D8%B1%D8%A7_%D8%A8%D8%A7%D8%B2_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 1: \u06a9\u0646\u0633\u0648\u0644 Cloudshell \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_setup_nba_data_lakepy_%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87\" >\u0645\u0631\u062d\u0644\u0647 2: \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f setup_nba_data_lake.py \u067e\u0631\u0648\u0646\u062f\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA_Deletepy_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 3: \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Delete.py \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA_%D9%87%D8%A7\" >\u0627\u062c\u0631\u0627\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/building-a-scalable-data-lake-for-sports-analytics-with-aws-53e2\/#%D8%A8%D9%87_%D8%B3%D8%B7%D9%84_S3_%D8%A8%D8%B1%D9%88%DB%8C%D8%AF_%D9%88_%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87_JSON_%D8%B1%D8%A7_%D8%A8%D8%A7%D8%B2_%DA%A9%D9%86%DB%8C%D8%AF_%D8%AA%D8%A7_%D8%AF%D8%A7%D8%AF%D9%87_%D9%87%D8%A7_%D8%B1%D8%A7_%D8%A8%D8%AF%D8%B3%D8%AA_%D8%A2%D9%88%D8%B1%DB%8C%D8%AF\" >\u0628\u0647 \u0633\u0637\u0644 S3 \u0628\u0631\u0648\u06cc\u062f \u0648 \u067e\u0631\u0648\u0646\u062f\u0647 JSON \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u062f\u0633\u062a \u0622\u0648\u0631\u06cc\u062f<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AF%D8%B1%DB%8C%D8%A7%DA%86%D9%87_%D8%AF%D8%A7%D8%AF%D9%87_%D9%87%D8%A7%DB%8C_%D8%AA%D8%AC%D8%B2%DB%8C%D9%87_%D9%88_%D8%AA%D8%AD%D9%84%DB%8C%D9%84_%D9%88%D8%B1%D8%B2%D8%B4%DB%8C\"><\/span>\n<p>  \u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0648\u0631\u0632\u0634\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u06cc\u06a9 \u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0648 \u067e\u0631\u062f\u0627\u0632\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0648\u0631\u0632\u0634\u06cc NBA \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062e\u062f\u0645\u0627\u062a AWS \u0645\u0627\u0646\u0646\u062f S3 \u060c AWS Glue \u0648 \u0622\u062a\u0646\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0632 API SportsData.io \u0628\u0631\u0627\u06cc \u0648\u0627\u06a9\u0634\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u067e\u062e\u0634 \u06a9\u0646\u0646\u062f\u0647 NBA \u0648 \u067e\u0631\u062f\u0627\u0632\u0634 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0648 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0635\u0644\u06cc \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f:<\/p>\n<ol>\n<li>\n<strong>setup_nba_data_lake.py<\/strong>: \u0627\u06cc\u0646 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u0646\u0627\u0628\u0639 AWS \u0644\u0627\u0632\u0645 \u0648 \u0648\u0627\u06a9\u0634\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc NBA \u0627\u0632 API SportsData.io \u060c \u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<strong>\u062d\u0630\u0641<\/strong>: \u0627\u06cc\u0646 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0645\u0646\u0627\u0628\u0639 \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u062f\u0631 \u0637\u0648\u0644 \u062a\u0646\u0638\u06cc\u0645 \u0631\u0627 \u062d\u0630\u0641 \u0645\u06cc \u06a9\u0646\u062f \u060c \u0627\u0632 \u062c\u0645\u0644\u0647 \u0633\u0637\u0644 S3 \u060c \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0686\u0633\u0628 \u0648 \u0646\u062a\u0627\u06cc\u062c \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0622\u062a\u0646\u0627.<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D9%85%D8%A7%DB%8C_%DA%A9%D9%84%DB%8C_%D8%A7%D8%B2_%D8%AE%D8%AF%D9%85%D8%A7%D8%AA_AWS_%D9%85%D9%88%D8%B1%D8%AF_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87\"><\/span>\n<p>  \u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc \u0627\u0632 \u062e\u062f\u0645\u0627\u062a AWS \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<strong>\u0633\u0637\u0644 S3<\/strong>: \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u062f\u0631 \u0642\u0627\u0644\u0628 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 (\u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627\u06cc JSON) \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<li>\n<strong>\u0686\u0633\u0628 AWS<\/strong>: \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0627\u062f\u063a\u0627\u0645 \u0628\u062f\u0648\u0646 \u0633\u0631\u0648\u0631 \u0628\u0631\u0627\u06cc \u0641\u0647\u0631\u0633\u062a \u06a9\u0631\u062f\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 S3 \u0648 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0622\u0646 \u062f\u0631 \u0622\u062a\u0646\u0627.<\/li>\n<li>\n<strong>\u0622\u0645\u0627\u0632\u0648\u0646 \u0622\u062a\u0646\u0627<\/strong>: \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 S3 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc SQL.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%D9%81%D8%B3%DB%8C%D8%B1_%D9%BE%D8%B1%D9%88%DA%98%D9%87\"><\/span>\n<p>  \u062a\u0641\u0633\u06cc\u0631 \u067e\u0631\u0648\u0698\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0628\u0647 \u0645\u0646\u0638\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0633\u0627\u0632\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06cc\u06a9 \u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0648\u0631\u0632\u0634\u06cc \u0628\u0631\u0627\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc NBA \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062e\u062f\u0645\u0627\u062a AWS \u060c \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<ul>\n<li>\u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u067e\u062e\u0634 \u06a9\u0646\u0646\u062f\u0647 NBA \u0631\u0627 \u0627\u0632 API SportsData.io \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0633\u0637\u0644 S3 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u06a9\u0627\u062a\u0627\u0644\u0648\u06af \u0648 \u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0686\u0633\u0628 AWS.<\/li>\n<li>\u0622\u062a\u0646\u0627 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 S3 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ul>\n<p>\u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u06cc\u06a9 \u0631\u0627\u0647 \u062d\u0644 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0648 \u0645\u0642\u0631\u0648\u0646 \u0628\u0647 \u0635\u0631\u0641\u0647 \u0628\u0631\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0648\u0631\u0632\u0634\u06cc \u0648 \u0627\u0646\u062c\u0627\u0645 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 SQL \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%A7%D8%AD%D9%84_%D8%AA%D9%86%D8%B8%DB%8C%D9%85\"><\/span>\n<p>  \u0645\u0631\u0627\u062d\u0644 \u062a\u0646\u0638\u06cc\u0645<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7%DB%8C\"><\/span>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u060c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0627\u0631\u06cc\u062f:<\/p>\n<ol>\n<li>\u0628\u0647 SportsData.io \u0628\u0631\u0648\u06cc\u062f \u0648 \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u0631\u0627\u06cc\u06af\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u062f\u0631 \u0628\u0627\u0644\u0627 \u0633\u0645\u062a \u0686\u067e \u060c \u0628\u0627\u06cc\u062f &#8220;\u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646&#8221; \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u062f\u06cc\u062f\u0646 &#8220;\u0645\u0646\u0627\u0628\u0639 API&#8221; \u0631\u0648\u06cc \u0622\u0646 \u0634\u0646\u0627\u0648\u0631 \u0634\u0648\u06cc\u062f.<\/li>\n<li>\u0631\u0648\u06cc \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <strong>\u0645\u0642\u062f\u0645\u0647 \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634<\/strong>\u060c \u0633\u067e\u0633 &#8220;\u0622\u0632\u0645\u0627\u06cc\u0634 \u0631\u0627\u06cc\u06af\u0627\u0646 SportsDataio API&#8221; \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0627 \u067e\u0631 \u06a9\u0646\u06cc\u062f. \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 NBA \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0628\u0627 \u0645\u0648\u0636\u0648\u0639 &#8220;\u067e\u0648\u0631\u062a\u0627\u0644 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc&#8221; \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u062f\u0631\u06cc\u0627\u0641\u062a \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f. \u067e\u06cc\u0648\u0646\u062f \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u060c \u0634\u0645\u0627 \u0631\u0627 \u0628\u0647 \u0628\u062e\u0634 NFL \u0645\u06cc \u0628\u0631\u062f. \u062f\u0631 \u0633\u0645\u062a \u0686\u067e \u060c \u0631\u0648\u06cc \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <strong>NBA<\/strong>\u0628\u0634\u0631<\/li>\n<li>\u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0628\u0628\u06cc\u0646\u06cc\u062f \u0628\u0647 \u067e\u0627\u06cc\u06cc\u0646 \u0628\u0631\u0648\u06cc\u062f <strong>&#8220;\u062c\u062f\u0648\u0644 \u0631\u062f\u0647 \u0628\u0646\u062f\u06cc&#8221;<\/strong>\u0628\u0634\u0631<\/li>\n<li>\u0632\u06cc\u0631 <strong>&#8220;\u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0631\u0634\u062a\u0647 \u067e\u0631\u0633 \u0648 \u062c\u0648&#8221;<\/strong>\u0645\u0642\u062f\u0627\u0631 \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u06a9\u0627\u062f\u0631 \u06a9\u0634\u0648\u06cc\u06cc \u06a9\u0644\u06cc\u062f API \u0634\u0645\u0627\u0633\u062a.<\/li>\n<li>\u0627\u06cc\u0646 \u0631\u0634\u062a\u0647 \u0631\u0627 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f \u0632\u06cc\u0631\u0627 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0686\u0633\u0628\u0627\u0646\u062f\u0646 \u0622\u0646 \u062f\u0631 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062f\u0627\u0631\u06cc\u062f.<\/li>\n<\/ol>\n<h3><span class=\"ez-toc-section\" id=\"IAM_%D9%86%D9%82%D8%B4%D9%85%D8%AC%D9%88%D8%B2%D9%87%D8%A7\"><\/span>\n<p>  IAM \u0646\u0642\u0634\/\u0645\u062c\u0648\u0632\u0647\u0627:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u06cc\u0627 \u0646\u0642\u0634 \u0627\u062c\u0631\u0627\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062f\u0627\u0631\u0627\u06cc \u0645\u062c\u0648\u0632\u0647\u0627\u06cc \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<ul>\n<li>\n<strong>S3<\/strong>: <code>s3:CreateBucket<\/code>\u0628\u0627 <code>s3:PutObject<\/code>\u0628\u0627 <code>s3:DeleteBucket<\/code>\u0628\u0627 <code>s3:ListBucket<\/code>\n<\/li>\n<li>\n<strong>\u0686\u0633\u0628<\/strong>: <code>glue:CreateDatabase<\/code>\u0628\u0627 <code>glue:CreateTable<\/code>\u0628\u0627 <code>glue:DeleteDatabase<\/code>\u0628\u0627 <code>glue:DeleteTable<\/code>\n<\/li>\n<li>\n<strong>\u0622\u062a\u0646\u0627<\/strong>: <code>athena:StartQueryExecution<\/code>\u0628\u0627 <code>athena:GetQueryResults<\/code>\n<\/li>\n<\/ul>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%DA%A9%D9%86%D8%B3%D9%88%D9%84_Cloudshell_%D8%B1%D8%A7_%D8%A8%D8%A7%D8%B2_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u06a9\u0646\u0633\u0648\u0644 Cloudshell \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li>\u0628\u0647 Aws.Amazon.com \u0628\u0631\u0648\u06cc\u062f \u0648 \u0648\u0627\u0631\u062f \u062d\u0633\u0627\u0628 \u062e\u0648\u062f \u0634\u0648\u06cc\u062f.<\/li>\n<li>\u062f\u0631 \u0633\u0645\u062a \u0631\u0627\u0633\u062a \u0628\u0627\u0644\u0627 \u060c \u062f\u0631 \u06a9\u0646\u0627\u0631 \u0646\u0648\u0627\u0631 \u062c\u0633\u062a\u062c\u0648 \u060c \u0631\u0648\u06cc \u0645\u0631\u0628\u0639 \u0628\u0627 \u06cc\u06a9 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <code>&gt;_<\/code> \u062f\u0631 \u062f\u0627\u062e\u0644 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u0627\u0628\u0631.<\/li>\n<\/ol>\n<p><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_setup_nba_data_lakepy_%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>setup_nba_data_lake.py<\/code> \u067e\u0631\u0648\u0646\u062f\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li>\u062f\u0631 CLI (\u0631\u0627\u0628\u0637 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646) \u060c \u0646\u0648\u0639:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>nano setup_nba_data_lake.py\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ol>\n<li>\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u067e\u0631\u0648\u0646\u062f\u0647 \u0628\u0686\u0633\u0628\u0627\u0646\u06cc\u062f:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import boto3\nimport json\nimport time\nimport requests\nfrom dotenv import load_dotenv\nimport os\n\n# Load environment variables from .env file\nload_dotenv()\n\n# AWS configurations\nregion = \"us-east-1\"  # Replace with your preferred AWS region\nbucket_name = \"Jose-sports-analytics-data-lake\"  # Change to a unique S3 bucket name\nglue_database_name = \"glue_nba_data_lake\"\nathena_output_location = f\"s3:\/\/{bucket_name}\/athena-results\/\"\n\n# Sportsdata.io configurations (loaded from .env)\napi_key = \"SPORTS_DATA_API_KEY\"  # Replace with your API key\nnba_endpoint = \"NBA_ENDPOINT\"  # Get NBA endpoint from .env\n\n# Use the hardcoded values from the script\napi_key = SPORTS_DATA_API_KEY\nnba_endpoint = NBA_ENDPOINT\n\n# Create AWS clients\ns3_client = boto3.client(\"s3\", region_name=region)\nglue_client = boto3.client(\"glue\", region_name=region)\nathena_client = boto3.client(\"athena\", region_name=region)\n\ndef create_s3_bucket():\n    \"\"\"Create an S3 bucket for storing sports data.\"\"\"\n    try:\n        if region == \"us-east-1\":\n            s3_client.create_bucket(Bucket=bucket_name)\n        else:\n            s3_client.create_bucket(\n                Bucket=bucket_name,\n                CreateBucketConfiguration={\"LocationConstraint\": region},\n            )\n        print(f\"S3 bucket '{bucket_name}' created successfully.\")\n    except Exception as e:\n        print(f\"Error creating S3 bucket: {e}\")\n\ndef create_glue_database():\n    \"\"\"Create a Glue database for the data lake.\"\"\"\n    try:\n        glue_client.create_database(\n            DatabaseInput={\n                \"Name\": glue_database_name,\n                \"Description\": \"Glue database for NBA sports analytics.\",\n            }\n        )\n        print(f\"Glue database '{glue_database_name}' created successfully.\")\n    except Exception as e:\n        print(f\"Error creating Glue database: {e}\")\n\ndef fetch_nba_data():\n    \"\"\"Fetch NBA player data from sportsdata.io.\"\"\"\n    try:\n        headers = {\"Ocp-Apim-Subscription-Key\": api_key}\n        response = requests.get(nba_endpoint, headers=headers)\n        response.raise_for_status()  # Raise an error for bad status codes\n        print(\"Fetched NBA data successfully.\")\n        return response.json()  # Return JSON response\n    except Exception as e:\n        print(f\"Error fetching NBA data: {e}\")\n        return []\n\ndef convert_to_line_delimited_json(data):\n    \"\"\"Convert data to line-delimited JSON format.\"\"\"\n    print(\"Converting data to line-delimited JSON format...\")\n    return \"\\n\".join([json.dumps(record) for record in data])\n\ndef upload_data_to_s3(data):\n    \"\"\"Upload NBA data to the S3 bucket.\"\"\"\n    try:\n        # Convert data to line-delimited JSON\n        line_delimited_data = convert_to_line_delimited_json(data)\n\n        # Define S3 object key\n        file_key = \"raw-data\/nba_player_data.jsonl\"\n\n        # Upload JSON data to S3\n        s3_client.put_object(\n            Bucket=bucket_name,\n            Key=file_key,\n            Body=line_delimited_data\n        )\n        print(f\"Uploaded data to S3: {file_key}\")\n    except Exception as e:\n        print(f\"Error uploading data to S3: {e}\")\n\ndef create_glue_table():\n    \"\"\"Create a Glue table for the data.\"\"\"\n    try:\n        glue_client.create_table(\n            DatabaseName=glue_database_name,\n            TableInput={\n                \"Name\": \"nba_players\",\n                \"StorageDescriptor\": {\n                    \"Columns\": [\n                        {\"Name\": \"PlayerID\", \"Type\": \"int\"},\n                        {\"Name\": \"FirstName\", \"Type\": \"string\"},\n                        {\"Name\": \"LastName\", \"Type\": \"string\"},\n                        {\"Name\": \"Team\", \"Type\": \"string\"},\n                        {\"Name\": \"Position\", \"Type\": \"string\"},\n                        {\"Name\": \"Points\", \"Type\": \"int\"}\n                    ],\n                    \"Location\": f\"s3:\/\/{bucket_name}\/raw-data\/\",\n                    \"InputFormat\": \"org.apache.hadoop.mapred.TextInputFormat\",\n                    \"OutputFormat\": \"org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\",\n                    \"SerdeInfo\": {\n                        \"SerializationLibrary\": \"org.openx.data.jsonserde.JsonSerDe\"\n                    },\n                },\n                \"TableType\": \"EXTERNAL_TABLE\",\n            },\n        )\n        print(f\"Glue table 'nba_players' created successfully.\")\n    except Exception as e:\n        print(f\"Error creating Glue table: {e}\")\n\ndef configure_athena():\n    \"\"\"Set up Athena output location.\"\"\"\n    try:\n        athena_client.start_query_execution(\n            QueryString=\"CREATE DATABASE IF NOT EXISTS nba_analytics\",\n            QueryExecutionContext={\"Database\": glue_database_name},\n            ResultConfiguration={\"OutputLocation\": athena_output_location},\n        )\n        print(\"Athena output location configured successfully.\")\n    except Exception as e:\n        print(f\"Error configuring Athena: {e}\")\n\n# Main workflow\ndef main():\n    print(\"Setting up data lake for NBA sports analytics...\")\n    create_s3_bucket()\n    time.sleep(5)  # Ensure bucket creation propagates\n    create_glue_database()\n    nba_data = fetch_nba_data()\n    if nba_data:  # Only proceed if data was fetched successfully\n        upload_data_to_s3(nba_data)\n    create_glue_table()\n    configure_athena()\n    print(\"Data lake setup complete.\")\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvge8tzuaqr4llp3hlmce.png\" alt=\"\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\" loading=\"lazy\" width=\"800\" height=\"357\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA_Deletepy_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Delete.py \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import boto3\nfrom botocore.exceptions import ClientError\n\n# Define the names of resources to delete\nBUCKET_NAME = \"Jose-sports-analytics-data-lake\"\nGLUE_DATABASE_NAME = \"glue_nba_data_lake\"\n\ndef delete_athena_query_results(bucket_name):\n    \"\"\"Delete Athena query results stored in the specified S3 bucket.\"\"\"\n    s3 = boto3.client(\"s3\")\n    try:\n        print(f\"Deleting Athena query results in bucket: {bucket_name}\")\n        objects = s3.list_objects_v2(Bucket=bucket_name, Prefix=\"athena-results\/\")\n        if \"Contents\" in objects:\n            for obj in objects[\"Contents\"]:\n                s3.delete_object(Bucket=bucket_name, Key=obj[\"Key\"])\n                print(f\"Deleted Athena query result: {obj['Key']}\")\n    except ClientError as e:\n        print(f\"Error deleting Athena query results in bucket {bucket_name}: {e}\")\n\ndef delete_s3_bucket(bucket_name):\n    \"\"\"Delete a specific S3 bucket and its contents.\"\"\"\n    s3 = boto3.client(\"s3\")\n    try:\n        print(f\"Deleting bucket: {bucket_name}\")\n        # Delete all objects in the bucket\n        objects = s3.list_objects_v2(Bucket=bucket_name)\n        if \"Contents\" in objects:\n            for obj in objects[\"Contents\"]:\n                s3.delete_object(Bucket=bucket_name, Key=obj[\"Key\"])\n                print(f\"Deleted object: {obj['Key']}\")\n        # Delete the bucket\n        s3.delete_bucket(Bucket=bucket_name)\n        print(f\"Deleted bucket: {bucket_name}\")\n    except ClientError as e:\n        print(f\"Error deleting bucket {bucket_name}: {e}\")\n\ndef delete_glue_resources(database_name):\n    \"\"\"Delete Glue database and associated tables.\"\"\"\n    glue = boto3.client(\"glue\")\n    try:\n        print(f\"Deleting Glue database: {database_name}\")\n        # Get tables in the database\n        tables = glue.get_tables(DatabaseName=database_name)[\"TableList\"]\n        for table in tables:\n            table_name = table[\"Name\"]\n            print(f\"Deleting Glue table: {table_name} in database {database_name}\")\n            glue.delete_table(DatabaseName=database_name, Name=table_name)\n        # Delete the database\n        glue.delete_database(Name=database_name)\n        print(f\"Deleted Glue database: {database_name}\")\n    except ClientError as e:\n        print(f\"Error deleting Glue resources for database {database_name}: {e}\")\n\ndef main():\n    print(\"Deleting resources created during data lake setup...\")\n    # Delete the S3 bucket\n    delete_s3_bucket(BUCKET_NAME)\n    # Delete Glue resources\n    delete_glue_resources(GLUE_DATABASE_NAME)\n    # Delete Athena query results\n    delete_athena_query_results(BUCKET_NAME)\n    print(\"All specified resources deleted successfully.\")\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11czw72k2786q2w0dod8.png\" alt=\"\u062d\u0630\u0641 \u06a9\u0631\u062f\u0646\" loading=\"lazy\" width=\"800\" height=\"349\" title=\"\"><\/p>\n<p><strong>LS \u0628\u0631\u0627\u06cc \u062f\u06cc\u062f\u0646 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0648 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0641\u0647\u0631\u0633\u062a \u0641\u0639\u0644\u06cc \u06cc\u0627 \u0641\u0647\u0631\u0633\u062a \u0645\u0648\u062c\u0648\u062f \u0647\u0633\u062a\u0646\u062f<\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5swj3ogaxghztc1ge9i6.png\" alt=\"\u0644\u0633\" loading=\"lazy\" width=\"453\" height=\"93\" title=\"\"><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA_%D9%87%D8%A7\"><\/span>\n<p>  \u0627\u062c\u0631\u0627\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>python3 setup_nba_data_lake.py\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhk92epgdkqt6x68arqp.png\" alt=\"\u0641\u06cc\u0644\u0645\u0646\u0627\u0645\u0647 \u0627\u062c\u0631\u0627\" loading=\"lazy\" width=\"800\" height=\"228\" title=\"\"><\/p>\n<p><em>NB \u062e\u0637\u0627\u0647\u0627 \u0631\u0627 \u0646\u0627\u062f\u06cc\u062f\u0647 \u0645\u06cc \u06af\u06cc\u0631\u062f \u060c \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0628\u0648\u062f \u06a9\u0647 \u0645\u0646 \u0641\u06cc\u0644\u0645\u0646\u0627\u0645\u0647 \u0631\u0627 \u062f\u0648 \u0628\u0627\u0631 \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u0645<\/em><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D9%87_%D8%B3%D8%B7%D9%84_S3_%D8%A8%D8%B1%D9%88%DB%8C%D8%AF_%D9%88_%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87_JSON_%D8%B1%D8%A7_%D8%A8%D8%A7%D8%B2_%DA%A9%D9%86%DB%8C%D8%AF_%D8%AA%D8%A7_%D8%AF%D8%A7%D8%AF%D9%87_%D9%87%D8%A7_%D8%B1%D8%A7_%D8%A8%D8%AF%D8%B3%D8%AA_%D8%A2%D9%88%D8%B1%DB%8C%D8%AF\"><\/span>\n<p>  \u0628\u0647 \u0633\u0637\u0644 S3 \u0628\u0631\u0648\u06cc\u062f \u0648 \u067e\u0631\u0648\u0646\u062f\u0647 JSON \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u062f\u0633\u062a \u0622\u0648\u0631\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpewp441cdtifm27zeqex.png\" alt=\"\u0633\u0637\u0644 S3\" loading=\"lazy\" width=\"800\" height=\"330\" title=\"\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6mah22i6455o7ebmgwf.png\" alt=\"\u067e\u0631\u0648\u0646\u062f\u0647 json\" loading=\"lazy\" width=\"800\" height=\"356\" title=\"\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonxc6p2gu0uhxnmw3hj4.png\" alt=\"json\" loading=\"lazy\" width=\"800\" height=\"362\" title=\"\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlsecp1kypo22qlapfp3.png\" alt=\"json\" loading=\"lazy\" width=\"800\" height=\"365\" title=\"\"><\/p>\n<p>\u0628\u0631\u0627\u06cc \u062d\u0630\u0641 \u0645\u0646\u0627\u0628\u0639 \u060c \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>python3 delete.py\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u067e\u0627\u06cc\u0627\u0646<\/strong><br \/>\u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0646\u062d\u0648\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06cc\u06a9 \u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062e\u062f\u0645\u0627\u062a AWS \u0648 \u0627\u062f\u063a\u0627\u0645 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0627\u0632 API \u062e\u0627\u0631\u062c\u06cc \u0628\u0631\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0648\u0631\u0632\u0634\u06cc \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0648\u0631\u0632\u0634\u06cc \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u06cc\u06a9 \u062f\u0631\u06cc\u0627\u0686\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0648 \u067e\u0631\u062f\u0627\u0632\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0648\u0631\u0632\u0634\u06cc NBA \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062e\u062f\u0645\u0627\u062a AWS \u0645\u0627\u0646\u0646\u062f S3 \u060c AWS Glue \u0648 \u0622\u062a\u0646\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0632 API SportsData.io \u0628\u0631\u0627\u06cc \u0648\u0627\u06a9\u0634\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u067e\u062e\u0634 \u06a9\u0646\u0646\u062f\u0647 NBA \u0648 \u067e\u0631\u062f\u0627\u0632\u0634 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":97912,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-97911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/97911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=97911"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/97911\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/97912"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=97911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=97911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=97911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}