开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

请问一下,Flink1.13.6 MERGE 这语法 有什么问题

MERGE INTO stu4_sink_hudiUSING ( SELECT * FROM stu4) sourceON stu4_sink_hudi.id = source.idWHEN MATCHED THEN UPDATE SET stu4_sink_hudi.name = source.name, stu4_sink_hudi.school = source.schoolWHEN NOT MATCHED THEN INSERT (id, name, school) VALUES (source.id, source.name, source.school)WHEN NOT MATCHED BY SOURCE AND stu4_sink_hudi.school='school1' THEN DELETE;[ERROR] Could not execute SQL statement. Reason:org.apache.flink.sql.parser.impl.ParseException: Encountered "WHEN" at line 12, column 1.Was expecting one of: ")" ... 请问一下,Flink1.13.6 MERGE 这语法 有什么问题 af40ea74e98b4c4a783ad4344e9fe08e.png

展开
收起
十一0204 2023-04-11 09:11:42 424 0
3 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    根据您提供的 SQL 语句,可以看出其中确实存在语法错误。具体来说,WHEN NOT MATCHED BY SOURCE AND stu4_sink_hudi.school='school1' THEN DELETE 应该放在 WHEN NOT MATCHED THEN 的后面,而不是整个语句的最后。

    正确的 SQL 语句应该是这样的:

    MERGE INTO stu4_sink_hudi
    USING (
      SELECT * FROM stu4
    ) source
    ON stu4_sink_hudi.id = source.id
    WHEN MATCHED THEN
      UPDATE SET stu4_sink_hudi.name = source.name, stu4_sink_hudi.school = source.school
    WHEN NOT MATCHED THEN
      INSERT (id, name, school) VALUES (source.id, source.name, source.school)
    WHEN NOT MATCHED BY SOURCE AND stu4_sink_hudi.school='school1' THEN
      DELETE;
    

    在这个语句中,WHEN NOT MATCHED BY SOURCE AND stu4_sink_hudi.school='school1' THEN DELETE 被正确地放置在了 WHEN NOT MATCHED THEN 的后面。

    2023-04-26 22:38:03
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    这个问题不是 Flink 版本问题。

    这是一个无法通过 Flink SQL 解析器的错误的 SQL 语法。您需要检查语法并根据您使用的数据库系统(MySQL,PostgresSQL,Oracle 等)创建相应的语法。

    以下是一个示例 MySQL 的 MERGE 语法:

    MERGE INTO stu4_sink_hudi USING stu4 source ON stu4_sink_hudi.id = source.id WHEN MATCHED THEN UPDATE SET stu4_sink_hudi.name = source.name, stu4_sink_hudi.school = source.school WHEN NOT MATCHED THEN INSERT (id, name, school) VALUES (source.id, source.name, source.school) WHEN NOT MATCHED BY SOURCE AND stu4_sink_hudi.school='school1' THEN DELETE; 请注意,不同的数据库系统具有不同的 MERGE 语法,因此您需要按照相应的语法规则在 Flink 中编写 SQL 语句。

    2023-04-17 17:17:42
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    语法存在问题,改成这样试试:

    MERGE INTO stu4_sink_hudi
    USING stu4
    ON stu4_sink_hudi.id = stu4.id
    WHEN MATCHED THEN UPDATE SET stu4_sink_hudi.name = stu4.name, stu4_sink_hudi.school = stu4.school
    WHEN NOT MATCHED THEN INSERT (id, name, school) VALUES (stu4.id, stu4.name, stu4.school)
    WHEN NOT MATCHED AND stu4_sink_hudi.school='school1' THEN DELETE;
    
    
    2023-04-11 09:22:35
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载