{"id":23707616,"url":"https://github.com/rewerma/ares","last_synced_at":"2025-10-27T00:41:10.370Z","repository":{"id":259038044,"uuid":"875648588","full_name":"rewerma/ares","owner":"rewerma","description":"Ares is a data computation integration engine based on PL-SQL syntax for ETL, cross-source computation, data analysis, and storage-computation separation.","archived":false,"fork":false,"pushed_at":"2025-02-05T07:46:41.000Z","size":2171,"stargazers_count":119,"open_issues_count":1,"forks_count":14,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-03-30T00:06:06.045Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rewerma.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-20T14:37:01.000Z","updated_at":"2025-03-06T13:45:02.000Z","dependencies_parsed_at":"2025-01-10T12:44:40.516Z","dependency_job_id":"b6499007-ebae-4d5b-a418-eb9144ec502a","html_url":"https://github.com/rewerma/ares","commit_stats":null,"previous_names":["rewerma/ares"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rewerma%2Fares","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rewerma%2Fares/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rewerma%2Fares/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rewerma%2Fares/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rewerma","download_url":"https://codeload.github.com/rewerma/ares/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247419860,"owners_count":20936012,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-30T16:58:34.953Z","updated_at":"2025-10-27T00:41:10.270Z","avatar_url":"https://github.com/rewerma.png","language":"Java","funding_links":[],"categories":["大数据"],"sub_categories":[],"readme":"# Ares-Access\n\n## 目录\n\n- [概览](#概览)\n- [快速开始](docs/zh/start/quick-start-ares.md)\n- [安装](docs/zh/start/deployment.md)\n- [PL-SQL语法](docs/zh/plsql/ares-plsql.md)\n- [语法示例](#语法示例)\n\n## 概览\n\nAres-Access 是基于 `PL-SQL` 语法的 ETL、跨源计算、数据分析、存计分离的数据计算集成引擎。\n\n![架构流程图](docs/ares.png)\n\n- 功能特性1：支持多种数据源连接，包括 `Mysql`, `Oracle`, `SQLServer`, `PostgreSQL`, `Hive`, `HDFS`, `FTP`, `SFTP` 等；\n- 功能特性2：支持跨源计算，可以连接多个源端加载数据到Ares引擎并通过Spark进行分布式计算，最后将结果输出到目标端；\n- 功能特性3：支持丰富的DML-SQL语法，包括：`INSERT`, `UPDATE`, `DELETE`, `MERGE`, `TRUNCATE`等（部分目标端仅支持`INSERT`）；\n- 功能特性4：支持丰富的过程语法，包括：`CREATE PROCEDURE`, `CREATE FUNCION`, `IF`, `FOR`, `WHILE`, `CURSOR`,  `EXCEPTION`等，详细参见：[PL-SQL语法](docs/zh/plsql/ares-plsql.md)\n- 功能特性5：支持丰富的数据类型：`INT`, `BIGINT`, `NUMBER`, `VARCHAR`, `DATE`, `TIMESTAMP` 等；\n- 功能特性6：支持过程函数整合SQL-UDF：在过程语言中定义的`CREATE FUNCTION`可以直接在SQL中使用，并支持多种数据类型；\n\n## 语法示例\n\n### 语法示例1\n\n```sql\nSET datasource.mytest.connector=mysql;\nSET datasource.mytest.url=jdbc:mysql://127.0.0.1:3306/mytest?useSSL=false;\nSET datasource.mytest.driver=com.mysql.cj.jdbc.Driver;\nSET datasource.mytest.user=root;\nSET datasource.mytest.password=123456;\n\nCREATE TABLE test1\nWITH (\n    'datasource' = 'mytest',\n    -- 'query'='select * from t_user',\n    'table_name'='t_user',\n    'type' = 'source,sink'\n);\n\nCREATE TABLE test2\nWITH (\n    'datasource' = 'mytest',\n    'table_name'='t_user1',\n    'type' = 'source,sink'\n);\n\nSELECT * FROM test1 LIMIT 20;\n\nTRUNCATE TABLE test2;\n\nINSERT INTO test2 (id, name, c_time) SELECT id, name, c_time FROM test1 WHERE id \u003e 0 LIMIT 100;\n\nUPDATE test2 a, test1 b SET a.name = b.name||'_', a.c_time = to_timestamp(date_add(b.c_time, 1)||' '||date_format(b.c_time, 'HH:mm:ss')) WHERE a.id = b.id;\n\nDELETE FROM test2 a, (SELECT * FROM test1 WHERE id\u003e3) b WHERE a.id = b.id;\n\nMERGE INTO test2 tu2\nUSING (SELECT * FROM test1) tu\nON (tu2.id=tu.id)\nWHEN NOT MATCHED THEN\n    INSERT (tu2.id, tu2.name, tu2.c_time)\n        VALUES (tu.id, tu.name, tu.c_time)\nWHEN MATCHED THEN\n    UPDATE SET tu2.name = tu.name, tu2.c_time = tu.c_time;\n\nDECLARE\n    cnt INT := 0;\nBEGIN\n    SELECT COUNT(*) INTO :cnt FROM test1;\n    PUT_LINE('Total records: '||:cnt);\nEND;\n```\n\n### 语法示例2\n\n```sql\nCREATE FUNCTION test(num INT) RETURN INT AS\nBEGIN\n    RETURN num + 1;\nEND;\n\nPUT_LINE(test(-1));\n\nSELECT test(10) as test;\n```\n### 语法示例3\n\n```sql\nCREATE PROCEDURE test(p1 IN INT, p2 IN NUMBER) AS\n    a VARCHAR := 'test';\n    b INT := 1;\n    c TIMESTAMP := '2021-01-01 12:23:34.567';\n    d NUMBER(10, 2) := 1.124;\nBEGIN\n    PUT_LINE(d);\n    WHILE b \u003c= p1 LOOP\n        PUT_LINE('Current index: '||b);\n        IF b \u003e 2 THEN\n            PUT_LINE('Exit while loop!');\n            EXIT;\n        END IF;\n        b := b + 1;\n    END LOOP;\nEND;\n\nCALL test(5, 3.14);\n\n\nCREATE PROCEDURE test2(p1 IN INT, p2 IN NUMBER, p3 OUT VARCHAR) AS\nBEGIN\n    p3 := (p1 * p2) || '_';\nEND;\n\nDECLARE\n    v1 VARCHAR;\nBEGIN\n    test2(2, 3.14, v1);\n    put_line('Result: '||v1);\nEND;\n```\n\n### 语法示例4\n\n```sql\nCREATE TABLE test1\nWITH (\n    'connector' = 'fake',\n    'schema' = '{\"fields\":{\"id\":\"bigint\",\"name\":\"string\",\"c_time\":\"timestamp\"}}',\n    'rows' = '[{\"fields\":[1, \"Eric\", \"2021-01-01 12:23:34\"]},\n               {\"fields\":[2, \"Andy\", \"2022-03-11 11:23:34\"]},\n               {\"fields\":[3, \"Joker\", \"2024-11-04 10:23:34\"]}]',\n    'type' = 'source'\n);\n\nDECLARE\n    i INT := 0;\n    e INT := 5;\nBEGIN\n    WHILE i \u003c 5 LOOP\n        IF i \u003e 2 THEN\n            EXIT;\n        END IF;\n        PUT_LINE('INDEX: ' || i);\n        i := i + 1;\n    END LOOP;\n\n    FOR j IN 1..e LOOP\n        IF j = 3 THEN\n            EXIT;\n        END IF;\n        PUT_LINE('INDEX: ' || j);\n    END LOOP;\n\n    FOR cur IN (select * from test1) LOOP\n        println(cur.id||' '||cur.name||' '||cur.c_time);\n    END LOOP;\nEND;\n```\n\n## 执行示例\n\nLocal:\n``` bash\n./bin/ares-local-starter.sh --sql /path/to/sample.sql \n``` \n\nSpark3:\n``` bash\n./bin/start-ares-spark3-connector.sh --sql /path/to/sample.sql --master spark://127.0.0.1:7077 \n``` \n\nSpark2:\n``` bash\n./bin/start-ares-spark2-connector.sh --sql /path/to/sample.sql --master spark://127.0.0.1:7077 \n``` ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frewerma%2Fares","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frewerma%2Fares","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frewerma%2Fares/lists"}