{"id":354900,"date":"2024-05-20T22:57:41","date_gmt":"2024-05-20T22:57:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=354900"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=354900","title":{"rendered":"<span>\u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e ETL. \u041f\u0438\u0448\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a SQL \u043d\u0430 Spark [\u0447\u0430\u0441\u0442\u044c 3 \u0438\u0437 5]<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/6k\/yt\/1k\/6kyt1kuka91k-deyfhubpa9uiuo.png\" alt=\"04_assets_residents.tdl\" data-src=\"https:\/\/habrastorage.org\/webt\/6k\/yt\/1k\/6kyt1kuka91k-deyfhubpa9uiuo.png\"\/><\/p>\n<p>  <\/p>\n<blockquote><p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Java \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430 SQL \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spark RDD API, \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p><\/blockquote>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0435\u0440\u0438\u0438, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/760778\/\">\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u044f\u0437\u044b\u043a\u0430<\/a>:<br \/>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435)<br \/>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<br \/>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<br \/>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u043f\u0438\u0437\u043e\u0434\u0435 \u043c\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u2014 <strong>\u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/strong>. \u0425\u043e\u0440\u043e\u0448\u043e, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0440\u0430\u0442\u044c \u0441\u043f\u0435\u043a\u0443, \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043b\u0430\u043d\u0443.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0435 \u00abM for Mature\u00bb<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u2014 \u0432\u044b\u0441\u043e\u043a\u0438\u0439. \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043f\u043e \u0445\u043e\u0434\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0442\u0441\u044f, \u0434\u0430 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0431\u0438\u0433\u0434\u0430\u0442\u044b \u0438 \u0436\u0430\u0440\u0433\u043e\u043d\u043e\u043c \u0438\u0437 \u0434\u0430\u0442\u0430 \u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430, \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f, \u0438 \u0435\u0449\u0451 \u0445\u0443\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f. \u042f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u043b.<\/p>\n<\/div><\/div>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h1 id=\"5-implementaciya-kratkoe-liricheskoe-otstuplenie-pered-tem-kak\">5. \u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a<\/h1>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u043d\u044b\u043c-\u0434\u0430\u0432\u043d\u043e, \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/articles\/485484\/\">\u043e\u0434\u043d\u043e\u043c \u0433\u0435\u043e\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/a> \u0436\u0438\u043b-\u0431\u044b\u043b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f <a href=\"https:\/\/habr.com\/ru\/articles\/486466\/\">\u043f\u0438\u0441\u0430\u043b \u0443\u0436\u0435 \u0442\u0443\u0442 \u0441\u0442\u0430\u0442\u044c\u044e<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0447\u0451 \u044d\u0442\u043e \u0437\u0430 \u0437\u0432\u0435\u0440\u044c \u0442\u0430\u043a\u043e\u0439 \u0431\u044b\u043b. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0443 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0434\u043e\u043b\u0433\u0430\u044f, \u0442\u0440\u0443\u0434\u043d\u0430\u044f, \u0438 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0451 \u0437\u0434\u0435\u0441\u044c \u0435\u0449\u0451 \u0440\u0430\u0437 \u044f \u043d\u0435 \u0441\u0442\u0430\u043d\u0443, \u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u044c \u0441\u0443\u0445\u0443\u044e \u0432\u044b\u0436\u0438\u043c\u043a\u0443, \u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0445 \u0440\u0430\u0441\u0447\u0451\u0442\u043d\u043e-\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u043e\u0434 \u043e\u0434\u043d\u043e\u0439 \u043e\u0431\u043b\u043e\u0436\u043a\u043e\u0439 (\u0441\u0438\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0438\u0437\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 RDD API), \u043f\u043b\u044e\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0445 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430 Spark.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043f\u043e\u0437\u0434\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043a \u043d\u0438\u043c (\u043a\u0430\u043a \u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443) \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 ETL, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043b\u0438 \u043e\u0442\u044a\u0435\u0434\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0443\u0441\u0438\u043b\u0438\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0417\u043d\u0430\u043a\u043e\u043c\u043e \u0437\u0432\u0443\u0447\u0438\u0442? \u0412\u0435\u0440\u043d\u043e, \u043d\u0430 \u0447\u0451\u043c \u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0443, \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0438 ETL. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 40% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 ETL \u2014 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u043d\u0430 \u0441\u0430\u043c \u0430\u043d\u0430\u043b\u0438\u0437. \u0422\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432 \u043d\u0451\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 Java Properties, \u0438\u043b\u0438, \u0442\u043e\u0433\u043e \u0445\u0443\u0436\u0435, JSON.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Java Properties \u041e\u041c \u0441 \u0432\u044b\u0441\u043e\u0442\u044b \u043f\u0442\u0438\u0447\u044c\u0435\u0433\u043e \u043f\u043e\u043b\u0451\u0442\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/xi\/zk\/a_\/xizka_shv0j8pidnwdtmubcm4le.png\" alt=\"\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u041e\u041c \u0441 \u0432\u044b\u0441\u043e\u0442\u044b \u043f\u0442\u0438\u0447\u044c\u0435\u0433\u043e \u043f\u043e\u043b\u0451\u0442\u0430\" data-src=\"https:\/\/habrastorage.org\/webt\/xi\/zk\/a_\/xizka_shv0j8pidnwdtmubcm4le.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0428\u0430\u0433\u043e\u0432 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 50, \u0447\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u0430 \u043a\u043e\u0434\u0430 \u2014 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u044d\u043a\u0440\u0430\u043d\u043e\u0432. \u0412 JSON \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0449\u0451 \u0440\u0430\u0437\u043c\u0430\u0448\u0438\u0441\u0442\u0435\u0435. \u041c\u0430\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c (\u0430 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u0442\u044c) \u0442\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u041e\u041c \u0442\u044f\u0436\u0435\u043b\u043e, \u0438 \u0441\u0430\u043c \u043e\u0431\u044a\u0451\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0432\u0441\u044f\u043a\u0438\u0435 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0435 \u0440\u0430\u043c\u043a\u0438, \u0442\u0430\u043a \u0438 \u0431\u0435\u0437 \u043e\u0431\u0445\u043e\u0434\u0430 AST \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e. \u0412 SQL \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437 50 \u0448\u0430\u0433\u043e\u0432 \u0443\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0431\u044b \u0432 50 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 2 \u044d\u043a\u0440\u0430\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u043b\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0446\u0435\u0439\u0442\u043d\u043e\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0431\u044b\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u0440\u044f\u0448\u043b\u0438\u0432\u043e, \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043b \u043a\u0443\u0447\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. \u0410\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0435\u043a\u043b\u0438, \u0438 \u0441\u0442\u0430\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u0433\u0440\u044f\u0437\u043d\u044b\u0435 \u0445\u0430\u043a\u0438, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0434\u044b\u0440\u0430\u043c\u0438 \u0432 \u043a\u043e\u0434\u0435. \u0421\u043c\u043e\u0442\u0440\u0438\u0448\u044c \u043f\u043e\u0442\u043e\u043c \u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0440\u043e\u0434, \u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e \u0441\u0435\u0431\u044f \u00ab\u0431\u043e\u0436\u0435\u0447\u043a\u0438-\u043a\u043e\u0448\u0435\u0447\u043a\u0438\u2026 \u0448\u0442\u043e\u044d\u0442\u043e?! \u043a\u0430\u043a \u044d\u0442\u043e, \u0431\u043b\u0438\u043d, \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0449 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?!\u00bb<\/p>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439 \u0431\u0435\u0441\u0445\u0438\u0442\u0440\u043e\u0441\u0442\u043d\u043e\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\" rel=\"nofollow noopener noreferrer\">Data Cooker ETL<\/a>\u00bb (\u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u00ab\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 ETL\u00bb), \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u0443\u0436\u0435 \u0441 \u043e\u0433\u043b\u044f\u0434\u043a\u043e\u0439 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442, \u0443\u0436\u0435 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u043f\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0443. \u041d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0430 \u0443 \u043c\u0435\u043d\u044f \u0443\u0448\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u2014 \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432 \u043a\u043e\u0434\u0435, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0432 \u043f\u0440\u0435\u0436\u043d\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 <code>SELECT<\/code> \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u044b\u0445 \u0438 \u0434\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u2014 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a proof of concept, \u043d\u043e \u0438 \u0447\u0442\u043e\u0431\u044b \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u043b\u0438 \u043a \u043d\u0438\u043c \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435.<\/p>\n<p>  <\/p>\n<p>\u0418, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0438 \u0431\u0435\u0437 \u0441\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u0443\u044e\u0442, \u0430 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043d\u0430\u0433\u043b\u0443\u044e \u043a\u0440\u0430\u0434\u0443\u0442. \u041c\u043d\u0435 \u0434\u043e \u0433\u0435\u043d\u0438\u044f \u0434\u0430\u043b\u0435\u043a\u043e, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0435\u0436\u043d\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u0430 \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 \u0432 Data Cooker ETL, \u2014 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u0438\u044f, \u2014 \u0430 \u0435\u0449\u0451 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430. \u0418 \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0430\u0440\u0443 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435 \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043e\u043a\u043d\u043e IDE \u0441 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u043c \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c, \u0438 \u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043b\u0430\u043b \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0443 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e, \u0442\u043e \u0432\u044b \u043d\u0435 \u043e\u0448\u0438\u0431\u0451\u0442\u0435\u0441\u044c. \u0417\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u043b\u043e\u043c\u0430\u043d\u043e, \u043f\u0435\u0440\u0435\u043a\u043e\u0447\u0435\u0432\u0430\u043b\u043e \u0431\u0435\u0437 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0432\u043e\u0442 \u044f\u0434\u0440\u043e (\u0442\u043e \u0435\u0441\u0442\u044c, \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430 SQL) \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441 \u043d\u0443\u043b\u044f. \u041e\u0442 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u2014 Transform Definition Language, \u0432\u0435\u0440\u0441\u0438\u044f 4, \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u0430\u043a \u043e\u043c\u043c\u0430\u0436, \u0447\u0435\u043c \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0435\u043c\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<blockquote><p>SQL \u2014 \u044d\u0442\u043e \u0430\u043c\u0430\u043b\u044c\u0433\u0430\u043c\u0430\u0446\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 domain specific \u044f\u0437\u044b\u043a\u043e\u0432, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 Data Definition Language, Data Manipulation Language, Data Control Language, \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e Data Query Language, \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u044f\u0437\u044b\u043a\u0430. \u041f\u043b\u044e\u0441 \u0432\u0435\u043d\u0434\u043e\u0440\u0441\u043a\u0438\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435, \u0442\u043e\u0436\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u043c\u0438 DSL. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Transform Definition Language \u2014 \u044d\u0442\u043e \u0434\u0438\u0430\u043b\u0435\u043a\u0442 SQL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 DDL, DQL, DCL, \u0438 \u0438\u043c\u0435\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f control flow.<\/p><\/blockquote>\n<p>\u0418\u0442\u0430\u043a, \u043b\u044e\u0431\u0430\u044f \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<h1 id=\"6-implementaciya-nabory-dannyh-v-kontekste-ispolneniya\">6. \u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u041d\u0430\u0431\u043e\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/h1>\n<p>  <\/p>\n<p>\u0423 \u043d\u0430\u0441 SQL, \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043c\u0435\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 JSON \u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b (\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043b\u044e\u0431\u044b\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438, \u0441\u043a\u043e\u043b\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0431\u044b \u043e\u043d\u0438 \u043d\u0438 \u0431\u044b\u043b\u0438), \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u044f\u0432\u043d\u043e \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u043e\u0432, \u0438 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\/\u043d\u0430\u0431\u043e\u0440\u044b \u0431\u0430\u0439\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/data\/Record.java\" rel=\"nofollow noopener noreferrer\">\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u00ab\u0437\u0430\u043f\u0438\u0441\u044c\u00bb<\/a> \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public interface Record&lt;T> extends Serializable {     ObjectMapper BSON = new ObjectMapper(new BsonFactory()).enable(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY);      List&lt;String> attrs();      T put(Map&lt;String, Object> payload);      T put(String attr, Object value);      byte[] asBytes(String attr);      Double asDouble(String attr);      Integer asInt(String attr);      Object asIs(String attr);      Long asLong(String attr);      String asString(String attr);      Map&lt;String, Object> asIs();      Object clone(); }<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u0435\u0441\u044c Java \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0446\u0435\u043b\u044f\u0445 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0432 \u0432\u0438\u0434\u0435 \u043a\u0440\u0430\u0442\u043a\u0438\u0445 \u0432\u044b\u0436\u0438\u043c\u043e\u043a \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043f\u043e\u043b\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043d\u0430 \u0413\u0438\u0442\u0445\u0430\u0431\u0435.<\/p><\/blockquote>\n<p>\u0425\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 JSON \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u043f\u044b, \u0430 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432 BSON. \u0412 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0445 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Google FlatBuffers (\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f Java), \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 BSON \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0438 \u0434\u0430\u0436\u0435 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043a\u0435\u0439\u0441\u043e\u0432 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435, \u043d\u0435\u0436\u0435\u043b\u0438 FlatBuffers.Map.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0436\u0435 \u0443 \u043d\u0430\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438?<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0440\u043d\u0451\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043c\u0451\u043d \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f <code>attrs()<\/code>,<\/li>\n<li>\u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0440\u043d\u0451\u0442 \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043a\u0430\u043a \u043c\u0430\u043f\u0443 <code>asIs()<\/code>,<\/li>\n<li>\u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 <code>put()<\/code> \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0430\u0447\u043a\u043e\u0439 <code>put(\u043c\u0430\u043f\u0430)<\/code>,<\/li>\n<li>\u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0440\u043d\u0443\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u043f\u0440\u0438\u0432\u0435\u0434\u044f \u0435\u0433\u043e \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c\u0443 \u0431\u0430\u0437\u043e\u0432\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 <code>as{Type}()<\/code>, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f <code>asIs()<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0442\u0438\u043f\u043e\u0432 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u2026<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a-\u0442\u0430\u043a, \u0441\u0435\u043a\u0443\u043d\u0434\u043e\u0447\u043a\u0443! \u0417\u0430\u0447\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b? \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 JSON (BSON) \u043c\u0430\u043f\u0430\u0445, \u043a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0443 \u043d\u0430\u0441 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0437 GeoJSON?<\/p>\n<p>  <\/p>\n<p>\u0410 \u0437\u0430\u0442\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u044e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0432\u043e\u0438\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0442\u0438\u043f <code>Structured<\/code> (== JSON \u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b) \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u0434\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0422\u043e \u0435\u0441\u0442\u044c, \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>\"[2].name\"<\/code> \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"json\">[   {\"name\": \"Alba\", \"length\": 956, \"categories\" : [9, 10, 12] },   { \"name\": \"Betula\", \"length\": 443, \"categories\" : [9, 10, 66, 95] },   { \"name\": \"Cruda\", \"length\": 747, \"categories\" : [5, 18, 4] }, ]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0432\u044b\u0431\u043e\u0440\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>'Cruda'<\/code> (SQL-\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430). \u0410 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>\"[1].categories[2:]\"<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 <code>[66, 95]<\/code> (SQL-\u043d\u044b\u0439 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 <code>ARRAY<\/code>).<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 <code>Columnar<\/code> \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043c\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u043d\u0443 \u0438\u043b\u0438 SQL-\u043d\u044b\u0439 <code>NULL<\/code>, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u043d\u0435\u0442. \u0414\u043b\u044f <code>PlainText<\/code> \u0438\u043c\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0435\u0440\u043d\u0451\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438\u0437 <code>byte[]<\/code>, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435 \u043a \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u2014 \u0442\u0443\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0439 \u0436\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0438 \u0447\u0438\u0441\u0442\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0435, \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0442\u043e \u0435\u0441\u0442\u044c, \u043d\u0430\u0434\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0431\u043b\u0438\u0437\u043a\u043e, \u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0432\u044b\u0448\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e, \u043a\u043b\u0430\u0441\u0441\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u043e\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0435 <code>Record<\/code>, \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u0435\u0437 \u0437\u0430\u0437\u0440\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 Hadoop \u0438 JTS, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044f \u0438\u0445. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>PlainText<\/code>: <code>class PlainText extends Text implements Record&lt;PlainText><\/code><\/li>\n<li><code>Structured<\/code>: <code>class Structured implements KryoSerializable, Record&lt;Structured><\/code><\/li>\n<li><code>Columnar<\/code>: <code>class Columnar implements KryoSerializable, Record&lt;Columnar><\/code><\/li>\n<li>\u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435: <code>interface SpatialRecord&lt;T extends Geometry> extends Record&lt;T><\/code><br \/> \n<ul>\n<li><code>Point<\/code>: <code>class PointEx extends Point implements SpatialRecord&lt;PointEx>, KryoSerializable<\/code><\/li>\n<li><code>Polygon<\/code>: <code>class PolygonEx extends Polygon implements SpatialRecord&lt;PolygonEx>, KryoSerializable<\/code><\/li>\n<li><code>Track<\/code>: <code>class SegmentedTrack extends GeometryCollection implements Lineal, Iterable&lt;Geometry>, SpatialRecord&lt;SegmentedTrack>, KryoSerializable<\/code><br \/> \n<ul>\n<li><code>Geometry<\/code> \u0432\u044b\u0448\u0435 \u044d\u0442\u043e: <code>class TrackSegment extends GeometryCollection implements Lineal, Iterable&lt;Geometry>, SpatialRecord&lt;TrackSegment><\/code><br \/> \n<ul>\n<li>\u0418 <code>Geometry<\/code> \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u0442\u043e\u0442 \u0436\u0435 <code>PointEx<\/code>, \u0447\u0442\u043e \u0438 \u0432 \u0442\u0438\u043f\u0435 <code>Point<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0438\u043f\u0430 <code>Track<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u0430\u043a \u0441\u043c\u0435\u0440\u0442\u044c \u041a\u043e\u0449\u0435\u0435\u0432\u0430, \u043d\u043e \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0436\u0435 \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0439 \u2014 \u0430 JTS, \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f, \u0438\u043c\u0435\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. <code>Text<\/code> \u0432 <code>PlainText<\/code> \u2014 \u044d\u0442\u043e \u0445\u0430\u0434\u0443\u043f\u043e\u0432\u0441\u043a\u0438\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0439 <code>Text<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u044f\u0432\u043d\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>KryoSerializable<\/code> \u2014 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c\u0441\u044f \u044f\u0432\u043d\u043e. \u0428\u0442\u0443\u043a\u0438 \u0442\u0438\u043f\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u0431\u0435\u0437 \u043f\u043e\u043b\u043d\u043e\u0439 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u2014 \u043a\u0440\u0443\u0433 \u0437\u0430\u0434\u0430\u0447 ETL \u0442\u0430\u043a\u0438\u0445 \u0432\u0435\u0449\u0435\u0439 \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442, \u0438 \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b <code>write()<\/code> \u0438 <code>read()<\/code> <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/data\/spatial\/PolygonEx.java\" rel=\"nofollow noopener noreferrer\">\u043c\u043e\u0436\u043d\u043e \u0433\u043b\u044f\u043d\u0443\u0442\u044c<\/a> \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <code>PolygonEx<\/code> \u2014 \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0433\u043a\u0430 \u0443\u0436\u0430\u0441\u043d\u0443\u0442\u044c\u0441\u044f. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0431\u043e\u043b\u044c\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u0434. \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0435\u0434\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0435\u0449\u044c \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 FlatBuffers \u0431\u044b\u043b\u043e \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u0439 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0432\u043e\u0437\u043d\u0438 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443 \u043d\u0430\u0441 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430), \u0430 BSON \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435 \u0438 \u043b\u0435\u0433\u0447\u0435 \u2014 \u0445\u043e\u043f \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0440\u0430\u0437\u0443 \u043c\u0430\u043f\u0443, \u0445\u043e\u043f \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0441\u0440\u0430\u0437\u0443 \u043c\u0430\u043f\u0443.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443 \u043d\u0430\u0441 \u0438\u0434\u0451\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0430\u0440\u043a\u043e\u0432\u0443\u044e <code>JavaPairRDD&lt;Object, &lt;Record&lt;?>><\/code> \u2014 \u043d\u0430\u0448 &#171;\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439&#187; \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u00ab\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432 SQL\u00bb.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u0435\u0433\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u0447\u0442\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0438 \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0435\u0449\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class DataStream {     public final StreamType streamType;     public final JavaPairRDD&lt;Object, Record&lt;?>> rdd;     private int usages = 0;      public final Accessor&lt;? extends Record&lt;?>> accessor;      public DataStream(StreamType streamType, JavaPairRDD&lt;Object, Record&lt;?>> rdd, Map&lt;String, List&lt;String>> attributes) {         accessor = streamType.accessor(attributes);          this.streamType = streamType;         this.rdd = rdd;     }      public DataStream(JavaPairRDD&lt;Object, Record&lt;?>> rdd) {         accessor = new PlainTextAccessor();          streamType = StreamType.PlainText;         this.rdd = rdd;     }      public int getUsages() {         return usages;     }      public int surpassUsages() {         if (usages &lt; DataContext.usageThreshold()) {             usages = DataContext.usageThreshold();         }         if (rdd.getStorageLevel() == StorageLevel.NONE()) {             rdd.persist(DataContext.storageLevel());         }          return usages;     }      public int incUsages() {         if ((++usages == DataContext.usageThreshold()) &amp;&amp; (rdd.getStorageLevel() == StorageLevel.NONE())) {             rdd.persist(DataContext.storageLevel());         }          return usages;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 \u0442\u0443\u0442 \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0435. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u043e\u043b\u0435 \u0442\u0438\u043f\u0430 <code>Accessor&lt;? extends Record&lt;?>><\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>@usage_threshold<\/code> \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043c\u0435\u043d\u044f\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 RDD \u0441\u043e <code>StorageLevel.NONE<\/code> \u043d\u0430 \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0436\u0435 \u0437\u0430\u0434\u0430\u043d \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>@storage_level<\/code>. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>OPTIONS<\/code>? \u0412\u043e\u0442 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u043d \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443, \u0441\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u043c-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0410 \u0432\u043e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043a\u0441\u0435\u0441\u0441\u043e\u0440 \u0437\u0430\u0447\u0435\u043c, \u0434\u0430 \u0435\u0449\u0451 \u0438 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c \u0442\u0438\u043f\u0430 <code>StreamType<\/code>? \u0410 \u0437\u0430\u0442\u0435\u043c, \u0447\u0442\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0443 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0438 \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043e \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u044f\u0437\u044b\u043a\u0430. \u0422\u043e\u0447\u043d\u0435\u0435, \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u0430\u0445, \u043a\u0440\u043e\u043c\u0435 <code>Track<\/code>, \u043e\u043d \u043e\u0434\u0438\u043d \u2014 \u0432\u0435\u0440\u0445\u043d\u0438\u0439, \u0430 \u0432 <code>Track<\/code> \u0438\u0445 \u0442\u0440\u0438: \u0441\u0430\u043c \u0442\u0440\u0435\u043a, \u0435\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b, \u0442\u043e\u0447\u043a\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u043d\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435, \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043d\u0438\u0445 \u043d\u0430\u0434\u043e \u0433\u0434\u0435-\u0442\u043e \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u0430\u043a \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0443\u0440\u043e\u0432\u043d\u044e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0430\u043a\u0441\u0435\u0441\u0441\u043e\u0440 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0434\u0442\u0438\u043f\u044b <code>DataStream<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0438 <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/data\/StreamType.java\" rel=\"nofollow noopener noreferrer\">\u043d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0435\u043d\u0443\u043c\u0430<\/a> <code>StreamType<\/code> \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0442\u0438\u043f\u044b \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0440\u0435\u0447\u044c \u043e \u043d\u0435\u0439 \u043f\u043e\u0439\u0434\u0451\u0442 \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445.<\/p>\n<p>  <\/p>\n<h1 id=\"7-implementaciya-peremennye-nastroyki-konteksta-ispolneniya-i-metadannye-parametrov-podklyuchaemyh-funkciy\">7. \u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h1>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>VariablesContext<\/code> (<a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/scripting\/VariablesContext.java\" rel=\"nofollow noopener noreferrer\">\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/a>), <code>OptionsContext<\/code> (<a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/scripting\/OptionsContext.java\" rel=\"nofollow noopener noreferrer\">\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/a>, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>OPTIONS<\/code>), \u0438 <code>Configuration<\/code> (<a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/config\/Configuration.java\" rel=\"nofollow noopener noreferrer\">\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/a> \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u2014 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439) \u044f \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0431\u0443\u0434\u0443.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438: \u043b\u044e\u0431\u044b\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <code>HashMap&lt;String, Object><\/code>, \u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u043e \u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0442\u0438\u043f\u0435 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u043b\u0435\u0442\u0443. \u0420\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>getArray()<\/code>, <code>getString()<\/code>, <code>getNumber()<\/code>, \u2014 \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>VariablesContext<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c, \u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0435 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u043e\u0441\u044c. \u0412\u0435\u0434\u044c \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438 <code>BEGIN \u2026 END<\/code> \u0443 \u043d\u0430\u0441 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>Configuration<\/code>, \u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0438\u043a\u0442\u0443\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041a\u043b\u0430\u0441\u0441\u044b \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043c\u0435\u044e\u0442 \u043c\u0435\u0442\u043e\u0434 <code>meta()<\/code>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439, \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0439 \u043c\u0435\u0442\u0430-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/metadata\/DefinitionMeta.java\" rel=\"nofollow noopener noreferrer\">\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u043c\u0430\u043f\u044b<\/a> <code>Map&lt;String, DefinitionMeta> definitions<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class DefinitionMeta {     public final String descr;      public final String type;     public final String hrType;      public final Object defaults;     public final String defDescr;      public final Map&lt;String, String> values;      public final boolean optional;     public final boolean dynamic; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0443 \u043d\u0430\u0441 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435,<\/li>\n<li>Java \u0442\u0438\u043f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>String<\/code>, \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f <code>String[]<\/code>, <code>Boolean<\/code>, \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438 <code>Number<\/code> \u0438 <code>Enum<\/code> \u2014 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0442\u0438\u043f\u043e\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432),<\/li>\n<li>\u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f,<\/li>\n<li>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c (\u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439),<\/li>\n<li>\u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u043c\u0438 (\u0435\u0441\u043b\u0438 Java \u0442\u0438\u043f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u043d\u0443\u043c\u043e\u043c),<\/li>\n<li>\u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0430\u0440\u0430 \u0444\u043b\u0430\u0433\u043e\u0432, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0438 \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/metadata\/DefinitionMetaBuilder.java\" rel=\"nofollow noopener noreferrer\">\u0431\u0438\u043b\u0434\u0435\u0440<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0443, \u0438 \u043a\u0430\u043a \u043e\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0438\u0442\u043e\u0433\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">new DefinitionMetaBuilder()    .def(NAME_PROP, \"Feature property with road name\")    .def(TYPE_PROP, \"Feature property with target road type\")    .def(WIDTH_PROP, \"Feature property with road width (i.e. number of lanes)\")    .def(ROAD_TYPES, \"Target road types\", String[].class,        new String[]{\"primary\", \"secondary\", \"tertiary\"}, \"Default target road types\")    .dynDef(TYPE_MULTIPLIER_PREFIX, \"Multipliers to adjust road width for each target type (i.e. lane width in meters)\", Double.class)    .build()<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"sql\">TRANSFORM osm_road_geometries geoJsonToRoadMap(@name_prop='NAME',     @type_prop='HIGHWAY',     @width_prop='LANES',     @road_types=['primary','primary_link'],     @type_multiplier_primary=2.6,     @type_multiplier_primary_link=2.6);<\/code><\/pre>\n<p>  <\/p>\n<p>\u2014 \u0442\u0443\u0442 \u0443 \u043d\u0430\u0441 \u043f\u0435\u0440\u0432\u044b\u0435 \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u0438 \u0438\u043c\u0435\u044e\u0442 Java \u0442\u0438\u043f <code>String<\/code> (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), 4-\u0439 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 (\u0442\u0438\u043f\u0430 <code>String[]<\/code>), \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435: \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443, \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0442\u0438\u043f <code>Double<\/code>. \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/spatial\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/spatial\/transform\/GeoJsonToRoadMap.java\" rel=\"nofollow noopener noreferrer\">geoJsonToRoadMap<\/a>, \u043a\u0441\u0442\u0430\u0442\u0438, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u0434\u043e\u0440\u043e\u0436\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043c\u0438 \u0438\u0437 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 OpenStreetMap \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 GeoJSON.<\/p>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">new DefinitionMetaBuilder()    .def(CALC_RESULTS, \"List of resulting column names\", String[].class)    .dynDef(SOURCE_ATTR_PREFIX, \"Column with Double values to use as series source\", String.class)    .dynDef(CALC_FUNCTION_PREFIX, \"The mathematical function to perform over the series\", KeyedMath.class)    .dynDef(CALC_CONST_PREFIX, \"An optional constant value for the selected function\", Double.class)    .build()<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"sql\">CALL keyedMath(@calc_results=[sum, mean, rms, min, max, mul],     @source_attr_sum=score1,  @calc_function_sum=SUM, @calc_const_sum=-15.,     @source_attr_mean=score1, @calc_function_mean=AVERAGE,     @source_attr_rms=sum,     @calc_function_rms=RMS,     @source_attr_min=score2,  @calc_function_min=MIN,     @source_attr_max=score2,  @calc_function_max=MAX,     @source_attr_mul=sum,     @calc_function_mul=MUL, @calc_const_mul=3.5     ) iNPUT scores OUTPUT scores_shift_stats;<\/code><\/pre>\n<p>  <\/p>\n<p>\u2014 \u0437\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f \u0438\u0437 \u0442\u0440\u0451\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 <code>String<\/code>, <code>enum KeyedMath<\/code>, \u0438 <code>Double<\/code>, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u043e\u0434 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>(\u0418 \u0434\u0430, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/math\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/math\/KeyedMathOperation.java\" rel=\"nofollow noopener noreferrer\">keyedMath<\/a> \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u043d\u0430\u0448 \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 SQL \u0432 \u0442\u0443 \u0441\u0442\u0435\u043f\u044c, \u0433\u0434\u0435 \u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0437\u043b\u043e\u0431\u043d\u044b\u0435, \u0434\u0438\u043a\u0438\u0435 \u0438 \u043c\u043e\u0445\u043d\u0430\u0442\u044b\u0435 <code>GROUP BY<\/code>. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0440\u043e\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u043e\u0431\u0435\u0449\u0430\u043d\u043e\u2026)<\/p>\n<p>  <\/p>\n<p>\u041d\u0443 \u0442\u0430\u043a \u0432\u043e\u0442, \u0438\u043c\u0435\u044f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u0430\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u0430 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0448\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0435\u0440\u043e\u043c \u0447\u0435\u0440\u0435\u0437 classpath, \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0430\u0441\u0442\u044c \u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0433\u0440\u0430\u0446\u0438\u043e\u0437\u043d\u043e. \u0410 \u043d\u0435 \u0431\u0443\u0445\u043d\u0443\u0442\u044c\u0441\u044f \u0441 NPE \u0438\u043b\u0438 \u043c\u0438\u0441\u043a\u0430\u0441\u0442\u043e\u043c \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u043a\u043e\u0439-\u0442\u043e.<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0442\u044f \u043c\u0435\u0442\u043e\u0434 <code>Configuration.get()<\/code> \u0438\u0437-\u0437\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public &lt;T> T get(String key) {     DefinitionMeta defMeta = definitions.get(key);     if (defMeta == null) {         for (String def : definitions.keySet()) {             if (key.startsWith(def)) {                 defMeta = definitions.get(def);                 break;             }         }     }     if (defMeta == null) {         throw new InvalidConfigurationException(\"Invalid parameter \" + key + \" of \" + descr);     }      Class&lt;T> clazz;     try {         clazz = (Class&lt;T>) Class.forName(defMeta.type);     } catch (ClassNotFoundException e) {         throw new InvalidConfigurationException(\"Cannot resolve class '\" + defMeta.type + \"' for parameter \" + key + \" of \" + descr);     }      Object value = holder.get(key);     if (value == null) {         value = defMeta.defaults;     }      if (value == null) {         return null;     }      if (Number.class.isAssignableFrom(clazz)) {         if (value instanceof Number) {             return (T) value;         }         try {             Constructor c = clazz.getConstructor(String.class);             return (T) c.newInstance(value);         } catch (Exception e) {             throw new InvalidConfigurationException(\"Bad numeric value '\" + value + \"' for \" + clazz.getSimpleName() + \" parameter \" + key + \" of \" + descr);         }     } else if (clazz.isEnum() &amp;&amp; (value instanceof Enum)) {         return (T) value;     } else {         String stringValue = String.valueOf(value);         if (String.class == clazz) {             return (T) stringValue;         } else if (Boolean.class == clazz) {             return (T) Boolean.valueOf(stringValue);         } else if (clazz.isEnum()) {             return (T) Enum.valueOf((Class) clazz, stringValue);         } else if (String[].class == clazz) {             if (value instanceof String[]) {                 return (T) value;             }             return (T) Arrays.stream(stringValue.split(\",\")).map(String::trim).toArray(String[]::new);         }     }      throw new InvalidConfigurationException(\"Improper type '\" + clazz.getName() + \"' of a parameter \" + key + \" of \" + descr); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0440\u0430\u0434\u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u043a\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0443\u0442\u0438 \u043d\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u0448\u044c\u2026 \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432\u043e \u0432\u0441\u0435\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 Scala \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0431\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435. \u041d\u043e \u0443 \u043d\u0430\u0441 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u0441\u0438\u0434\u0438\u0442 11 \u0436\u0430\u0431\u0430, \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0443\u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0436. \u0412\u0441\u044e \u043e\u0431\u0432\u044f\u0437\u043a\u0443 \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u043b\u0430\u043d\u0430 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0438 \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<h1 id=\"8-implementaciya-interpretator-kontekst-ispolneniya-operatory-vyrazheniy\">8. \u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/h1>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0440\u0430\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u0432\u0441\u044e \u0433\u0440\u044f\u0437\u043d\u0443\u044e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043f\u043e \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435 \/ \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u0430 AST \u0431\u0435\u0440\u0451\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f ANTLR. \u041d\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0434\u0451\u0440\u0433\u0430\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b, \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b SQL \u0432 \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u043a\u043e\u0434\u0430 \u043d\u0430 Spark RDD API.<\/p>\n<p>  <\/p>\n<p><em>\u2014 \u041a\u0430\u043a \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0443.jpg:<\/em><\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class TDL4Interpreter { \/\/ \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u043e\u0441\u0441\u044b\u043f\u044c\u044e     private final String script;  \/\/ \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f     private DataContext dataContext;  \/\/ \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445     private final OptionsContext options;     private VariablesContext variables;  \/\/ \u0441\u044e\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438     private final TDL4ErrorListener errorListener;  \/\/ \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430     public TDL4Interpreter(String script, VariablesContext variables, OptionsContext options, TDL4ErrorListener errorListener);  \/\/ \u043f\u0440\u043e\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f     public void interpret(DataContext dataContext);  \/\/ \u043f\u0440\u043e\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u043e\u0441\u0441\u044b\u043f\u044c\u044e \u2014 \u0442\u0443\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0443\u0436\u0435\u043d     public Object interpretExpr();  \/\/ \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 (\u0431\u0435\u0437 \u0440\u0430\u0437\u043d\u0438\u0446\u044b, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442)     public TDL4.ScriptContext parseScript();  \/* \u0410 \u0442\u0443\u0442 \u0443 \u043d\u0430\u0441 1000 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0446\u0438\u043a\u043b\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u0435\u0441\u0442\u044c, switch \u0432\u043d\u0443\u0442\u0440\u0438 if \u0432\u043d\u0443\u0442\u0440\u0438 if \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u043e\u0432 (\u0438 \u0442.\u0434.) \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 *\/ }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, 1000 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043e\u0439 SQL, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a Spark, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0440\u0430\u0437\u0431\u043e\u0440 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438,<\/li>\n<li>\u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0440\u043e\u0441\u0441\u044b\u043f\u044c\u044e,<\/li>\n<li>\u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a,<\/li>\n<li>\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f,<\/li>\n<li>\u0432\u044b\u0437\u043e\u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u044f\u0437\u044b\u043a\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c, CALL &#171;\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f&#187;), \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043c\u044b \u0438\u0445 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/scripting\/TDL4Interpreter.java\" rel=\"nofollow noopener noreferrer\">\u043a\u043e\u0434 \u0442\u0430\u043c \u0441\u043a\u0443\u0447\u043d\u044b\u0439<\/a>. \u0420\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043a\u0443\u0447\u043d\u044b\u0439. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e, \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438 \u0432 \u044d\u0442\u043e\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u043d\u043e \u044f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u043b.<\/p>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u0430 \u0436\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0438 \u0432\u044b\u0437\u043e\u0432 Spark RDD API, \u2014 \u0442\u043e \u0435\u0441\u0442\u044c, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u0439: \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435, \u2014 \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/data\/DataContext.java\" rel=\"nofollow noopener noreferrer\">\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class DataContext { \/\/ \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, Spark     protected final JavaSparkContext sparkContext;  \/\/ \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430...     private static StorageLevel sl = StorageLevel.fromString(storage_level.def());     private static int ut = Integer.parseInt(usage_threshold.def()); \/\/ ...\u0441 \u0433\u0435\u0442\u0442\u0435\u0440\u0430\u043c\u0438     public static StorageLevel storageLevel();     public static int usageThreshold();  \/\/ \u043d\u0430\u0448\u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445     protected final ListOrderedMap&lt;String, DataStream> store = new ListOrderedMap&lt;>();  \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043a Spark     public DataContext(final JavaSparkContext sparkContext);  \/\/ \u0438\u043d\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438\u0437 OPTIONS     public void initialize(OptionsContext options);  \/\/ \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432     public Set&lt;String> getAll();  \/\/ \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u043f\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 \u0434\u043b\u044f star syntax, \u0438\u043b\u0438 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443     public ListOrderedMap&lt;String, DataStream> getAll(String... templates);  \/\/ \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440     public void put(String name, DataStream ds);  \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0441\u0442\u0430\u0445. \u0434\u0430, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0446\u0435\u043b\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435     public Map&lt;String, DataStream> result();  \/\/ CREATE inputName adapter(params) FROM path PARTITION partCount BY partitioning;     public void createDataStreams(         String adapter,         String inputName,         String path,         Map&lt;String, Object> params,         int partCount, Partitioning partitioning);   \/\/ COPY outputName adapter(params) INTO path;     public void copyDataStream(         String adapter,         String outputName,         String path,         Map&lt;String, Object> params);  \/\/ TRANSFORM dsName converter(params) \/\/    SET COLUMNS(newColumns) KEY keyExpression~keyAfter PARTITION partCount;     public void alterDataStream(         String dsName,         StreamConverter converter,         Map&lt;String, List&lt;String>> newColumns,         List&lt;Expression&lt;?>> keyExpression,         boolean keyAfter,         int partCount,         Configuration params);  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445     public boolean has(String dsName);  \/\/ SELECT     public JavaPairRDD&lt;Object, Record&lt;?>> select(         boolean distinct, \/\/ DISTINCT         List&lt;String> inputs, UnionSpec unionSpec, JoinSpec joinSpec, \/\/ FROM         final boolean star, List&lt;SelectItem> items, \/\/ aliases or *         WhereItem whereItem, \/\/ WHERE         Double limitPercent, Long limitRecords, \/\/ LIMIT         VariablesContext variables); \/* ...\u0442\u0443\u0442 ~600 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u2014 \u0441\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u043e \u0432\u0441\u0451\u043c \u0434\u0432\u0438\u0436\u043a\u0435 *\/  \/\/ LET $var = SELECT     public Collection&lt;Object> subQuery(         boolean distinct,         DataStream input,         List&lt;Expression&lt;?>> item,         List&lt;Expression&lt;?>> query,         Double limitPercent, Long limitRecords,         VariablesContext variables); \/* ...\u0430 \u0442\u0443\u0442 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 50 *\/  \/\/ ANALYZE dataStreams KEY counterColumn;     public void analyze(Map&lt;String, DataStream> dataStreams, String counterColumn);  \/\/ \u0440\u0430\u0437\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 (\u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043d\u0435\u0442\u0441\u044f, \u043d\u043e \u0438\u043c\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0441\u044f)     public void renounce(String dsName); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u043d\u0435\u0441\u0435\u043d \u043e\u043d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e, \u0434\u0430\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0431\u043e\u0440 \u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0432 Spark RDD API.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 SQL, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u0414\u0440\u0443\u0433\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u0445 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0435\u0433\u043e \u0442\u0438\u043f\u0430,<\/li>\n<li>\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043e\u0431\u0432\u044f\u0437\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u0439 <code>TestDataContext<\/code>,<\/li>\n<li>\u0438 REPL, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u044b\u0435 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0438\u043f\u0430 <code>\\SHOW DS<\/code>, \u0442\u0430\u043a \u0438 \u0432\u043e\u0432\u0441\u0435 \u04360\u0441\u0442\u043a\u043e \u0432\u043c\u0435\u0448\u0438\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u043b\u043e\u0433\u0438\u043a\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>\\RENOUNCE<\/code> \u2014 \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u043e\u0434 \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u2014 \u043e\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0442\u0430\u043d, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u043e\u0436\u0435 \u043a\u0440\u0430\u0439\u043d\u0435 \u043e\u0434\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0435\u043d. \u0414\u0430\u0436\u0435 <code>DataContext.select()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043a\u0430\u043a \u0441\u0435\u0440\u0434\u0446\u0435 \u0434\u0432\u0438\u0436\u043a\u0430 SQL, \u0434\u043e\u043b\u0436\u043d\u044b\u0439 \u0431\u044b\u0442\u044c \u0447\u0435\u043c-\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u043c, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0447\u0435\u043d\u044c \u0441\u043a\u0443\u0447\u0435\u043d, \u0438 \u0442\u0443\u043f\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0437\u044b \u0416\u0426 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0412\u0434\u043e\u0431\u0430\u0432\u043e\u043a, \u0441\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f (\u0435\u0449\u0451 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435) \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u043f\u043e\u0434 2\u043a \u0441\u0442\u0440\u043e\u043a, \u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u0442\u043e \u0432\u0442\u0440\u043e\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0442\u0440\u0443\u0434\u043d\u043e \u0440\u0430\u0441\u043a\u0443\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u0440\u0430\u0437\u0431\u043e\u0440 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0440\u043e\u0441\u0441\u044b\u043f\u044c\u044e, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/scripting\/Operator.java\" rel=\"nofollow noopener noreferrer\">\u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 enum<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u044b (\u0441 \u0431\u043e\u0440\u0443 \u0434\u0430 \u043f\u043e \u0441\u043e\u0441\u0435\u043d\u043a\u0435 \u2014 \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u0437 PostgreSQL) \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public enum Operator {     TERNARY1, DEFAULT, TERNARY2,     OR, XOR, AND, NOT, RANDOM,     IN, IS, BETWEEN,     EQ, EQ2, NEQ, NE2, GE, GT, LE, LT,     LIKE, MATCH, REGEX,     DIGEST, HASH,     HASHCODE,     BOR, BXOR, BAND, BSL, BSR,     CAT,     ADD, SUB,     MUL, DIV, MOD,     ABS, EXP,     BNOT;  \/\/ \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0442\u0438\u043f\u0435     private static int popInt(Deque&lt;Object> args);     private static long popLong(Deque&lt;Object> args);     private static double popDouble(Deque&lt;Object> args);     private static boolean popBoolean(Deque&lt;Object> args);  \/\/ \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0441\u0442\u0435\u043a \u043d\u0430\u0441\u0447\u0451\u0442 NULL     private static boolean peekNull(Deque&lt;Object> args);  \/\/ \u0441\u0438\u043c\u0432\u043e\u043b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430     private final String op; \/\/ \u0435\u0433\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442     public final int prio; \/\/ \u043a\u043e\u043b-\u0432\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432     public int ariness = 2; \/\/ \u043f\u0440\u0430\u0432\u0430\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c     public boolean rightAssoc = false; \/\/ \u043e\u0441\u043e\u0431\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 NULL     public boolean handleNull = false;  \/\/ \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b     Operator(String op, int prio);     Operator(String op, int prio, int ariness, boolean rightAssoc, boolean handleNull);   \/\/ \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440? \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442\u0443     public static Operator get(String op);  \/\/ \u0442\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e     public Object op(Deque&lt;Object> args); \/\/ \u0430 \u0442\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430     protected abstract Object op0(Deque&lt;Object> args);  \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u044f\u0432\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043a \u0431\u0443\u043b\u044e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432 WHERE \u0438 IF     public static boolean bool(AttrGetter props, List&lt;Expression&lt;?>> item, VariablesContext vc);  \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445     public static Object eval(AttrGetter props, List&lt;Expression&lt;?>> item, VariablesContext vc); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0443 \u043d\u0430\u0441 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>eval()<\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043b\u044f\u043c\u0431\u0434 \u0432 RPN (\u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0447\u0435\u0440\u0435\u0437 <code>List&lt;Exression&lt;?>><\/code>), \u0437\u0430\u0440\u044f\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>VariablesContext vc<\/code>) \u0438 \u0441\u043d\u0430\u0431\u0436\u0451\u043d\u043d\u043e\u043c\u0443 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u0433\u0435\u0442\u0442\u0435\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 (<code>AttrGetter props<\/code>), \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \/ \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0410 \u0442\u043e \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 <code>SELECT<\/code> \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c, \u0430 \u0432 <code>LET<\/code> \u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435\u0442, \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <code>AttrGetter<\/code> \u0431\u0443\u0434\u0435\u0442 <code>null<\/code> (Java <code>null<\/code>, \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 SQL <code>NULL<\/code>).<\/p>\n<p>  <\/p>\n<p>\u0421\u0430\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u044f\u043c\u0431\u0434, \u043a\u0430\u043a \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 RPN \u0441\u0442\u0435\u043a \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 Shunting Yard (\u043e \u0442\u0430\u043a\u043e\u043c \u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u0442\u0430\u043a \u0447\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/435902\/\">\u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0448\u043b\u044e\u0441\u044c<\/a> \u2014 \u0442\u0443\u0442 \u043e\u043d\u043e \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435).<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a\u0438\u0435 \u043b\u044f\u043c\u0431\u0434\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430\u0448\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439? \u041d\u0443, <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/scripting\/Expression.java\" rel=\"nofollow noopener noreferrer\">\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435<\/a> <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\/blob\/master\/commons\/src\/main\/java\/io\/github\/pastorgl\/datacooker\/scripting\/Expressions.java\" rel=\"nofollow noopener noreferrer\">\u043a\u043b\u0430\u0441\u0441\u044b<\/a> \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public interface Expression&lt;T> extends Serializable { }  public final class Expressions {     @FunctionalInterface     public interface SetItem extends Expression&lt;Set&lt;Object>> {         Set&lt;Object> get();     }     public static SetItem setItem(Object[] a);      @FunctionalInterface     public interface BetweenExpr extends Expression&lt;Boolean> {         boolean eval(final Object b);     }     public static BetweenExpr between(double l, double r);     public static BetweenExpr notBetween(double l, double r);      @FunctionalInterface     public interface InExpr extends Expression&lt;Boolean> {         boolean eval(Object n, Object h);     }     public static InExpr in();     public static InExpr notIn();      @FunctionalInterface     public interface IsExpr extends Expression&lt;Boolean> {         boolean eval(Object rv);     }     public static IsExpr isNull();     public static IsExpr nonNull();      @FunctionalInterface     public interface PropItem extends Expression&lt;Object> {         Object get(AttrGetter obj);     }     public static PropItem propItem(String propName);      @FunctionalInterface     public interface VarItem extends Expression&lt;Object> {         Object get(VariablesContext vc);     }     public static VarItem varItem(String varName);     public static VarItem arrItem(String varName);      @FunctionalInterface     public interface StringItem extends Expression&lt;String> {         String get();     }     public static StringItem stringItem(String immediate);      @FunctionalInterface     public interface NumericItem extends Expression&lt;Number> {         Number get();     }     public static NumericItem numericItem(Number immediate);      @FunctionalInterface     public interface NullItem extends Expression&lt;Void> {         Void get();     }     public static NullItem nullItem();      @FunctionalInterface     public interface OpItem extends Expression&lt;Object> {         Object eval(Deque&lt;Object> args);     }     public static OpItem opItem(Operator op);      @FunctionalInterface     public interface StackGetter extends Expression&lt;Deque&lt;Object>> {         Deque&lt;Object> get(Deque&lt;Object> stack);     }     public static StackGetter stackGetter(int num);      @FunctionalInterface     public interface BoolItem extends Expression&lt;Boolean> {         Boolean get();     }     public static BoolItem boolItem(boolean immediate); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043d\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c \u0441\u0442\u0440\u043e\u043a (<code>StringItem<\/code>), <code>Numeric<\/code>-\u043e\u0432 (<code>NumberItem<\/code>), \u0431\u0443\u043b\u0435\u0439 (<code>BoolItem<\/code>) \u0438 <code>NULL<\/code> (<code>NullItem<\/code>),<\/li>\n<li>\u043f\u043e 2 \u0448\u0442. \u0434\u043b\u044f \u00ab\u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0445\u00bb SQL-\u0435\u0432\u0441\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u0441 <code>NOT<\/code> \u0438 \u0431\u0435\u0437 \u2014 <code>BETWEEN<\/code> (<code>BetweenExpr<\/code>), <code>IN<\/code> (<code>InExpr<\/code>), \u0438 <code>IS<\/code> (<code>IsExpr<\/code>),<\/li>\n<li>2 \u0448\u0442. \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 (<code>VarItem<\/code>),<\/li>\n<li>\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0447\u0435\u0440\u0435\u0437 \u0438\u043c\u044f (<code>PropItem<\/code>),<\/li>\n<li>\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 (<code>SetItem<\/code>),<\/li>\n<li>\u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 (\u043d\u0435-\u00ab\u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c\u00bb, <code>OpItem<\/code>),<\/li>\n<li>\u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u0437\u044f\u0442\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0442\u0435\u043a\u0430 (<code>StackGetter<\/code>).<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438\u0437 \u00ab\u0441\u0443\u043f\u0430 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u0432\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u00ab\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u043e\u0441\u0441\u044b\u043f\u044c\u044e\u00bb \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 \u044f\u0437\u044b\u043a\u0430, \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043c\u044b \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 RPN, \u043a\u043b\u0430\u0434\u0451\u043c \u0438\u0445 \u043d\u0430 \u0441\u0442\u0435\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0432 \u043b\u044f\u043c\u0431\u0434\u044b, \u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0438 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044f \u0443\u0436\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 (\u0441\u0442\u0435\u043a \u043b\u044f\u043c\u0431\u0434) \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043d\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0435\u0449\u0451 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u043e \u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436. \u0421 \u044f\u0434\u0440\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0430 \u043c\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438 \u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e\u0432\u0430\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u0447\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/761328\/\">\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437<\/a>. \u041d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435\u0441\u044c!<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u0441\u044b\u043b\u043e\u0447\u043a\u0438. \u041a\u0430\u043a \u0436\u0435 \u0431\u0435\u0437 \u0441\u0441\u044b\u043b\u043e\u0447\u0435\u043a?<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438: <a href=\"https:\/\/github.com\/PastorGL\/datacooker-etl\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/PastorGL\/datacooker-etl<\/a><br \/>  \u041f\u0440\u043e\u043c\u043e-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: <a href=\"https:\/\/pastorgl.github.io\/datacooker-etl\" rel=\"nofollow noopener noreferrer\">https:\/\/pastorgl.github.io\/datacooker-etl<\/a><br \/>  \u0413\u0440\u0443\u043f\u043f\u0430 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0435: <a href=\"https:\/\/t.me\/data_cooker_etl\" rel=\"nofollow noopener noreferrer\">https:\/\/t.me\/data_cooker_etl<\/a><br \/>  \u0418 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0435, \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0438 \u043d\u0430\u0434\u043e\u0443\u043c\u0438\u043b\u0438 \u043c\u0435\u043d\u044f \u0432\u0437\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430: <a href=\"https:\/\/t.me\/hadoopusers\" rel=\"nofollow noopener noreferrer\">https:\/\/t.me\/hadoopusers<\/a><\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/761094\/\"> https:\/\/habr.com\/ru\/articles\/761094\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/6k\/yt\/1k\/6kyt1kuka91k-deyfhubpa9uiuo.png\" alt=\"04_assets_residents.tdl\" data-src=\"https:\/\/habrastorage.org\/webt\/6k\/yt\/1k\/6kyt1kuka91k-deyfhubpa9uiuo.png\"\/><\/p>\n<p>  <\/p>\n<blockquote><p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Java \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430 SQL \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spark RDD API, \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p><\/blockquote>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0435\u0440\u0438\u0438, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/760778\/\">\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u044f\u0437\u044b\u043a\u0430<\/a>:<br \/>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435)<br \/>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<br \/>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<br \/>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u043f\u0438\u0437\u043e\u0434\u0435 \u043c\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u2014 <strong>\u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/strong>. \u0425\u043e\u0440\u043e\u0448\u043e, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0440\u0430\u0442\u044c \u0441\u043f\u0435\u043a\u0443, \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043b\u0430\u043d\u0443.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0435 \u00abM for Mature\u00bb<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u2014 \u0432\u044b\u0441\u043e\u043a\u0438\u0439. \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043f\u043e \u0445\u043e\u0434\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0442\u0441\u044f, \u0434\u0430 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0431\u0438\u0433\u0434\u0430\u0442\u044b \u0438 \u0436\u0430\u0440\u0433\u043e\u043d\u043e\u043c \u0438\u0437 \u0434\u0430\u0442\u0430 \u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430, \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f, \u0438 \u0435\u0449\u0451 \u0445\u0443\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f. \u042f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u043b.<\/p>\n<\/div><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-354900","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354900","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=354900"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354900\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=354900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=354900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=354900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}