{"id":1311,"date":"2023-03-19T08:18:08","date_gmt":"2023-03-19T00:18:08","guid":{"rendered":"http:\/\/viplao.com\/?p=1311"},"modified":"2023-03-19T08:18:10","modified_gmt":"2023-03-19T00:18:10","slug":"%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86","status":"publish","type":"post","link":"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/","title":{"rendered":"\u00a0\u3010\u8fd0\u7ef4\u5de5\u5177\u3011Flink SQL\u00a0\u5b9e\u8df5 &#8211; source\\sink \u539f\u7406"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_71 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u6587\u7ae0\u76ee\u5f55<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#1%E5%BA%8F%E7%AF%87-%E6%9C%AC%E6%96%87%E7%BB%93%E6%9E%84\" title=\"1.\u5e8f\u7bc7-\u672c\u6587\u7ed3\u6784\">1.\u5e8f\u7bc7-\u672c\u6587\u7ed3\u6784<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#2%E8%83%8C%E6%99%AF%E7%AF%87-%E5%85%B3%E4%BA%8E_sql\" title=\"2.\u80cc\u666f\u7bc7-\u5173\u4e8e sql\">2.\u80cc\u666f\u7bc7-\u5173\u4e8e sql<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#3%E5%AE%9A%E4%B9%89%E7%AF%87-sql_source%E3%80%81sink\" title=\"3.\u5b9a\u4e49\u7bc7-sql source\u3001sink\">3.\u5b9a\u4e49\u7bc7-sql source\u3001sink<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#4%E5%AE%9E%E6%88%98%E7%AF%87-sql_source%E3%80%81sink_%E7%9A%84%E7%94%A8%E6%B3%95\" title=\"4.\u5b9e\u6218\u7bc7-sql source\u3001sink \u7684\u7528\u6cd5\">4.\u5b9e\u6218\u7bc7-sql source\u3001sink \u7684\u7528\u6cd5<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#5%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E7%AF%87-sql_source%E3%80%81sink_%E6%98%AF%E6%80%8E%E4%B9%88%E8%B7%91%E8%B5%B7%E6%9D%A5%E7%9A%84\" title=\"5.\u539f\u7406\u5256\u6790\u7bc7-sql source\u3001sink \u662f\u600e\u4e48\u8dd1\u8d77\u6765\u7684\">5.\u539f\u7406\u5256\u6790\u7bc7-sql source\u3001sink \u662f\u600e\u4e48\u8dd1\u8d77\u6765\u7684<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#51connector_%E6%80%8E%E6%A0%B7%E6%98%A0%E5%B0%84%E5%88%B0%E5%85%B7%E4%BD%93%E7%AE%97%E5%AD%90%EF%BC%9F\" title=\"5.1.connector \u600e\u6837\u6620\u5c04\u5230\u5177\u4f53\u7b97\u5b50\uff1f\">5.1.connector \u600e\u6837\u6620\u5c04\u5230\u5177\u4f53\u7b97\u5b50\uff1f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#52format_%E6%80%8E%E6%A0%B7%E6%98%A0%E5%B0%84%E5%88%B0%E5%85%B7%E4%BD%93_serde%EF%BC%9F\" title=\"5.2.format \u600e\u6837\u6620\u5c04\u5230\u5177\u4f53 serde\uff1f\">5.2.format \u600e\u6837\u6620\u5c04\u5230\u5177\u4f53 serde\uff1f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#53%E5%85%B6%E4%BB%96%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E6%80%8E%E4%B9%88%E5%8A%A0%E8%BD%BD%EF%BC%9F\" title=\"5.3.\u5176\u4ed6\u914d\u7f6e\u5c5e\u6027\u600e\u4e48\u52a0\u8f7d\uff1f\">5.3.\u5176\u4ed6\u914d\u7f6e\u5c5e\u6027\u600e\u4e48\u52a0\u8f7d\uff1f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/#6%E6%80%BB%E7%BB%93%E4%B8%8E%E5%B1%95%E6%9C%9B%E7%AF%87\" title=\"6.\u603b\u7ed3\u4e0e\u5c55\u671b\u7bc7\">6.\u603b\u7ed3\u4e0e\u5c55\u671b\u7bc7<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1%E5%BA%8F%E7%AF%87-%E6%9C%AC%E6%96%87%E7%BB%93%E6%9E%84\"><\/span>1.\u5e8f\u7bc7-\u672c\u6587\u7ed3\u6784<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u672c\u6587\u4ece\u4ee5\u4e0b\u4e94\u4e2a\u5c0f\u8282\u4ecb\u7ecd flink sql source\\sink\\format \u7684\u6982\u5ff5\u3001\u539f\u7406\u3002<\/p>\n\n\n\n<ol>\n<li>\u80cc\u666f\u7bc7-\u5173\u4e8e sql<\/li>\n\n\n\n<li>\u5b9a\u4e49\u7bc7-sql source\u3001sink<\/li>\n\n\n\n<li>\u5b9e\u6218\u7bc7-sql source\u3001sink \u7684\u7528\u6cd5<\/li>\n\n\n\n<li>\u539f\u7406\u5256\u6790\u7bc7-sql source\u3001sink \u662f\u600e\u4e48\u8dd1\u8d77\u6765\u7684<\/li>\n\n\n\n<li>\u603b\u7ed3\u4e0e\u5c55\u671b\u7bc7<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2%E8%83%8C%E6%99%AF%E7%AF%87-%E5%85%B3%E4%BA%8E_sql\"><\/span>2.\u80cc\u666f\u7bc7-\u5173\u4e8e sql<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u5173\u4e8e flink sql \u7684\u5b9a\u4f4d\u3002<\/p>\n\n\n\n<p>\u5148\u804a\u804a\u4f7f\u7528 sql \u7684\u539f\u56e0\uff0c\u603b\u7ed3\u6765\u8bf4\u5c31\u662f\u4e00\u5207\u4ece\u7b80\u3002<\/p>\n\n\n\n<ul>\n<li>SQL \u5c5e\u4e8e DSL<\/li>\n\n\n\n<li>SQL \u6613\u4e8e\u7406\u89e3<\/li>\n\n\n\n<li>SQL \u5185\u7f6e\u591a\u79cd\u67e5\u8be2\u4f18\u5316\u5668<\/li>\n\n\n\n<li>SQL \u7a33\u5b9a\u7684\u8bed\u8a00<\/li>\n\n\n\n<li>SQL \u6613\u4e8e\u7ba1\u7406<\/li>\n\n\n\n<li>SQL \u5229\u4e8e\u6d41\u6279\u4e00\u4f53<\/li>\n<\/ul>\n\n\n\n<p>\u76ee\u524d 1.13 \u7248\u672c\u7684 SQL \u5df2\u7ecf\u96c6\u6210\u4e86\u5927\u91cf\u9ad8\u6548\u3001\u6613\u7528\u7684 feature\u3002\u672c\u7cfb\u5217\u6559\u7a0b\u4e5f\u662f\u57fa\u4e8e 1.13.1\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3%E5%AE%9A%E4%B9%89%E7%AF%87-sql_source%E3%80%81sink\"><\/span>3.\u5b9a\u4e49\u7bc7-sql source\u3001sink<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u672c\u6587\u4f1a\u7b80\u5355\u4ecb\u7ecd\u4e00\u4e9b flink sql \u7684 source\u3001sink \u7684\u5b9a\u4e49\u3001\u4f7f\u7528\u65b9\u6cd5\uff0c\u4f1a\u7740\u91cd\u5207\u4ecb\u7ecd\u5176\u5bf9\u5e94\u6846\u67b6\u8bbe\u8ba1\u548c\u5b9e\u73b0\u3002\u8be6\u7ec6\u89e3\u6790\u4e00\u4e0b\u4ece\u4e00\u6761 create table sql \u5230\u5177\u4f53\u7684\u7b97\u5b50\u5c42\u9762\u7684\u6574\u4e2a\u6d41\u7a0b\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>Notes\uff1a\u5728 flink sql \u4e2d\uff0csource \u6709\u4e24\u79cd\u8868\uff0c\u4e00\u79cd\u662f\u6570\u636e\u6e90\u8868\uff0c\u4e00\u79cd\u662f\u6570\u636e\u7ef4\u8868\u3002\u6570\u636e\u6e90\u8868\u5c31\u662f\u6709\u6e90\u6e90\u4e0d\u65ad\u7684\u6570\u636e\u7684\u8868\u3002\u6bd4\u5982 mq\u3002\u6570\u636e\u7ef4\u8868\u5c31\u662f\u7528\u6765\u7ed9\u67d0\u4e9b\u6570\u636e\u6269\u5145\u7ef4\u5ea6\u4f7f\u7528\u7684\u3002\u6bd4\u5982 redis\uff0cmysql\uff0c\u4e00\u822c\u90fd\u662f\u505a\u6269\u5bb9\u7ef4\u5ea6\u7684\u7ef4\u8868 join \u4f7f\u7528\u3002<br><strong>\u672c\u8282\u4e3b\u8981\u4ecb\u7ecd\u6570\u636e\u6e90\u8868\uff0c\u6570\u636e\u7ef4\u8868\u7684\u6574\u4e2a\u6d41\u7a0b\u548c\u6570\u636e\u6e90\u8868\u51e0\u4e4e\u4e00\u6837\u3002\u4e0b\u6587\u4e2d\u7684 source \u9ed8\u8ba4\u90fd\u4e3a\u6570\u636e\u6e90\u8868\u3002<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p>\u9996\u5148\u5728\u4ecb\u7ecd sql \u4e4b\u524d\uff0c\u6211\u4eec\u5148\u6765\u770b\u770b datastream \u4e2d\u5b9a\u4e49\u4e00\u4e2a source \u9700\u8981\u7684\u6700\u57fa\u672c\u7684\u5185\u5bb9\u3002<\/p>\n\n\n\n<ol>\n<li><strong>source\u3001sink \u7684 connector \u8fde\u63a5\u914d\u7f6e\u4fe1\u606f<\/strong>\u3002\u6bd4\u5982 datastream api kafka connector \u7684 properties\uff0ctopic \u540d\u79f0\u3002<\/li>\n\n\n\n<li><strong>source\u3001sink \u7684\u5e8f\u5217\u5316\u65b9\u5f0f\u4fe1\u606f<\/strong>\u3002\u6bd4\u5982 datastream api kafka connector \u7684 DeserializationSchema\uff0cSerializationSchema\u3002<\/li>\n\n\n\n<li><strong>source\u3001sink \u7684\u5b57\u6bb5\u4fe1\u606f<\/strong>\u3002\u6bd4\u5982 datastream api kafka connector \u7684\u5e8f\u5217\u5316\u6216\u8005\u53cd\u5e8f\u5217\u5316\u51fa\u6765\u7684 Model \u6240\u5305\u542b\u7684\u5b57\u6bb5\u4fe1\u606f\u3002<\/li>\n\n\n\n<li><strong>source\u3001sink \u5bf9\u8c61<\/strong>\u3002\u6bd4\u5982 datastream api kafka connector source \u5bf9\u5e94\u7684\u5177\u4f53 java \u5bf9\u8c61\u3002<\/li>\n<\/ol>\n\n\n\n<p>sql \u4e2d\u7684 source\u3001sink \u6240\u5305\u542b\u7684\u57fa\u672c\u70b9\u5176\u5b9e\u548c datastream \u90fd\u662f\u76f8\u540c\u7684\uff0c\u53ef\u4ee5\u5c06 sql \u4e2d\u7684\u4e00\u4e9b\u8bed\u6cd5\u7ed9\u6620\u5c04\u5230 datastream \u4e2d\u6765\u5e2e\u52a9\u5feb\u901f\u7406\u89e3 sql\uff1a<\/p>\n\n\n\n<ol>\n<li><strong>sql source\u3001sink connector\\properties<\/strong>\u3002\u53ef\u4ee5\u5bf9\u5e94\u5230 datastream api kafka connector \u7684 properties\uff0ctopic \u540d\u79f0\u3002<\/li>\n\n\n\n<li><strong>sql source\u3001sink format<\/strong>\u3002\u53ef\u4ee5\u5bf9\u5e94\u5230 datastream api kafka connector \u7684 DeserializationSchema\uff0cSerializationSchema\u3002<\/li>\n\n\n\n<li><strong>sql source\u3001sink field<\/strong>\u3002\u53ef\u4ee5\u5bf9\u5e94\u5230 datastream api kafka connector \u7684\u5e8f\u5217\u5316\u6216\u8005\u53cd\u5e8f\u5217\u5316\u51fa\u6765\u7684 Model \u6240\u5305\u542b\u7684\u5b57\u6bb5\u4fe1\u606f\u3002<\/li>\n\n\n\n<li><strong>sql source\u3001sink catalog_name\u3001db_name\u3001table_name<\/strong>\u3002\u53ef\u4ee5\u5bf9\u5e94\u5230 datastream api kafka connector source \u5bf9\u5e94\u7684\u5177\u4f53 java \u5bf9\u8c61\u3002<\/li>\n\n\n\n<li><strong>sql \u672c\u8eab\u7684\u7279\u6027<\/strong>\u3002\u6bd4\u5982\u67d0\u4e9b\u573a\u666f\u4e0b\u9700\u8981\u5c06 sql schema \u6301\u4e45\u5316\uff0c\u4f1a\u7528\u5230 hive catalog \u7b49\uff0c\u8fd9\u4e2a\u53ef\u4ee5\u8bf4\u662f sql \u76ee\u524d\u6bd4 datastream api \u591a\u7684\u4e00\u4e2a\u7279\u6027\u3002\u4f46\u662f\u4ed4\u7ec6\u60f3\u60f3\uff0c\u5176\u5b9e datastream \u4e5f\u80fd\u591f\u62d3\u5c55\u8fd9\u6837\u7684\u80fd\u529b\uff0c\u5176\u5b9e\u5c31\u662f\u5c06\u67d0\u4e2a datastream \u6ce8\u518c\u5230\u5916\u90e8\u5b58\u50a8\u4e2d\uff08\u53ef\u4ee5\uff0c\u4f46\u5bf9 datastream \u6765\u8bf4\u6ca1\u5fc5\u8981\uff09\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u6765\u770b\u770b\u5b98\u7f51\u7684\u6587\u6863 create table schema \u7684\u63cf\u8ff0\uff0c\u53ef\u4ee5\u53d1\u73b0\u5c31\u662f\u56f4\u7ed5\u7740\u4e0a\u9762\u8fd9\u4e94\u70b9\u5c55\u5f00\u7684\u3002<a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/ci.apache.org\/projects\/flink\/flink-docs-release-1.13\/zh\/docs\/dev\/table\/sql\/create\/%23create-table\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/ci.apache.org\/projects\/flink\/flink-docs-release-1.13\/zh\/docs\/dev\/table\/sql\/create\/#create-table<\/a>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE &#91;IF NOT EXISTS] &#91;catalog_name.]&#91;db_name.]table_name\n  (\n    { &lt;physical_column_definition&gt; | &lt;metadata_column_definition&gt; | &lt;computed_column_definition&gt; }&#91; , ...n]\n    &#91; &lt;watermark_definition&gt; ]\n    &#91; &lt;table_constraint&gt; ]&#91; , ...n]\n  )\n  &#91;COMMENT table_comment]\n  &#91;PARTITIONED BY (partition_column_name1, partition_column_name2, ...)]\n  WITH (key1=val1, key2=val2, ...)\n  &#91; LIKE source_table &#91;( &lt;like_options&gt; )] ]\n   \n&lt;physical_column_definition&gt;:\n  column_name column_type &#91; &lt;column_constraint&gt; ] &#91;COMMENT column_comment]\n  \n&lt;column_constraint&gt;:\n  &#91;CONSTRAINT constraint_name] PRIMARY KEY NOT ENFORCED\n\n&lt;table_constraint&gt;:\n  &#91;CONSTRAINT constraint_name] PRIMARY KEY (column_name, ...) NOT ENFORCED\n\n&lt;metadata_column_definition&gt;:\n  column_name column_type METADATA &#91; FROM metadata_key ] &#91; VIRTUAL ]\n\n&lt;computed_column_definition&gt;:\n  column_name AS computed_column_expression &#91;COMMENT column_comment]\n\n&lt;watermark_definition&gt;:\n  WATERMARK FOR rowtime_column_name AS watermark_strategy_expression\n\n&lt;source_table&gt;:\n  &#91;catalog_name.]&#91;db_name.]table_name\n\n&lt;like_options&gt;:\n{\n   { INCLUDING | EXCLUDING } { ALL | CONSTRAINTS | PARTITIONS }\n | { INCLUDING | EXCLUDING | OVERWRITING } { GENERATED | OPTIONS | WATERMARKS } \n}&#91;, ...]\n<\/code><\/pre>\n\n\n\n<p>\u7ed3\u5408\u6211\u4eec\u521a\u521a\u8bf4\u7684 sql source\u3001sink \u4e2d\u4e3b\u8981\u5305\u542b 5 \u70b9\u89e3\u91ca\u4e00\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE &#91;IF NOT EXISTS] -- sql source\u3001sink catalog_name\u3001db_name\u3001table_name\n(\n   -- sql source\u3001sink field \u5b57\u6bb5\u4fe1\u606f\n) WITH \n( \n   -- sql source\u3001sink connector\\properties \u8fde\u63a5\u914d\u7f6e\n   -- sql source\u3001sink format\n)\n<\/code><\/pre>\n\n\n\n<p>\u6765\u4e2a kafka source \u7684\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE KafkaTable ( -- sql source\u3001sink catalog_name\u3001db_name\u3001table_name\n  `f0` STRING, -- sql source\u3001sink \u7684\u5b57\u6bb5\u4fe1\u606f\n  `f1` STRING\n) WITH (\n  'connector' = 'kafka', -- sql source\u3001sink \u7684 connector \u8fde\u63a5\u914d\u7f6e\n  'topic' = 'topic', -- sql source\u3001sink \u7684 connector \u8fde\u63a5\u914d\u7f6e\n  'properties.bootstrap.servers' = 'localhost:9092', -- sql source\u3001sink \u7684 connector \u8fde\u63a5\u914d\u7f6e\n  'properties.group.id' = 'testGroup', -- sql source\u3001sink \u7684 connector \u8fde\u63a5\u914d\u7f6e\n  'format' = 'json' -- sql source\u3001sink \u7684\u5e8f\u5217\u5316\u65b9\u5f0f\u4fe1\u606f\n)\n<\/code><\/pre>\n\n\n\n<p>\u5176\u5bf9\u5e94\u7684 datastream \u5199\u6cd5\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Properties properties = new Properties();\nproperties.setProperty(\"bootstrap.servers\", \"localhost:9092\");\nproperties.setProperty(\"group.id\", \"testGroup\");\n\nDeserializationSchema&lt;Tuple2&lt;String, String&gt;&gt; d = new AbstractDeserializationSchema&lt;Tuple2&lt;String, String&gt;&gt;() {\n\n    @Override\n    public Tuple2&lt;String, String&gt; deserialize(byte&#91;] message) throws IOException {\n        return json \u89e3\u6790\u4e3a tuple2 \u6b64\u5904\u7701\u7565;\n    }\n};\n\nDataStream&lt;Tuple2&lt;String, String&gt;&gt; stream = env\n        .addSource(new FlinkKafkaConsumer&lt;&gt;(\"topic\", d, properties));\n<\/code><\/pre>\n\n\n\n<p>\u5c06 sql source \u548c datastream source \u7684\u7ec4\u6210\u90e8\u5206\u4e92\u76f8\u6620\u5c04\u8d77\u6765\u53ef\u4ee5\u5f97\u5230\u4e0b\u56fe\uff0c\u5176\u4e2d datastream\u3001sql \u4e2d\u989c\u8272\u76f8\u540c\u7684\u5c5e\u6027\u4e92\u76f8\u5bf9\u5e94\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-fad58ba37f0f63bc43ab8b6f9df23e52_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>2<\/p>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\uff0c\u5c06\u6240\u6709\u7684 sql \u5173\u7cfb\u4ee3\u6570\u90fd\u6620\u5c04\u5230 datastream api \u4e0a\uff0c\u4f1a\u6709\u52a9\u4e8e\u6211\u4eec\u5feb\u901f\u7406\u89e3\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4%E5%AE%9E%E6%88%98%E7%AF%87-sql_source%E3%80%81sink_%E7%9A%84%E7%94%A8%E6%B3%95\"><\/span>4.\u5b9e\u6218\u7bc7-sql source\u3001sink \u7684\u7528\u6cd5<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u76f4\u63a5\u89c1\u5b98\u7f51 Table API Connectors\u3002\u5df2\u7ecf\u63cf\u8ff0\u7684\u975e\u5e38\u8be6\u7ec6\u4e86\uff0c\u672c\u6587\u4fa7\u91cd\u539f\u7406\uff0c\u6240\u4ee5\u6b64\u5904\u4e0d\u591a\u8d58\u8ff0\u3002<\/p>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/ci.apache.org\/projects\/flink\/flink-docs-release-1.13\/docs\/connectors\/table\/overview\/\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.alibabacloud.com\/help\/zh\/faq-list\/62516.htm?spm=a2c63.p38356.b99.212.3c1a1442x9AY7m\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E7%AF%87-sql_source%E3%80%81sink_%E6%98%AF%E6%80%8E%E4%B9%88%E8%B7%91%E8%B5%B7%E6%9D%A5%E7%9A%84\"><\/span>5.\u539f\u7406\u5256\u6790\u7bc7-sql source\u3001sink \u662f\u600e\u4e48\u8dd1\u8d77\u6765\u7684<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u5173\u4e8e sql \u5177\u4f53\u5de5\u4f5c\u539f\u7406\u53ef\u4ee5\u53c2\u8003&nbsp;<a href=\"https:\/\/zhuanlan.zhihu.com\/p\/157265381\">https:\/\/zhuanlan.zhihu.com\/p\/157265381<\/a>\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-51f7ae7af7dbff545bed0791ab56e0e9_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>3<\/p>\n\n\n\n<p>\u4f46\u662f\u5f88\u591a\u521a\u63a5\u89e6 flink sql \u7684\u8bfb\u8005\u770b\u5b8c\u8fd9\u7bc7\u6587\u7ae0\uff0c\u4f1a\u611f\u89c9\u5230\u8fd8\u6ca1\u51c6\u5907\u597d\u5c31\u6765\u4e86\u8fd9\u4e48\u5927\u4e00\u5806\u5bc6\u96c6\u7684\u4fe1\u606f\u3002\u90a3\u4e48<\/p>\n\n\n\n<ol>\n<li>\u6211\u5230\u5e95\u5e94\u8be5\u4ece\u54ea\u91cc\u770b\u8d77\u5462\uff1f<br><\/li>\n\n\n\n<li>\u80fd\u7406\u89e3 sql \u4f1a\u6620\u5c04\u5230\u5177\u4f53\u7684\u7b97\u5b50\u6267\u884c\u3002\u4f46\u662f\u5b83\u5177\u4f53\u662f\u600e\u4e48\u5bf9\u5e94\u5230\u5177\u4f53\u7684\u7b97\u5b50\u4e0a\u7684\u5462\uff1f<br><\/li>\n<\/ol>\n\n\n\n<p>\u535a\u4e3b\u4f1a\u4ece\u4ee5\u4e0b\u4e24\u4e2a\u89d2\u5ea6\u53bb\u5e2e\u5927\u5bb6\u7406\u6e05\u695a\u6574\u4e2a\u6d41\u7a0b\u3002<\/p>\n\n\n\n<ol>\n<li>\u5148\u629b\u5f00 flink sql\u3001datastream \u63d0\u4f9b\u7684\u80fd\u529b\u6765\u8bf4\uff0c\u5982\u679c\u4f60\u5728\u81ea\u5df1\u7684\u4e00\u4e2a\u7a0b\u5e8f\u4e2d\u53bb\u63a5\u5165\u4e00\u4e2a\u6570\u636e\u6e90\uff0c\u4f60\u6700\u5173\u5fc3\u7684\u662f\u54ea\u4e9b\u7ec4\u4ef6\uff1f<\/li>\n<\/ol>\n\n\n\n<p>\u7b54\uff1a\u6d88\u8d39\u4e00\u4e2a\u6570\u636e\u6e90\u6700\u91cd\u8981\u7684\u5c31\u662f connector\uff08\u8d1f\u8d23\u94fe\u63a5\u5916\u90e8\u7ec4\u4ef6\uff0c\u6d88\u8d39\u6570\u636e\uff09 + serde\uff08\u8d1f\u8d23\u5e8f\u5217\u5316\u6210 flink \u8ba4\u8bc6\u7684\u53d8\u91cf\u5f62\u5f0f\uff09\u3002<\/p>\n\n\n\n<ol>\n<li>\u7ed3\u5408\u7b2c\u4e00\u4e2a\u95ee\u9898 + \u4e00\u6bb5\u7b80\u5355\u7684 flink sql \u4ee3\u7801\u6765\u770b\u770b flink \u662f\u600e\u4e48\u53bb\u505a\u8fd9\u4ef6\u4e8b\u60c5\u7684\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u4ee3\u7801\uff08\u57fa\u4e8e 1.13.1\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class KafkaSourceTest {\n\n    public static void main(String&#91;] args) throws Exception {\n\n        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());\n\n        env.setParallelism(1);\n\n        EnvironmentSettings settings = EnvironmentSettings\n                .newInstance()\n                .useBlinkPlanner()\n                .inStreamingMode().build();\n\n        StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings);\n\n        tEnv.executeSql(\n                \"CREATE TABLE KafkaSourceTable (\\n\"\n                        + \"  `f0` STRING,\\n\"\n                        + \"  `f1` STRING\\n\"\n                        + \") WITH (\\n\"\n                        + \"  'connector' = 'kafka',\\n\"\n                        + \"  'topic' = 'topic',\\n\"\n                        + \"  'properties.bootstrap.servers' = 'localhost:9092',\\n\"\n                        + \"  'properties.group.id' = 'testGroup',\\n\"\n                        + \"  'format' = 'json'\\n\"\n                        + \")\"\n        );\n\n        Table t = tEnv.sqlQuery(\"SELECT * FROM KafkaSourceTable\");\n\n        tEnv.toAppendStream(t, Row.class).print();\n\n        env.execute();\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u6bb5\u4ee3\u7801\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u521b\u5efa\u4e00\u4e2a\u6570\u636e\u6e90\u8868\u4e4b\u540e select \u6570\u636e print\u3002<\/p>\n\n\n\n<p>\u901a\u8fc7\u4e0a\u9762\u8fd9\u6bb5 sql \u6620\u5c04\u51fa\u7684 transformations \u4e2d\u53d1\u73b0\uff0c\u5176\u5b9e flink \u4e2d\u6700\u5173\u952e\u53d8\u91cf\u7684\u4e5f\u5c31\u662f\u6211\u4eec\u521a\u521a\u63d0\u51fa\u7684\u7b2c\u4e00\u4e2a\u95ee\u9898\u4e2d\u7684\u90a3\u4e24\u70b9\uff1a<\/p>\n\n\n\n<ol>\n<li><strong>sql source connector<\/strong>&nbsp;\u662f&nbsp;<code>FlinkKafkaConsumer<\/code><\/li>\n\n\n\n<li><strong>sql source format<\/strong>&nbsp;\u662f&nbsp;<code>JsonRowDataDeserializationSchema<\/code><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-13828a0c99b62c6741b9ae56923f39cb_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>19<\/p>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u5c31\u53ef\u4ee5\u4ece\u4e0b\u9762\u8fd9\u4e09\u4e2a\u65b9\u5411\uff08\u591a\u51fa\u6765\u7684\u4e00\u4e2a\u662f\u914d\u7f6e\u4fe1\u606f\uff09\u7684\u95ee\u9898\u53bb\u4e86\u89e3\u5177\u4f53\u662f\u600e\u4e48\u5bf9\u5e94\u5230\u5177\u4f53\u7684\u7b97\u5b50\u4e0a\u7684\u3002<\/p>\n\n\n\n<ol>\n<li><strong>sql source connector<\/strong>\uff1a\u7528\u6237\u6307\u5b9a\u4e86&nbsp;<code>connector = kafka<\/code>\uff0cflink \u662f\u600e\u4e48\u81ea\u52a8\u6620\u5c04\u5230&nbsp;<code>FlinkKafkaConsumer<\/code>&nbsp;\u7684\uff1f<\/li>\n\n\n\n<li><strong>sql source format<\/strong>\uff1a\u7528\u6237\u6307\u5b9a\u4e86&nbsp;<code>format = json<\/code>\uff0c\u5b57\u6bb5\u4fe1\u606f\uff0cflink \u662f\u600e\u4e48\u81ea\u52a8\u6620\u5c04\u5230&nbsp;<code>JsonRowDataDeserializationSchema<\/code>\uff0c\u4ee5\u53ca\u5b57\u6bb5\u89e3\u6790\u7684\uff1f<\/li>\n\n\n\n<li><strong>sql source properties<\/strong>\uff1aflink \u662f\u600e\u4e48\u81ea\u52a8\u5c06\u914d\u7f6e\u52a0\u8f7d\u5230&nbsp;<code>FlinkKafkaConsumer<\/code>&nbsp;\u4e2d\u7684\uff1f<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"51connector_%E6%80%8E%E6%A0%B7%E6%98%A0%E5%B0%84%E5%88%B0%E5%85%B7%E4%BD%93%E7%AE%97%E5%AD%90%EF%BC%9F\"><\/span>5.1.connector \u600e\u6837\u6620\u5c04\u5230\u5177\u4f53\u7b97\u5b50\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u5f15\u7528\u5b98\u7f51\u56fe\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-6de17db7934b0704a4ab3c8a22ce458e_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>22<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>Notes\uff1a\u5176\u4e2d&nbsp;<code>LookupTableSource<\/code>&nbsp;\u4e3a\u6570\u636e\u7ef4\u8868\u3002<\/p>\n<\/blockquote>\n\n\n\n<p>\u5148\u8bf4\u4e0b\u7ed3\u8bba\uff0c\u518d\u8ddf\u4e00\u904d\u6e90\u7801\u3002<\/p>\n\n\n\n<p>\u7ed3\u8bba\uff1a<\/p>\n\n\n\n<ol>\n<li><strong>MetaData<\/strong>\uff1a\u5c06 sql create source table \u8f6c\u5316\u4e3a\u5b9e\u9645\u7684&nbsp;<code>CatalogTable<\/code>\u3001\u7ffb\u8bd1\u4e3a RelNode<\/li>\n\n\n\n<li><strong>Planning<\/strong>\uff1a\u521b\u5efa RelNode \u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528 SPI \u5c06\u6240\u6709\u7684 source\uff08<code>DynamicTableSourceFactory<\/code>\uff09\\sink\uff08<code>DynamicTableSinkFactory<\/code>\uff09 \u5de5\u5382\u52a8\u6001\u52a0\u8f7d\uff0c\u83b7\u53d6\u5230 connector = kafka\uff0c\u7136\u540e\u4ece\u6240\u6709 source \u5de5\u5382\u4e2d\u8fc7\u6ee4\u51fa\u540d\u79f0\u4e3a kafka + \u7ee7\u627f\u81ea&nbsp;<code>DynamicTableSourceFactory.class<\/code>&nbsp;\u7684\u5de5\u5382\u7c7b&nbsp;<code>KafkaDynamicTableFactory<\/code>\uff0c\u4f7f\u7528&nbsp;<code>KafkaDynamicTableFactory<\/code>&nbsp;\u521b\u5efa\u51fa&nbsp;<code>KafkaDynamicSource<\/code><\/li>\n\n\n\n<li><strong>Runtime<\/strong>\uff1a<code>KafkaDynamicSource<\/code>&nbsp;\u521b\u5efa\u51fa&nbsp;<code>FlinkKafkaConsumer<\/code>\uff0c\u8d1f\u8d23 flink \u7a0b\u5e8f\u5b9e\u9645\u8fd0\u884c\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u6e90\u7801\uff1a<\/p>\n\n\n\n<p>debug \u4ee3\u7801\uff0c\u65e2\u7136\u521b\u5efa\u7684\u662f&nbsp;<code>FlinkKafkaConsumer<\/code>\uff0c\u90a3\u6211\u4eec\u5c31\u5c06\u65ad\u70b9\u6253\u5728&nbsp;<code>FlinkKafkaConsumer<\/code>&nbsp;\u7684\u6784\u9020\u51fd\u6570\u4e2d\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-2eb24ffb924980f47050f033ef7f4656_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>5<\/p>\n\n\n\n<p>\u5982\u56fe\u53ef\u4ee5\u53d1\u73b0\u5f53 debug \u5230\u5f53\u524d\u65ad\u70b9\u65f6\uff0c\u5df2\u7ecf\u8fdb\u5165&nbsp;<code>FlinkKafkaConsumer<\/code>&nbsp;source \u7684\u521b\u5efa\u9636\u6bb5\u4e86\uff0c\u6267\u884c\u5230\u8fd9\u91cc\u7684\u65f6\u5019\u5df2\u7ecf\u662f\u5b8c\u6210\u4e86 sql connector \u548c\u5177\u4f53\u5b9e\u9645 connector \u7684\u6620\u5c04\u4e86\u3002\u90a3\u4e48 connector \u600e\u6837\u6620\u5c04\u5230\u5177\u4f53\u7b97\u5b50\u7684\u8fc7\u7a0b\u5462\uff1f<\/p>\n\n\n\n<p>\u6211\u4eec\u5f80\u524d\u56de\u6eaf\u4e00\u4e0b\uff0c\u5b9a\u4f4d\u5230&nbsp;<code>CatalogSourceTable<\/code>&nbsp;\u4e2d\u7684 82 \u884c\uff08\u6e90\u7801\u57fa\u4e8e 1.13.1\uff09\uff0c\u53d1\u73b0 tableSource \u5df2\u7ecf\u662f&nbsp;<code>KafkaDynamicSource<\/code>\uff0c\u56e0\u6b64\u53ef\u4ee5\u786e\u5b9a\u5c31\u662f\u8fd9\u4e00\u884c\u4ee3\u7801\u5c06 connector = kafka \u6620\u5c04\u5230&nbsp;<code>FlinkKafkaConsumer<\/code>&nbsp;\u7684\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-819431f99a5148ffa779917a924c0d12_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>6<\/p>\n\n\n\n<p>\u53ef\u4ee5\u53d1\u73b0\u8fd9\u6bb5\u4ee3\u7801\u5c06\u5305\u542b\u4e86\u6240\u6709 sql create source table \u4e2d\u4fe1\u606f\u7684 catalogTable \u53d8\u91cf\u4f20\u5165\u4e86\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-5fe8fe1334f1a21fe95feb0a302b41c0_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>7<\/p>\n\n\n\n<p>\u8fdb\u5165\u8fd9\u4e2a\u65b9\u6cd5\u540e\uff0c\u53ef\u4ee5\u770b\u5230\u662f\u4f7f\u7528\u4e86&nbsp;<code>FactoryUtil<\/code>&nbsp;\u521b\u5efa\u4e86&nbsp;<code>DynamicTableSource<\/code>\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-0e5e65a3a199dfb09fec4567dd9b1bb8_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>8<\/p>\n\n\n\n<p>\u8fdb\u5165&nbsp;<code>FactoryUtil.createTableSource<\/code>&nbsp;\u540e\u53ef\u4ee5\u770b\u5230\uff0c\u5c31\u662f\u6700\u91cd\u8981\u7684\u4e24\u6b65\u64cd\u4f5c\u3002<\/p>\n\n\n\n<ol>\n<li>\u5148\u83b7\u53d6 kafka \u5de5\u5382\u5bf9\u8c61\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528 kafka \u5de5\u5382\u5bf9\u8c61\u521b\u5efa\u51fa kafka source\u3002<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-846a5c36c486844b71383b97ecbc50b5_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>9<\/p>\n\n\n\n<p>\u8fdb\u5165&nbsp;<code>FactoryUtil.getDynamicTableFactory<\/code>&nbsp;\u540e\uff1a<\/p>\n\n\n\n<ol>\n<li>flink \u662f\u4f7f\u7528\u4e86 SPI \u673a\u5236\u52a8\u6001\uff08SPI \u673a\u5236\u5929\u7136\u63d2\u4ef6\u5316\uff09\u7684\u52a0\u8f7d\u5230\u4e86\u6240\u6709\u7ee7\u627f\u4e86&nbsp;<code>Factory<\/code>&nbsp;\u7684\u5de5\u5382\u5b9e\u4f8b\u3002\u901a\u8fc7\u622a\u56fe\u53ef\u4ee5\u770b\u5230\u6709\u597d\u591a source\\sink\\format Factory\u3002\u5173\u4e8e SPI \u53ef\u4ee5\u53c2\u8003&nbsp;<a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/www.jianshu.com\/p\/3a3edbcd8f24\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.jianshu.com\/p\/3a3edbcd8f24<\/a><\/li>\n\n\n\n<li>\u901a\u8fc7 connector = kafka +&nbsp;<code>DynamicTableSourceFactory.class<\/code>&nbsp;\u7684\u6807\u8bc6\u53bb\u8fc7\u6ee4\u51fa&nbsp;<code>KafkaDynamicTableFactory<\/code>\u3002<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-921aa3499d6bf7821594ee67feafa7c4_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-d592667a593120f300c9a1d4cf7a2231_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-809ee9a6b7d307d52a6018093bc5a64c_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u7136\u540e&nbsp;<code>KafkaDynamicTableFactory.createDynamicTableSource<\/code>&nbsp;\u53bb\u521b\u5efa\u5bf9\u5e94\u7684 source\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-0e04d8a223569e936c70ee52ded3692c_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>13<\/p>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230&nbsp;<code>KafkaDynamicTableFactory.createDynamicTableSource<\/code>&nbsp;\u4e2d\u8c03\u7528&nbsp;<code>KafkaDynamicTableFactory.createKafkaTableSource<\/code>&nbsp;\u6765\u521b\u5efa&nbsp;<code>KafkaDynamicSource<\/code>\u3002<\/p>\n\n\n\n<p>\u57fa\u672c\u4e0a\u6574\u4e2a\u521b\u5efa Source \u7684\u6d41\u7a0b\u5c31\u7ed3\u675f\u4e86\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"52format_%E6%80%8E%E6%A0%B7%E6%98%A0%E5%B0%84%E5%88%B0%E5%85%B7%E4%BD%93_serde%EF%BC%9F\"><\/span>5.2.format \u600e\u6837\u6620\u5c04\u5230\u5177\u4f53 serde\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u7ed3\u8bba\uff1a<\/p>\n\n\n\n<ol>\n<li><strong>MetaData<\/strong>\uff1a\u548c connector \u90fd\u4e00\u6837<\/li>\n\n\n\n<li><strong>Planning<\/strong>\uff1aformat \u662f\u5728\u521b\u5efa RelNode \u7684\u8fc7\u7a0b\u4e2d\uff0c\u4f7f\u7528&nbsp;<code>KafkaDynamicTableFactory<\/code>&nbsp;\u521b\u5efa\u51fa&nbsp;<code>KafkaDynamicSource<\/code>&nbsp;\u65f6\uff0c\u901a\u8fc7 SPI \u53bb\u52a8\u6001\u8fc7\u6ee4\u51fa format = json \u5e76\u4e14\u7ee7\u627f\u81ea&nbsp;<code>DeserializationFormatFactory.class<\/code>&nbsp;\u7684 format \u5de5\u5382\u7c7b&nbsp;<code>JsonFormatFactory<\/code>\u3002<\/li>\n\n\n\n<li><strong>Runtime<\/strong>\uff1a<code>KafkaDynamicSource<\/code>&nbsp;\u521b\u5efa\u51fa&nbsp;<code>FlinkKafkaConsumer<\/code>&nbsp;\u65f6\uff0c\u5b9e\u4f8b\u5316 serde \u5373&nbsp;<code>JsonRowDataDeserializationSchema<\/code>\uff0c\u8d1f\u8d23 flink \u7a0b\u5e8f\u5b9e\u9645\u8fd0\u884c\u65f6\u7684\u53cd\u5e8f\u5217\u5316\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u6e90\u7801\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-b628bf3eb3bc63af3511e2f46604c1bf_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>15<\/p>\n\n\n\n<p><code>KafkaDynamicTableFactory.createDynamicTableSource<\/code>&nbsp;\u4e2d\u83b7\u53d6\u53cd\u5e8f\u5217\u5316 schema \u5b9a\u4e49\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-84a7cc446c36d5bb2a5e60c4f393c1c9_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-296f1a503dc7d841e864dbf8919f2269_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-6cab9670f44f082c3caec14b964b1af6_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>18<\/p>\n\n\n\n<ol>\n<li>flink \u662f\u4f7f\u7528\u4e86 SPI \u673a\u5236\u52a8\u6001\uff08SPI \u673a\u5236\u5929\u7136\u63d2\u4ef6\u5316\uff09\u7684\u52a0\u8f7d\u5230\u4e86\u6240\u6709\u7ee7\u627f\u4e86&nbsp;<code>Factory<\/code>&nbsp;\u7684 format \u5de5\u5382\u5b9e\u4f8b\u3002<\/li>\n\n\n\n<li>\u901a\u8fc7 format = json \u7684\u6807\u8bc6\u5e76\u4e14\u7ee7\u627f\u81ea&nbsp;<code>DeserializationFormatFactory.class<\/code>&nbsp;\u53bb\u8fc7\u6ee4\u51fa&nbsp;<code>JsonFormatFactory<\/code>\u3002<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-25cc74074cedddd3e4498ebb2c4f0412_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>20<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"53%E5%85%B6%E4%BB%96%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E6%80%8E%E4%B9%88%E5%8A%A0%E8%BD%BD%EF%BC%9F\"><\/span>5.3.\u5176\u4ed6\u914d\u7f6e\u5c5e\u6027\u600e\u4e48\u52a0\u8f7d\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u7ed3\u8bba\uff1a<\/p>\n\n\n\n<p>\u5728&nbsp;<code>KafkaDynamicTableFactory<\/code>&nbsp;\u521b\u5efa&nbsp;<code>KafkaDynamicTable<\/code>&nbsp;\u7684\u8fc7\u7a0b\u4e2d\u521d\u59cb\u5316\u3002<\/p>\n\n\n\n<p>\u6e90\u7801\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-373ec3ad0db8ab631d4f864b72406fbc_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>14<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-71e51b64524ff3a9ef5d714d9023ced5_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>21<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6%E6%80%BB%E7%BB%93%E4%B8%8E%E5%B1%95%E6%9C%9B%E7%AF%87\"><\/span>6.\u603b\u7ed3\u4e0e\u5c55\u671b\u7bc7<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u672c\u6587\u4f5c\u4e3a flink sql \u77e5\u5176\u7136\u7cfb\u5217\u7684\u7b2c\u4e00\u8282\uff0c\u57fa\u4e8e 1.13.1 \u7248\u672c flink \u4ecb\u7ecd\u4e86 flink sql \u7684 source\\sink\\format \u4ece sql \u53d8\u4e3a\u53ef\u6267\u884c\u4ee3\u7801\u7684\u539f\u7406\u3002\u5e26\u5927\u5bb6\u8fc7\u4e86\u4e00\u4e0b\u6e90\u7801\u3002\u5e0c\u671b\u53ef\u4ee5\u559c\u6b22\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1.\u5e8f\u7bc7-\u672c\u6587\u7ed3\u6784 \u672c\u6587\u4ece\u4ee5\u4e0b\u4e94\u4e2a\u5c0f\u8282\u4ecb\u7ecd flink sql source\\sink\\format&hellip; <a href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/%e3%80%90%e8%bf%90%e7%bb%b4%e5%b7%a5%e5%85%b7%e3%80%91flink-sql-%e5%ae%9e%e8%b7%b5-sourcesink-%e5%8e%9f%e7%90%86\/\" class=\"more-link read-more\" rel=\"bookmark\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">\u00a0\u3010\u8fd0\u7ef4\u5de5\u5177\u3011Flink SQL\u00a0\u5b9e\u8df5 &#8211; source\\sink \u539f\u7406<\/span><i class=\"fa fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[25],"views":1082,"_links":{"self":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/1311"}],"collection":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/comments?post=1311"}],"version-history":[{"count":1,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/1311\/revisions"}],"predecessor-version":[{"id":1312,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/1311\/revisions\/1312"}],"wp:attachment":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/media?parent=1311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/categories?post=1311"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/tags?post=1311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}