{"id":426876,"date":"2024-07-23T09:01:18","date_gmt":"2024-07-23T09:01:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=426876"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=426876","title":{"rendered":"<span>\u0412\u0441\u0451 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e DuckDB<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<ul>\n<li>\n<p><a href=\"#SQL\" rel=\"noopener noreferrer nofollow\">SQL<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Copy\" rel=\"noopener noreferrer nofollow\">Copy<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#PreparedStatements\" rel=\"noopener noreferrer nofollow\">Prepared Statements<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Functions\" rel=\"noopener noreferrer nofollow\">Functions<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Extensions\" rel=\"noopener noreferrer nofollow\">Extensions<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#PostgreSQLExtension\" rel=\"noopener noreferrer nofollow\">PostgreSQL Extension<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Parquet\" rel=\"noopener noreferrer nofollow\">Parquet<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#ParquetImport\" rel=\"noopener noreferrer nofollow\">Parquet Import<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ParquetExport\" rel=\"noopener noreferrer nofollow\">Parquet Export<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#BuenaVista\" rel=\"noopener noreferrer nofollow\">Buena Vista<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#Installation\" rel=\"noopener noreferrer nofollow\">Installation<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ClientAPIPython\" rel=\"noopener noreferrer nofollow\">Client API Python<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#Inmemory\" rel=\"noopener noreferrer nofollow\">In-memory<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Physicaldatabase\" rel=\"noopener noreferrer nofollow\">Physical database<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ResultConversion\" rel=\"noopener noreferrer nofollow\">Result Conversion<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#DataInput\" rel=\"noopener noreferrer nofollow\">Data Input<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%D0%B2JupyterLab\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 JupyterLab<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%D0%91%D0%94\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0411\u0414<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#json\" rel=\"noopener noreferrer nofollow\">.json<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#parquet\" rel=\"noopener noreferrer nofollow\">.parquet<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#csv\" rel=\"noopener noreferrer nofollow\">.csv<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Storage\" rel=\"noopener noreferrer nofollow\">Storage<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Information_schema\" rel=\"noopener noreferrer nofollow\">Information_schema<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#S3\" rel=\"noopener noreferrer nofollow\">S3<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0S3\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 S3<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BAS3%D0%B2DuckDB\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a S3 \u0432 DuckDB<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%D0%B2S3\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 S3<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A7%D1%82%D0%B5%D0%BD%D0%B8%D0%B5%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%D0%B8%D0%B7S3\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 S3<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Tips\" rel=\"noopener noreferrer nofollow\">Tips<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#UNION\" rel=\"noopener noreferrer nofollow\">UNION<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#JOIN\" rel=\"noopener noreferrer nofollow\">JOIN<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#DBeaver\" rel=\"noopener noreferrer nofollow\">DBeaver<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ExportImportDataBase\" rel=\"noopener noreferrer nofollow\">Export \/ Import DataBase<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3fc\/9b9\/297\/3fc9b92979d386f2c4b13dd09e254e8a.png\" width=\"1024\" height=\"1024\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3fc\/9b9\/297\/3fc9b92979d386f2c4b13dd09e254e8a.png\"\/><\/figure>\n<p>DuckDB\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e). \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (SQL) \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>DuckDB \u0434\u043e\u0440\u043e\u0441 \u0434\u043e <a href=\"https:\/\/duckdb.org\/2024\/06\/03\/announcing-duckdb-100.html\" rel=\"noopener noreferrer nofollow\">Stable-\u0432\u0435\u0440\u0441\u0438\u0438 1.0.0<\/a>. \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a DuckDB \u0434\u043e\u0440\u043e\u0441 \u0434\u043e 1.0.0, \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u043a\u0430\u043a \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430.<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0443\u0437\u043d\u0430\u043b \u043e \u0434\u0430\u043d\u043d\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u0438\u0437 \u0432\u0438\u0434\u0435\u043e <a href=\"https:\/\/youtu.be\/Z9c7YBZ2BHs?t=2166\" rel=\"noopener noreferrer nofollow\">\u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0413\u043e\u043b\u043e\u0432, \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u041c\u0430\u0440\u043a\u043e\u0432, \u0424\u0438\u043b\u043b\u0438\u043f \u0423\u0432\u0430\u0440\u043e\u0432: Big Data is Dead<\/a> \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 <a href=\"https:\/\/www.youtube.com\/@mezhdu_skobok\" rel=\"noopener noreferrer nofollow\">{ \u043c\u0435\u0436\u0434\u0443 \u0441\u043a\u043e\u0431\u043e\u043a }<\/a>.<\/p>\n<p>\u0418 \u043c\u0435\u043d\u044f \u043f\u043e\u043a\u043e\u0440\u0438\u043b \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u0410 \u043a\u043e\u0433\u0434\u0430 \u044f \u0443\u0437\u043d\u0430\u0432\u0430\u043b \u0435\u0433\u043e \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u043c\u043e\u0435\u043c\u0443 \u0441\u0447\u0430\u0441\u0442\u044c\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0435\u043c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0445\u043e\u0440\u043e\u0448 DuckDB \u0438 \u043a\u0430\u043a \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u043f\u043e\u043c\u043e\u0447\u044c.<\/p>\n<p> \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043f\u0440\u0430\u0432\u043a\u0438, \u0447\u0442\u043e \u0437\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u044b\u0435 \u0444\u0430\u043a\u0442\u044b.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u043d\u0430\u0448\u0435\u0439 \u0443\u0442\u043a\u043e\u0439:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u0430\u044f \u0411\u0414.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0411\u0414.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u0435\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 PostgreSQL.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u00abin\u2011process analytical database\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e (\u00abMIT License\u00bb).<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 (PostgreSQL, S3, HTTP(S), etc.).<\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u0431\u0443\u0434\u0443 \u0447\u0430\u0441\u0442\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u0442\u044c \u0432\u0430\u0441 \u043a <a href=\"https:\/\/duckdb.org\/docs\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 DuckDB<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.<\/p>\n<p><a class=\"anchor\" name=\"SQL\" id=\"SQL\"><\/a><\/p>\n<h3>SQL<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0431\u0449\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 <a href=\"https:\/\/duckdb.org\/docs\/sql\/introduction\" rel=\"noopener noreferrer nofollow\">introduction<\/a> DuckDB \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 PostgreSQL, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u00ab<em>\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439<\/em>\u00bb SQL. \u0412 DuckDB \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0441\u0432\u043e\u0438 \u043c\u0435\u0442\u043e\u0434\u044b, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u0430.<\/p>\n<p><a class=\"anchor\" name=\"Copy\" id=\"Copy\"><\/a><\/p>\n<h3>Copy<\/h3>\n<p>DuckDB \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u043e\u0449\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a <a href=\"https:\/\/duckdb.org\/docs\/sql\/statements\/copy\" rel=\"noopener noreferrer nofollow\">COPY<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0442\u0430\u043a\u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 \u0444\u0430\u0439\u043b\u044b \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p><a class=\"anchor\" name=\"PreparedStatements\" id=\"PreparedStatements\"><\/a><\/p>\n<h3>Prepared Statements<\/h3>\n<p>\u0412 DuckDB \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u043d\u0430\u044f <a href=\"https:\/\/duckdb.org\/docs\/sql\/query_syntax\/prepared_statements\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0430\u0441\u0442\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p><a class=\"anchor\" name=\"Functions\" id=\"Functions\"><\/a><\/p>\n<h3>Functions<\/h3>\n<p>\u0423 DuckDB \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c <a href=\"https:\/\/duckdb.org\/docs\/sql\/functions\/overview\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a> \u0438 \u0442\u0430\u043a\u0436\u0435 \u0432 DuckDB \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u0442\u0430\u043c\u0438, \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438, \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435.<\/p>\n<p><a class=\"anchor\" name=\"Extensions\" id=\"Extensions\"><\/a><\/p>\n<h3>Extensions<\/h3>\n<p>\u041a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u0435\u0435 DuckDB \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u043d\u0438\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e <a href=\"https:\/\/duckdb.org\/docs\/extensions\/overview\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"PostgreSQLExtension\" id=\"PostgreSQLExtension\"><\/a><\/p>\n<h4>PostgreSQL Extension<\/h4>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f <a href=\"https:\/\/duckdb.org\/docs\/extensions\/postgres\" rel=\"noopener noreferrer nofollow\">PostgreSQL Extension<\/a> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435 PostgreSQL (PostgreSQL, GreenPlum).<\/p>\n<p><a class=\"anchor\" name=\"Parquet\" id=\"Parquet\"><\/a><\/p>\n<h3>Parquet<\/h3>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a DuckDB \u0441\u0435\u0431\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 OLAP \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>.parquet<\/code>.<\/p>\n<p><a class=\"anchor\" name=\"ParquetImport\" id=\"ParquetImport\"><\/a><\/p>\n<h4>Parquet Import<\/h4>\n<p>DuckDB \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 <code>.parquet<\/code> \u0444\u0430\u0439\u043b. \u041e\u0431 \u044d\u0442\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e <a href=\"https:\/\/duckdb.org\/docs\/guides\/file_formats\/parquet_import.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"ParquetExport\" id=\"ParquetExport\"><\/a><\/p>\n<h4>Parquet Export<\/h4>\n<p>\u0422\u0430\u043a\u0436\u0435 DuckDB \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441\u0440\u0430\u0437\u0443 \u0432 <code>.parquet<\/code>. \u041e\u0431 \u044d\u0442\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e <a href=\"https:\/\/duckdb.org\/docs\/guides\/file_formats\/parquet_export.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"BuenaVista\" id=\"BuenaVista\"><\/a><\/p>\n<h3>Buena Vista<\/h3>\n<p>DuckDB \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u00abin\u2011process analytical database\u00bb, \u043d\u043e \u0432 <a href=\"https:\/\/github.com\/jwills\/buenavista\" rel=\"noopener noreferrer nofollow\">open source \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c &#171;\u043a\u043b\u0430\u0441\u0442\u0435\u0440&#187; \u0438\u0437 DuckDB \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0445\u043e\u0441\u0442\u0443.<\/p>\n<p><a class=\"anchor\" name=\"%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0\" id=\"\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\"><\/a><\/p>\n<h3>\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430<\/h3>\n<p>\u0421 \u0442\u0435\u043e\u0440\u0438\u0439 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0440\u0443\u0447\u043a\u0430\u043c\u0438.<\/p>\n<p><a class=\"anchor\" name=\"Installation\" id=\"Installation\"><\/a><\/p>\n<h4>Installation<\/h4>\n<p>DuckDB \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/duckdb.org\/docs\/installation\/index?version=stable&amp;environment=cli&amp;platform=macos&amp;download_method=package_manager\" rel=\"noopener noreferrer nofollow\">\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438<\/a>, \u043d\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Python API \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 <code>.jar<\/code> \u0434\u043b\u044f DBeaver.<\/p>\n<p><a class=\"anchor\" name=\"ClientAPIPython\" id=\"ClientAPIPython\"><\/a><\/p>\n<h4>Client API Python<\/h4>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a DuckDB \u00abin\u2011process analytical database\u00bb \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0440\u0430\u0441\u0447\u0451\u0442\u044b, \u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a \u043d\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 DuckDB.<\/p>\n<p><a class=\"anchor\" name=\"Inmemory\" id=\"Inmemory\"><\/a><\/p>\n<h3>In-memory<\/h3>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0440\u0430\u0441\u0447\u0451\u0442\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430.<\/p>\n<pre><code class=\"python\">import duckdb  cursor = duckdb.connect() print(cursor.execute('SELECT 42').fetchall())<\/code><\/pre>\n<p><a class=\"anchor\" name=\"Physicaldatabase\" id=\"Physicaldatabase\"><\/a><\/p>\n<h3>Physical database<\/h3>\n<p>\u041f\u0440\u0438 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f. \u041f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u043c. \u0410 \u0435\u0441\u043b\u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u0411\u0414, \u0442\u043e \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0443 \u0411\u0414 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u041e\u043d\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0432 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0435\u0451 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c &#171;<em>\u044d\u043a\u0441\u0435\u043b\u044c\u043a\u0438<\/em>&#171;, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u0411\u0414.<\/p>\n<pre><code class=\"python\">import duckdb  # create a connection to a file called 'demo_duckdb.db' cursor = duckdb.connect('demo_duckdb.duckdb') print(cursor.execute('SELECT 42').fetchall()) cursor.close()<\/code><\/pre>\n<p><a class=\"anchor\" name=\"ResultConversion\" id=\"ResultConversion\"><\/a><\/p>\n<h3>Result Conversion<\/h3>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0432\u0430\u0441 \u0441\u043f\u043e\u0441\u043e\u0431\u0435:<\/p>\n<pre><code class=\"python\">import duckdb  duckdb.sql(\"SELECT 42\").fetchall()   # Python objects duckdb.sql(\"SELECT 42\").df()         # Pandas DataFrame duckdb.sql(\"SELECT 42\").pl()         # Polars DataFrame duckdb.sql(\"SELECT 42\").arrow()      # Arrow Table duckdb.sql(\"SELECT 42\").fetchnumpy() # NumPy Arrays<\/code><\/pre>\n<p><a class=\"anchor\" name=\"DataInput\" id=\"DataInput\"><\/a><\/p>\n<h4>Data Input<\/h4>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 <code>.py<\/code> \u0444\u0430\u0439\u043b\u0430\u0445, \u043d\u043e \u0442\u0430\u043c \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/jupyterlab.readthedocs.io\/en\/stable\/\" rel=\"noopener noreferrer nofollow\">JupyterLab<\/a>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Docker \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432 \u043a\u043e\u0440\u043d\u0435 <a href=\"https:\/\/github.com\/k0rsakov\/all_about_DuckDB\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/a> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">docker-compose up -d<\/code><\/pre>\n<p>\u0418 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"http:\/\/localhost:8888\/\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost:8888\/<\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><a class=\"anchor\" name=\"%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%D0%B2JupyterLab\" id=\"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0432JupyterLab\"><\/a><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 JupyterLab<\/h3>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 DuckDB \u0432\u043d\u0443\u0442\u0440\u044c <a href=\"https:\/\/jupyterlab.readthedocs.io\/en\/stable\/\" rel=\"noopener noreferrer nofollow\">JupyterLab<\/a> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0438\u043b\u0438 \u0432 \u00ab\u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435\u00bb:<\/p>\n<pre><code class=\"bash\">pip install duckdb==1.0.0<\/code><\/pre>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%D0%91%D0%94\" id=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u044f\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439\u0411\u0414\"><\/a><\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0411\u0414<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430 \u043a \u0411\u0414 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0439 \u0411\u0414 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<pre><code class=\"python\">import duckdb  # create a connection to a file called 'demo_duckdb.db' con = duckdb.connect('demo_duckdb.duckdb')<\/code><\/pre>\n<p>\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430 \u043a \u0411\u0414:<\/p>\n<pre><code class=\"python\">con.close()<\/code><\/pre>\n<p><a class=\"anchor\" name=\"json\" id=\"json\"><\/a><\/p>\n<h3>.json<\/h3>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/duckdb.org\/docs\/data\/json\/overview.html\" rel=\"noopener noreferrer nofollow\">JSON Loading<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/duckdb.org\/docs\/extensions\/json.html\" rel=\"noopener noreferrer nofollow\">JSON extensions<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 <code>glossary.json<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c:<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     SELECT * FROM read_json(\"glossary.json\")     \"\"\" ).df()<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/de5\/ef6\/343\/de5ef6343ab56152b1e9403e2f6db3fb.png\" width=\"638\" height=\"148\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/de5\/ef6\/343\/de5ef6343ab56152b1e9403e2f6db3fb.png\"\/><\/figure>\n<p> \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u043b\u044e\u0447\u0443:<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     SELECT glossary.GlossDiv.GlossList.GlossEntry.ID FROM read_json(\"glossary.json\")     \"\"\" ).df()<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/65e\/5c4\/d01\/65e5c4d015c45bbfcca563a77ac5389a.png\" width=\"172\" height=\"124\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/65e\/5c4\/d01\/65e5c4d015c45bbfcca563a77ac5389a.png\"\/><\/figure>\n<p>\u0418 \u0442\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb \u0432\u0435\u0441\u044c <code>.json<\/code><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <code>.json<\/code> \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c url (\u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, S3, etc):<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     SELECT * FROM read_json('https:\/\/support.oneskyapp.com\/hc\/en-us\/article_attachments\/202761627')     \"\"\" ).df()<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/52e\/89e\/170\/52e89e170abb600b102ed4ba71df6977.png\" width=\"374\" height=\"144\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/52e\/89e\/170\/52e89e170abb600b102ed4ba71df6977.png\"\/><\/figure>\n<p><a class=\"anchor\" name=\"parquet\" id=\"parquet\"><\/a><\/p>\n<h3>.parquet<\/h3>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/duckdb.org\/docs\/data\/parquet\/overview\" rel=\"noopener noreferrer nofollow\">Reading and Writing Parquet Files<\/a>. \u041a\u0430\u043a \u043c\u044b \u0447\u0438\u0442\u0430\u043b\u0438 \u043d\u0430\u0448 <code>.json<\/code> \u0444\u0430\u0439\u043b, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438 <code>.parquet<\/code>.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">con.sql(     \"\"\"     SELECT * FROM read_parquet('https:\/\/d37ci6vzurychx.cloudfront.net\/trip-data\/yellow_tripdata_2024-01.parquet')     \"\"\" ).df()<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/10c\/134\/9e1\/10c1349e11281e569cd15e72020e3876.png\" width=\"2692\" height=\"818\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/10c\/134\/9e1\/10c1349e11281e569cd15e72020e3876.png\"\/><\/figure>\n<p><a class=\"anchor\" name=\"csv\" id=\"csv\"><\/a><\/p>\n<h3>.csv<\/h3>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 <a href=\"https:\/\/duckdb.org\/docs\/data\/csv\/overview\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439<\/a> \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 <code>.csv<\/code>.<\/p>\n<p><a class=\"anchor\" name=\"Storage\" id=\"Storage\"><\/a><\/p>\n<h4>Storage<\/h4>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u0412\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 DBeaver. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 API Python, \u0442\u043e \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c SQL-\u043a\u043e\u0434 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u043a \u0432\u0430\u0448\u0435\u0439 \u0411\u0414.<br \/> \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     &lt;your SQL-query>     \"\"\" )<\/code><\/pre>\n<hr\/>\n<p>\u041c\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0438\u0441\u044c \u043a \u043d\u0430\u043c \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0441\u0430\u043c\u0438\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c DuckDB, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043a\u0440\u0443\u0442\u044b\u043c\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0440\u0430\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0444\u0430\u0439\u043b\u0438\u043a \u0441 \u043f\u043e\u0435\u0437\u0434\u043a\u0430\u043c\u0438 \u0442\u0430\u043a\u0441\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<pre><code class=\"sql\">CREATE TABLE yellow_tripdata_2024_01 SELECT * FROM read_parquet('https:\/\/d37ci6vzurychx.cloudfront.net\/trip-data\/yellow_tripdata_2024-01.parquet')<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443 \u043d\u0430\u0441 \u0437\u0430\u043d\u044f\u043b\u043e 5.77 \u0441\u0435\u043a. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0448\u043b\u0430 \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043a\u0430\u0447\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0442\u043e \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u043d\u0430\u0448\u0443 \u0411\u0414 \u0437\u0430\u0439\u043c\u0451\u0442 1.27 \u0441\u0435\u043a.<\/p>\n<p>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u043d\u0430\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<pre><code class=\"sql\">SELECT COUNT(*) FROM yellow_tripdata_2024_01<\/code><\/pre>\n<p>\u0418 \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043c\u0435\u043d\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0435 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u2013 \u043c\u0435\u043d\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"sql\">SELECT      tpep_pickup_datetime::date AS date_,      SUM(total_amount) AS sum_,     COUNT(*) AS count_,     SUM(total_amount) \/ COUNT(*) AS avg_  FROM      yellow_tripdata_2024_01 WHERE     tpep_pickup_datetime BETWEEN '2024-01-01' AND '2024-01-31' GROUP BY 1 ORDER BY 1<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c DuckDB \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p><a class=\"anchor\" name=\"Information_schema\" id=\"Information_schema\"><\/a><\/p>\n<h4>Information_schema<\/h4>\n<p>\u0412\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u043e <code>information_schema<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e <a href=\"https:\/\/duckdb.org\/docs\/sql\/meta\/information_schema\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0412 DuckDB \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 <code>information_schema<\/code> \u043f\u043e SQL-\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u0411\u0414.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u0432 \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<pre><code class=\"sql\">SELECT * FROM information_schema.columns WHERE table_name = 'yellow_tripdata_2024_01'<\/code><\/pre>\n<p>\u0418 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c 45 \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/p>\n<p><a class=\"anchor\" name=\"S3\" id=\"S3\"><\/a><\/p>\n<h4>S3<\/h4>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab<a href=\"https:\/\/habr.com\/ru\/articles\/827052\/\" rel=\"noopener noreferrer nofollow\">\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f\u00a0data engineer S3<\/a>\u00bb \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 S3 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432. \u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 DuckDB \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 S3.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432 \u043d\u0430\u0448 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <code>docker-compose.yml<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441 <code>minio<\/code> \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>minio<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>docker-compose up -d<\/code>.<\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<p><a class=\"anchor\" name=\"%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0S3\" id=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430S3\"><\/a><\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 S3<\/h3>\n<p>\u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b DuckDB \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <strong>access key<\/strong> \u0438 <strong>secret key<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0430\u043a\u0435\u0442. \u042f \u0441\u043e\u0437\u0434\u0430\u043c \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043f\u0440\u043e\u0449\u0435. \u041d\u043e \u0430 \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Python, \u0442\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab<a href=\"https:\/\/habr.com\/ru\/articles\/827052\/\" rel=\"noopener noreferrer nofollow\">\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f\u00a0data engineer S3<\/a>\u00bb \u043e\u043f\u0438\u0441\u0430\u043d \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. <strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 S3 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u0432 Docker, \u0442\u043e \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c <code>s3_endpoint<\/code> \u043a\u0430\u043a <code>minio:9000<\/code>. \u0410 \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 DBeaver, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c <code>localhost:9000<\/code> \u0432 <code>s3_endpoint<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BAS3%D0%B2DuckDB\" id=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043aS3\u0432DuckDB\"><\/a><\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a S3 \u0432 DuckDB<\/h3>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<br \/> <strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043a\u0430\u0436\u0443 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c. \u041d\u043e \u0438\u0437-\u0437\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c S3 \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c. <a href=\"https:\/\/duckdb.org\/docs\/configuration\/overview.html\" rel=\"noopener noreferrer nofollow\">\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u0440\u043e \u0441\u0442\u0430\u0440\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/a>; <a href=\"https:\/\/duckdb.org\/docs\/extensions\/httpfs\/s3api.html\" rel=\"noopener noreferrer nofollow\">\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u0440\u043e \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/a>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a S3 \u0447\u0435\u0440\u0435\u0437 DuckDB \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">INSTALL httpfs; LOAD httpfs; SET s3_url_style = 'path'; SET s3_endpoint = 'localhost:9000'; SET s3_access_key_id = 'rxZaCuukKWeuN4oF08mX'; SET s3_secret_access_key = 'yWJYVFkVxGxuIwDyD1hxepSrO86E816nVkONtgAf'; SET s3_use_ssl = FALSE;<\/code><\/pre>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%D0%B2S3\" id=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u0434\u0430\u043d\u043d\u044b\u0445\u0432S3\"><\/a><\/p>\n<h4>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 S3<\/h4>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043d\u0430\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>yellow_tripdata_2024_01<\/code> \u0432 S3. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"python\">COPY (   SELECT     *   FROM     main.yellow_tripdata_2024_01 ) TO 's3:\/\/test-duckdb\/yellow_tripdata_2024_01.gzip.parquet'<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0447\u0442\u043e \u043d\u0430\u0448 \u0444\u0430\u0439\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0441\u044f \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c:<\/p>\n<pre><code class=\"python\">SELECT count(*) FROM 's3:\/\/test-duckdb\/yellow_tripdata_2024_01.gzip.parquet'<\/code><\/pre>\n<p>\u0418 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a, \u0447\u0442\u043e \u0438 \u0432 <code>yellow_tripdata_2024_01<\/code>.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 DuckDB \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>yellow_tripdata_2024_01<\/code> \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e \u0434\u043d\u044f\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"sql\">COPY (     SELECT *, tpep_pickup_datetime::date AS tpep_pickup_datetime_date FROM yellow_tripdata_2024_01 WHERE tpep_pickup_datetime BETWEEN '2024-01-01' AND '2024-01-31' )     TO 's3:\/\/test-duckdb\/yellow_tripdata_partition' (   FORMAT PARQUET,   COMPRESSION gzip,   PARTITION_BY (tpep_pickup_datetime_date),   OVERWRITE_OR_IGNORE,   FILENAME_PATTERN \"file_{i}\" );<\/code><\/pre>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 <code>file_{uuid}<\/code>, \u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0432 \u0432\u0430\u0448\u0443 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b, \u0441 \u043d\u043e\u0432\u044b\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c <code>uuid<\/code>. \u0410 \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435 \u043c\u0430\u0441\u043a\u0443 <code>file_{i}<\/code>, \u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0432 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0440\u0443\u0442\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f DuckDB \u2013 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0430\u0441\u043a\u0430\u043c\u0438. \u041c\u044b \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u043d\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u043c\u0435\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 S3:<\/p>\n<pre><code>test-duckdb\/yellow_tripdata_partition\/tpep_pickup_datetime_date=2024-01-01\/file_0.parquet test-duckdb\/yellow_tripdata_partition\/tpep_pickup_datetime_date=2024-01-02\/file_0.parquet ...<\/code><\/pre>\n<p>\u0418 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0437\u0432\u0435\u0437\u0434\u044b <code>*<\/code>.<\/p>\n<p><a class=\"anchor\" name=\"%D0%A7%D1%82%D0%B5%D0%BD%D0%B8%D0%B5%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%D0%B8%D0%B7S3\" id=\"\u0427\u0442\u0435\u043d\u0438\u0435\u0434\u0430\u043d\u043d\u044b\u0445\u0438\u0437S3\"><\/a><\/p>\n<h3>\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 S3<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"sql\">SELECT count(*) FROM 's3:\/\/test-duckdb\/yellow_tripdata_partition\/*\/*.parquet' <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u0448\u0438\u0445 \u0437\u0432\u0451\u0437\u0434 \u043c\u044b \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0432 \u043a\u0430\u043a\u0438\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0437\u0431\u0438\u0442\u044b. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u044b \u043c\u0430\u0441\u043a\u0438\u0440\u0443\u0435\u043c \u0435\u0451. \u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u0442\u043e \u043c\u044b \u0435\u0433\u043e \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u043c\u0430\u0441\u043a\u0430. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430: <code>s3:\/\/test-duckdb\/*-foo\/*\/*.parquet<\/code><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"sql\">SELECT count(*) FROM 's3:\/\/test-duckdb\/yellow_tripdata_partition\/*\/*.parquet' WHERE tpep_pickup_datetime_date = '2024-01-10' <\/code><\/pre>\n<p>\u0422\u043e \u043c\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0437\u0430 <code>2024-01-10<\/code> (95&#8217;000).<\/p>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>Query Profiling<\/code>, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:<br \/> \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0438 \u0432\u044b\u0434\u0430\u043b \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/46a\/371\/a0b\/46a371a0b4af7eca2d0cf757ea5ae966.png\" width=\"2284\" height=\"1978\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/46a\/371\/a0b\/46a371a0b4af7eca2d0cf757ea5ae966.png\"\/><\/figure>\n<p><a class=\"anchor\" name=\"Tips\" id=\"Tips\"><\/a><\/p>\n<h4>Tips<\/h4>\n<p>\u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0444\u0438\u0448\u043a\u0438 \u0438 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e DuckDB, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0442\u0435\u043c\u0443.<\/p>\n<p><a class=\"anchor\" name=\"UNION\" id=\"UNION\"><\/a><\/p>\n<h3>UNION<\/h3>\n<p>\u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438\u00a0\u2014 \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432 DuckDB \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043a\u0440\u0443\u0442\u0430\u044f \u0444\u0438\u0448\u043a\u0430 \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u044d\u0442\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"sql\">COPY ( SELECT 1 AS id, 'Anna' AS first_name, 'Petrova' AS last_name ) TO 's3:\/\/test-duckdb\/users\/1-model\/0.gzip.parquet';  COPY ( SELECT 2 AS id, 'Igor' AS first_name, 'Ivanov' AS last_name, '2001-01-01'::date AS bd  ) TO 's3:\/\/test-duckdb\/users\/2-model\/0.gzip.parquet';  COPY ( SELECT 3 AS id, 'Sergey' AS first_name, 'Shilov' AS last_name, '1999-01-01'::date AS bd, '2024-01-01'::date AS created_at ) TO 's3:\/\/test-duckdb\/users\/3-model\/0.gzip.parquet';<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"sql\">SELECT * FROM 's3:\/\/test-duckdb\/users\/*\/*.gzip.parquet'<\/code><\/pre>\n<p>\u0422\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>id<\/p>\n<\/th>\n<th>\n<p>first_name<\/p>\n<\/th>\n<th>\n<p>last_name<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">Anna<\/p>\n<\/td>\n<td>\n<p align=\"left\">Petrova<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">Igor<\/p>\n<\/td>\n<td>\n<p align=\"left\">Ivanov<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">Sergey<\/p>\n<\/td>\n<td>\n<p align=\"left\">Shilov<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043e\u043d \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0442\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u043d\u043e \u0430 \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"sql\">SELECT * FROM read_parquet( 's3:\/\/test-duckdb\/users\/*\/*.gzip.parquet', union_by_name = TRUE )<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>id<\/p>\n<\/th>\n<th>\n<p>first_name<\/p>\n<\/th>\n<th>\n<p>last_name<\/p>\n<\/th>\n<th>\n<p>bd<\/p>\n<\/th>\n<th>\n<p>created_at<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">Anna<\/p>\n<\/td>\n<td>\n<p align=\"left\">Petrova<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>[NULL]<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>[NULL]<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">Igor<\/p>\n<\/td>\n<td>\n<p align=\"left\">Ivanov<\/p>\n<\/td>\n<td>\n<p align=\"left\">2001-01-01<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>[NULL]<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">Sergey<\/p>\n<\/td>\n<td>\n<p align=\"left\">Shilov<\/p>\n<\/td>\n<td>\n<p align=\"left\">1999-01-01<\/p>\n<\/td>\n<td>\n<p align=\"left\">2024-01-01<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043c\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439, \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f \u043e\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><a class=\"anchor\" name=\"JOIN\" id=\"JOIN\"><\/a><\/p>\n<h3>JOIN<\/h3>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0445\u0430\u043a, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u0435\u043d: \u0432 DuckDB \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c <code>JOIN<\/code> \u043c\u0435\u0436\u0434\u0443 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u043e\u0439 DuckDB \u0438 \u043d\u0430 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0435. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0411\u0414 \u0438 S3.<\/p>\n<p>\u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043a\u043e\u0434 \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"sql\">CREATE TABLE users ( id int4, first_name varchar(50), last_name varchar(50), staff_project int4 );  INSERT INTO users SELECT 1 AS id, 'Anna' AS first_name, 'Petrova' AS last_name, 10 AS staff_project;  COPY ( SELECT 10 AS id_project, 'foo' AS name_project ) TO 's3:\/\/test-duckdb\/project\/9999-12-31\/0.gzip.parquet'<\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0438\u0436\u0435, \u0442\u043e \u043c\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0411\u0414 \u0438 <code>.parquet<\/code> \u0444\u0430\u0439\u043b\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 S3.<\/p>\n<pre><code class=\"sql\">SELECT * FROM users AS u JOIN read_parquet('s3:\/\/test-duckdb\/project\/9999-12-31\/0.gzip.parquet') AS p ON u.staff_project = p.id_project<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>JOIN<\/code>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>id<\/p>\n<\/th>\n<th>\n<p>first_name<\/p>\n<\/th>\n<th>\n<p>last_name<\/p>\n<\/th>\n<th>\n<p>staff_project<\/p>\n<\/th>\n<th>\n<p>id_project<\/p>\n<\/th>\n<th>\n<p>name_project<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">Anna<\/p>\n<\/td>\n<td>\n<p align=\"left\">Petrova<\/p>\n<\/td>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">foo<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a class=\"anchor\" name=\"DBeaver\" id=\"DBeaver\"><\/a><\/p>\n<h3>DBeaver<\/h3>\n<p>\u0421 DuckDB \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 Python, \u043d\u043e \u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445\u00a0\u2014 DBeaver.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a DuckDB \u043c\u044b \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 (\u0432\u0438\u043b\u043a\u0430) \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c DuckDB. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 DuckDB \u043d\u0435 \u0441\u043a\u0430\u0447\u0430\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 DBeaver \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442 \u0435\u0433\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u0441\u0430\u0439\u0442\u0430 <a href=\"https:\/\/central.sonatype.com\/artifact\/org.duckdb\/duckdb_jdbc\/overview\" rel=\"noopener noreferrer nofollow\">Maven<\/a> \u0438 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.<\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 DBeaver \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u0411\u0414 DuckDB. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0411\u0414 DuckDB, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0440\u0430\u043d\u0435\u0435 \u0447\u0435\u0440\u0435\u0437 Python \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0435\u0439 \u0443\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 DBeaver.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0411\u0414, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u00ab\u0421\u043e\u0437\u0434\u0430\u0442\u044c&#8230;\u00bb \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0411\u0414.<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0411\u0414 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0442\u043e \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b. \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430 \u043a \u0411\u0414.<\/p>\n<p><a class=\"anchor\" name=\"ExportImportDataBase\" id=\"ExportImportDataBase\"><\/a><\/p>\n<h3>Export \/ Import DataBase<\/h3>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b DuckDB \u043c\u043e\u0436\u0435\u0442 \u00ab\u0440\u0430\u0441\u043f\u0443\u0445\u0430\u0442\u044c\u00bb \u0438 \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u0411\u0414 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u043e\u043c \u0411\u0414.<\/p>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0432\u0430\u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0411\u0414 \u0432 JupyterLab \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     EXPORT DATABASE 'main' (         FORMAT PARQUET,         COMPRESSION ZSTD     );     \"\"\" )<\/code><\/pre>\n<p>\u0418 \u0440\u044f\u0434\u043e\u043c \u0441 \u0432\u0430\u0448\u0438\u043c \u00ab\u043d\u043e\u0443\u0442\u0431\u0443\u043a\u043e\u043c\u00bb \u0441\u043e\u0437\u0434\u0430\u0442\u0441\u044f \u043f\u0430\u043f\u043a\u0430 <code>main<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441\u0445\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0411\u0414 \u0447\u0435\u0440\u0435\u0437 DBeaver \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430, \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"sql\">EXPORT DATABASE '&lt;path_to_export>' (     FORMAT PARQUET,     COMPRESSION ZSTD );<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432.<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u0437 <a href=\"https:\/\/duckdb.org\/docs\/sql\/statements\/export\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>DuckDB\u00a0\u2014 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 Data Lake. \u0410 \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 DuckDB, \u0442\u043e \u0432\u0430\u0448\u0438 OLAP \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f. \u041d\u0443 \u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e SQL \u0432\u044b\u0443\u0447\u0438\u0442\u044c \u043b\u0435\u0433\u0447\u0435, \u0447\u0435\u043c Python, Pandas, PySpark, etc., \u0432\u0441\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 SQL \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u044f\/\u043c\u0435\u043d\u0442\u043e\u0440\u0441\u0442\u0432\u043e\/\u043c\u043e\u043a-\u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u0438, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u043e \u043c\u043d\u0435. \u0412\u0441\u0435 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043f\u043e\u00a0<a href=\"https:\/\/www.notion.so\/korsak0v\/Data-Engineer-185c62fdf79345eb9da9928356884ea0\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<\/p>\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\/829502\/\"> https:\/\/habr.com\/ru\/articles\/829502\/<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<ul>\n<li>\n<p><a href=\"#SQL\" rel=\"noopener noreferrer nofollow\">SQL<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Copy\" rel=\"noopener noreferrer nofollow\">Copy<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#PreparedStatements\" rel=\"noopener noreferrer nofollow\">Prepared Statements<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Functions\" rel=\"noopener noreferrer nofollow\">Functions<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Extensions\" rel=\"noopener noreferrer nofollow\">Extensions<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#PostgreSQLExtension\" rel=\"noopener noreferrer nofollow\">PostgreSQL Extension<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Parquet\" rel=\"noopener noreferrer nofollow\">Parquet<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#ParquetImport\" rel=\"noopener noreferrer nofollow\">Parquet Import<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ParquetExport\" rel=\"noopener noreferrer nofollow\">Parquet Export<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#BuenaVista\" rel=\"noopener noreferrer nofollow\">Buena Vista<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#Installation\" rel=\"noopener noreferrer nofollow\">Installation<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ClientAPIPython\" rel=\"noopener noreferrer nofollow\">Client API Python<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#Inmemory\" rel=\"noopener noreferrer nofollow\">In-memory<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Physicaldatabase\" rel=\"noopener noreferrer nofollow\">Physical database<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ResultConversion\" rel=\"noopener noreferrer nofollow\">Result Conversion<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#DataInput\" rel=\"noopener noreferrer nofollow\">Data Input<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%D0%B2JupyterLab\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 JupyterLab<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%D0%91%D0%94\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0411\u0414<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#json\" rel=\"noopener noreferrer nofollow\">.json<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#parquet\" rel=\"noopener noreferrer nofollow\">.parquet<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#csv\" rel=\"noopener noreferrer nofollow\">.csv<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Storage\" rel=\"noopener noreferrer nofollow\">Storage<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Information_schema\" rel=\"noopener noreferrer nofollow\">Information_schema<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#S3\" rel=\"noopener noreferrer nofollow\">S3<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0S3\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 S3<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BAS3%D0%B2DuckDB\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a S3 \u0432 DuckDB<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%D0%B2S3\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 S3<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A7%D1%82%D0%B5%D0%BD%D0%B8%D0%B5%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%D0%B8%D0%B7S3\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 S3<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Tips\" rel=\"noopener noreferrer nofollow\">Tips<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#UNION\" rel=\"noopener noreferrer nofollow\">UNION<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#JOIN\" rel=\"noopener noreferrer nofollow\">JOIN<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#DBeaver\" rel=\"noopener noreferrer nofollow\">DBeaver<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ExportImportDataBase\" rel=\"noopener noreferrer nofollow\">Export \/ Import DataBase<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><\/figure>\n<p>DuckDB\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e). \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (SQL) \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>DuckDB \u0434\u043e\u0440\u043e\u0441 \u0434\u043e <a href=\"https:\/\/duckdb.org\/2024\/06\/03\/announcing-duckdb-100.html\" rel=\"noopener noreferrer nofollow\">Stable-\u0432\u0435\u0440\u0441\u0438\u0438 1.0.0<\/a>. \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a DuckDB \u0434\u043e\u0440\u043e\u0441 \u0434\u043e 1.0.0, \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u043a\u0430\u043a \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430.<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0443\u0437\u043d\u0430\u043b \u043e \u0434\u0430\u043d\u043d\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u0438\u0437 \u0432\u0438\u0434\u0435\u043e <a href=\"https:\/\/youtu.be\/Z9c7YBZ2BHs?t=2166\" rel=\"noopener noreferrer nofollow\">\u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0413\u043e\u043b\u043e\u0432, \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u041c\u0430\u0440\u043a\u043e\u0432, \u0424\u0438\u043b\u043b\u0438\u043f \u0423\u0432\u0430\u0440\u043e\u0432: Big Data is Dead<\/a> \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 <a href=\"https:\/\/www.youtube.com\/@mezhdu_skobok\" rel=\"noopener noreferrer nofollow\">{ \u043c\u0435\u0436\u0434\u0443 \u0441\u043a\u043e\u0431\u043e\u043a }<\/a>.<\/p>\n<p>\u0418 \u043c\u0435\u043d\u044f \u043f\u043e\u043a\u043e\u0440\u0438\u043b \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u0410 \u043a\u043e\u0433\u0434\u0430 \u044f \u0443\u0437\u043d\u0430\u0432\u0430\u043b \u0435\u0433\u043e \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u043c\u043e\u0435\u043c\u0443 \u0441\u0447\u0430\u0441\u0442\u044c\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0435\u043c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0445\u043e\u0440\u043e\u0448 DuckDB \u0438 \u043a\u0430\u043a \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u043f\u043e\u043c\u043e\u0447\u044c.<\/p>\n<p> \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043f\u0440\u0430\u0432\u043a\u0438, \u0447\u0442\u043e \u0437\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u044b\u0435 \u0444\u0430\u043a\u0442\u044b.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u043d\u0430\u0448\u0435\u0439 \u0443\u0442\u043a\u043e\u0439:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u0430\u044f \u0411\u0414.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0411\u0414.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u0435\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 PostgreSQL.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u00abin\u2011process analytical database\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e (\u00abMIT License\u00bb).<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 (PostgreSQL, S3, HTTP(S), etc.).<\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u0431\u0443\u0434\u0443 \u0447\u0430\u0441\u0442\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u0442\u044c \u0432\u0430\u0441 \u043a <a href=\"https:\/\/duckdb.org\/docs\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 DuckDB<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.<\/p>\n<p><a class=\"anchor\" name=\"SQL\" id=\"SQL\"><\/a><\/p>\n<h3>SQL<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0431\u0449\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 <a href=\"https:\/\/duckdb.org\/docs\/sql\/introduction\" rel=\"noopener noreferrer nofollow\">introduction<\/a> DuckDB \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 PostgreSQL, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u00ab<em>\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439<\/em>\u00bb SQL. \u0412 DuckDB \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0441\u0432\u043e\u0438 \u043c\u0435\u0442\u043e\u0434\u044b, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u0430.<\/p>\n<p><a class=\"anchor\" name=\"Copy\" id=\"Copy\"><\/a><\/p>\n<h3>Copy<\/h3>\n<p>DuckDB \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u043e\u0449\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a <a href=\"https:\/\/duckdb.org\/docs\/sql\/statements\/copy\" rel=\"noopener noreferrer nofollow\">COPY<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0442\u0430\u043a\u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 \u0444\u0430\u0439\u043b\u044b \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p><a class=\"anchor\" name=\"PreparedStatements\" id=\"PreparedStatements\"><\/a><\/p>\n<h3>Prepared Statements<\/h3>\n<p>\u0412 DuckDB \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u043d\u0430\u044f <a href=\"https:\/\/duckdb.org\/docs\/sql\/query_syntax\/prepared_statements\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0430\u0441\u0442\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p><a class=\"anchor\" name=\"Functions\" id=\"Functions\"><\/a><\/p>\n<h3>Functions<\/h3>\n<p>\u0423 DuckDB \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c <a href=\"https:\/\/duckdb.org\/docs\/sql\/functions\/overview\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a> \u0438 \u0442\u0430\u043a\u0436\u0435 \u0432 DuckDB \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u0442\u0430\u043c\u0438, \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438, \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435.<\/p>\n<p><a class=\"anchor\" name=\"Extensions\" id=\"Extensions\"><\/a><\/p>\n<h3>Extensions<\/h3>\n<p>\u041a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u0435\u0435 DuckDB \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u043d\u0438\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e <a href=\"https:\/\/duckdb.org\/docs\/extensions\/overview\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"PostgreSQLExtension\" id=\"PostgreSQLExtension\"><\/a><\/p>\n<h4>PostgreSQL Extension<\/h4>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f <a href=\"https:\/\/duckdb.org\/docs\/extensions\/postgres\" rel=\"noopener noreferrer nofollow\">PostgreSQL Extension<\/a> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435 PostgreSQL (PostgreSQL, GreenPlum).<\/p>\n<p><a class=\"anchor\" name=\"Parquet\" id=\"Parquet\"><\/a><\/p>\n<h3>Parquet<\/h3>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a DuckDB \u0441\u0435\u0431\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 OLAP \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>.parquet<\/code>.<\/p>\n<p><a class=\"anchor\" name=\"ParquetImport\" id=\"ParquetImport\"><\/a><\/p>\n<h4>Parquet Import<\/h4>\n<p>DuckDB \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 <code>.parquet<\/code> \u0444\u0430\u0439\u043b. \u041e\u0431 \u044d\u0442\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e <a href=\"https:\/\/duckdb.org\/docs\/guides\/file_formats\/parquet_import.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"ParquetExport\" id=\"ParquetExport\"><\/a><\/p>\n<h4>Parquet Export<\/h4>\n<p>\u0422\u0430\u043a\u0436\u0435 DuckDB \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441\u0440\u0430\u0437\u0443 \u0432 <code>.parquet<\/code>. \u041e\u0431 \u044d\u0442\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e <a href=\"https:\/\/duckdb.org\/docs\/guides\/file_formats\/parquet_export.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"BuenaVista\" id=\"BuenaVista\"><\/a><\/p>\n<h3>Buena Vista<\/h3>\n<p>DuckDB \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u00abin\u2011process analytical database\u00bb, \u043d\u043e \u0432 <a href=\"https:\/\/github.com\/jwills\/buenavista\" rel=\"noopener noreferrer nofollow\">open source \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c &#171;\u043a\u043b\u0430\u0441\u0442\u0435\u0440&#187; \u0438\u0437 DuckDB \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0445\u043e\u0441\u0442\u0443.<\/p>\n<p><a class=\"anchor\" name=\"%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0\" id=\"\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\">\u0438\u043a\u0430&#187;><\/a><\/p>\n<h3>\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430<\/h3>\n<p>\u0421 \u0442\u0435\u043e\u0440\u0438\u0439 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0440\u0443\u0447\u043a\u0430\u043c\u0438.<\/p>\n<p><a class=\"anchor\" name=\"Installation\" id=\"Installation\"><\/a><\/p>\n<h4>Installation<\/h4>\n<p>DuckDB \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/duckdb.org\/docs\/installation\/index?version=stable&amp;environment=cli&amp;platform=macos&amp;download_method=package_manager\" rel=\"noopener noreferrer nofollow\">\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438<\/a>, \u043d\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Python API \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 <code>.jar<\/code> \u0434\u043b\u044f DBeaver.<\/p>\n<p><a class=\"anchor\" name=\"ClientAPIPython\" id=\"ClientAPIPython\"><\/a><\/p>\n<h4>Client API Python<\/h4>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a DuckDB \u00abin\u2011process analytical database\u00bb \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0440\u0430\u0441\u0447\u0451\u0442\u044b, \u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a \u043d\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 DuckDB.<\/p>\n<p><a class=\"anchor\" name=\"Inmemory\" id=\"Inmemory\"><\/a><\/p>\n<h3>In-memory<\/h3>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0440\u0430\u0441\u0447\u0451\u0442\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430.<\/p>\n<pre><code class=\"python\">import duckdb  cursor = duckdb.connect() print(cursor.execute('SELECT 42').fetchall())<\/code><\/pre>\n<p><a class=\"anchor\" name=\"Physicaldatabase\" id=\"Physicaldatabase\"><\/a><\/p>\n<h3>Physical database<\/h3>\n<p>\u041f\u0440\u0438 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f. \u041f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u043c. \u0410 \u0435\u0441\u043b\u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u0411\u0414, \u0442\u043e \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0443 \u0411\u0414 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u041e\u043d\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0432 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0435\u0451 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c &#171;<em>\u044d\u043a\u0441\u0435\u043b\u044c\u043a\u0438<\/em>&#171;, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u0411\u0414.<\/p>\n<pre><code class=\"python\">import duckdb  # create a connection to a file called 'demo_duckdb.db' cursor = duckdb.connect('demo_duckdb.duckdb') print(cursor.execute('SELECT 42').fetchall()) cursor.close()<\/code><\/pre>\n<p><a class=\"anchor\" name=\"ResultConversion\" id=\"ResultConversion\"><\/a><\/p>\n<h3>Result Conversion<\/h3>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0432\u0430\u0441 \u0441\u043f\u043e\u0441\u043e\u0431\u0435:<\/p>\n<pre><code class=\"python\">import duckdb  duckdb.sql(\"SELECT 42\").fetchall()   # Python objects duckdb.sql(\"SELECT 42\").df()         # Pandas DataFrame duckdb.sql(\"SELECT 42\").pl()         # Polars DataFrame duckdb.sql(\"SELECT 42\").arrow()      # Arrow Table duckdb.sql(\"SELECT 42\").fetchnumpy() # NumPy Arrays<\/code><\/pre>\n<p><a class=\"anchor\" name=\"DataInput\" id=\"DataInput\"><\/a><\/p>\n<h4>Data Input<\/h4>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 <code>.py<\/code> \u0444\u0430\u0439\u043b\u0430\u0445, \u043d\u043e \u0442\u0430\u043c \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/jupyterlab.readthedocs.io\/en\/stable\/\" rel=\"noopener noreferrer nofollow\">JupyterLab<\/a>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Docker \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432 \u043a\u043e\u0440\u043d\u0435 <a href=\"https:\/\/github.com\/k0rsakov\/all_about_DuckDB\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/a> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">docker-compose up -d<\/code><\/pre>\n<p>\u0418 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"http:\/\/localhost:8888\/\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost:8888\/<\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><a class=\"anchor\" name=\"%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%D0%B2JupyterLab\" id=\"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0432JupyterLab\">pyterLab&#187;><\/a><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 JupyterLab<\/h3>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 DuckDB \u0432\u043d\u0443\u0442\u0440\u044c <a href=\"https:\/\/jupyterlab.readthedocs.io\/en\/stable\/\" rel=\"noopener noreferrer nofollow\">JupyterLab<\/a> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0438\u043b\u0438 \u0432 \u00ab\u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435\u00bb:<\/p>\n<pre><code class=\"bash\">pip install duckdb==1.0.0<\/code><\/pre>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%D0%91%D0%94\" id=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u044f\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439\u0411\u0414\">\u043a\u0430\u043b\u044c\u043d\u043e\u0439\u0411\u0414&#187;<\/a><\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0411\u0414<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430 \u043a \u0411\u0414 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0439 \u0411\u0414 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<pre><code class=\"python\">import duckdb  # create a connection to a file called 'demo_duckdb.db' con = duckdb.connect('demo_duckdb.duckdb')<\/code><\/pre>\n<p>\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430 \u043a \u0411\u0414:<\/p>\n<pre><code class=\"python\">con.close()<\/code><\/pre>\n<p><a class=\"anchor\" name=\"json\" id=\"json\"><\/a><\/p>\n<h3>.json<\/h3>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/duckdb.org\/docs\/data\/json\/overview.html\" rel=\"noopener noreferrer nofollow\">JSON Loading<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/duckdb.org\/docs\/extensions\/json.html\" rel=\"noopener noreferrer nofollow\">JSON extensions<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 <code>glossary.json<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c:<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     SELECT * FROM read_json(\"glossary.json\")     \"\"\" ).df()<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<p> \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u043b\u044e\u0447\u0443:<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     SELECT glossary.GlossDiv.GlossList.GlossEntry.ID FROM read_json(\"glossary.json\")     \"\"\" ).df()<\/code><\/pre>\n<figure class=\"\"><\/figure>\n<p>\u0418 \u0442\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb \u0432\u0435\u0441\u044c <code>.json<\/code><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <code>.json<\/code> \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c url (\u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, S3, etc):<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     SELECT * FROM read_json('https:\/\/support.oneskyapp.com\/hc\/en-us\/article_attachments\/202761627')     \"\"\" ).df()<\/code><\/pre>\n<figure class=\"\"><\/figure>\n<p><a class=\"anchor\" name=\"parquet\" id=\"parquet\"><\/a><\/p>\n<h3>.parquet<\/h3>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/duckdb.org\/docs\/data\/parquet\/overview\" rel=\"noopener noreferrer nofollow\">Reading and Writing Parquet Files<\/a>. \u041a\u0430\u043a \u043c\u044b \u0447\u0438\u0442\u0430\u043b\u0438 \u043d\u0430\u0448 <code>.json<\/code> \u0444\u0430\u0439\u043b, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438 <code>.parquet<\/code>.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">con.sql(     \"\"\"     SELECT * FROM read_parquet('https:\/\/d37ci6vzurychx.cloudfront.net\/trip-data\/yellow_tripdata_2024-01.parquet')     \"\"\" ).df()<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<p><a class=\"anchor\" name=\"csv\" id=\"csv\"><\/a><\/p>\n<h3>.csv<\/h3>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 <a href=\"https:\/\/duckdb.org\/docs\/data\/csv\/overview\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439<\/a> \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 <code>.csv<\/code>.<\/p>\n<p><a class=\"anchor\" name=\"Storage\" id=\"Storage\"><\/a><\/p>\n<h4>Storage<\/h4>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u0412\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 DBeaver. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 API Python, \u0442\u043e \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c SQL-\u043a\u043e\u0434 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u043a \u0432\u0430\u0448\u0435\u0439 \u0411\u0414.<br \/> \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">con.sql(     \"\"\"     &lt;your SQL-query>     \"\"\" )<\/code><\/pre>\n<hr\/>\n<p>\u041c\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0438\u0441\u044c \u043a \u043d\u0430\u043c \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0441\u0430\u043c\u0438\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c DuckDB, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043a\u0440\u0443\u0442\u044b\u043c\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0440\u0430\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0444\u0430\u0439\u043b\u0438\u043a \u0441 \u043f\u043e\u0435\u0437\u0434\u043a\u0430\u043c\u0438 \u0442\u0430\u043a\u0441\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<pre><code class=\"sql\">CREATE TABLE yellow_tripdata_2024_01 SELECT * FROM read_parquet('https:\/\/d37ci6vzurychx.cloudfront.net\/trip-data\/yellow_tripdata_2024-01.parquet')<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443 \u043d\u0430\u0441 \u0437\u0430\u043d\u044f\u043b\u043e 5.77 \u0441\u0435\u043a. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0448\u043b\u0430 \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043a\u0430\u0447\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0442\u043e \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u043d\u0430\u0448\u0443 \u0411\u0414 \u0437\u0430\u0439\u043c\u0451\u0442 1.27 \u0441\u0435\u043a.<\/p>\n<p>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u043d\u0430\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<pre><code class=\"sql\">SELECT COUNT(*) FROM yellow_tripdata_2024_01<\/code><\/pre>\n<p>\u0418 \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043c\u0435\u043d\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0435 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u2013 \u043c\u0435\u043d\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"sql\">SELECT      tpep_pickup_datetime::date AS date_,      SUM(total_amount) AS sum_,     COUNT(*) AS count_,     SUM(total_amount) \/ COUNT(*) AS avg_  FROM      yellow_tripdata_2024_01 WHERE     tpep_pickup_datetime BETWEEN '2024-01-01' AND '2024-01-31' GROUP BY 1 ORDER BY 1<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c DuckDB \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p><a class=\"anchor\" name=\"Information_schema\" id=\"Information_schema\"><\/a><\/p>\n<h4>Information_schema<\/h4>\n<p>\u0412\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u043e <code>information_schema<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e <a href=\"https:\/\/duckdb.org\/docs\/sql\/meta\/information_schema\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0412 DuckDB \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 <code>information_schema<\/code> \u043f\u043e SQL-\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u0411\u0414.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u0432 \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<pre><code class=\"sql\">SELECT * FROM information_schema.columns WHERE table_name = 'yellow_tripdata_2024_01'<\/code><\/pre>\n<p>\u0418 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c 45 \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/p>\n<p><a class=\"anchor\" name=\"S3\" id=\"S3\"><\/a><\/p>\n<h4>S3<\/h4>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab<a href=\"https:\/\/habr.com\/ru\/articles\/827052\/\" rel=\"noopener noreferrer nofollow\">\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f\u00a0data engineer S3<\/a>\u00bb \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 S3 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432. \u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 DuckDB \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 S3.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432 \u043d\u0430\u0448 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <code>docker-compose.yml<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441 <code>minio<\/code> \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>minio<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>docker-compose up -d<\/code>.<\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<p><a class=\"anchor\" name=\"%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0S3\" id=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430S3\">\u0439\u043a\u0430S3&#8243;<\/a><\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 S3<\/h3>\n<p>\u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b DuckDB \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <strong>access key<\/strong> \u0438 <strong>secret key<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0430\u043a\u0435\u0442. \u042f \u0441\u043e\u0437\u0434\u0430\u043c \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043f\u0440\u043e\u0449\u0435. \u041d\u043e \u0430 \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Python, \u0442\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab<a href=\"https:\/\/habr.com\/ru\/articles\/827052\/\" rel=\"noopener noreferrer nofollow\">\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f\u00a0data engineer S3<\/a>\u00bb \u043e\u043f\u0438\u0441\u0430\u043d \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. <strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 S3 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u0432 Docker, \u0442\u043e \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c <code>s3_endpoint<\/code> \u043a\u0430\u043a <code>minio:9000<\/code>. \u0410 \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<\/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-426876","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/426876","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=426876"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/426876\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=426876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=426876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=426876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}