【问题标题】:Synapse Spark SQL Delta Merge Mismatched Input ErrorSynapse Spark SQL Delta 合并输入不匹配错误
【发布时间】:2021-07-24 07:12:15
【问题描述】:

我正在尝试更新历史表,但出现合并错误。当我运行这个单元格时:

%%sql

select * from main
UNION
select * from historical
where Summary_Employee_ID=25148

我得到一个两行表,如下所示: 员工 ID 姓名 25148 温迪·克兰佩特 25148 温迪猴子

我正在尝试更新名称...使用以下合并命令

%%sql
MERGE INTO main m
using historical h
on m.Employee_ID=h.Employee_ID
WHEN MATCHED THEN 
    UPDATE SET 
        m.Employee_ID=h.Employee_ID,
        m.Name=h.Name
WHEN NOT MATCHED THEN
    INSERT(Employee,Name)
    VALUES(h.Employee,h.Name)

这是我的错误:

错误: 不匹配的输入 'MERGE' 期望 {'(', 'SELECT', 'FROM', 'ADD', 'DESC', 'WITH', 'VALUES', 'CREATE', 'TABLE', 'INSERT', 'DELETE' , 'DESCRIBE', 'EXPLAIN', 'SHOW', 'USE', 'DROP', 'ALTER', 'MAP', 'SET', 'RESET', 'START', 'COMMIT', 'ROLLBACK', ' REDUCE'、'REFRESH'、'CLEAR'、'CACHE'、'UNCACHE'、'DFS'、'TRUNCATE'、'ANALYZE'、'LIST'、'REVOKE'、'GRANT'、'LOCK'、'UNLOCK' , 'MSCK', 'EXPORT', 'IMPORT', 'LOAD'}(第 1 行,位置 0)

【问题讨论】:

    标签: azure apache-spark azure-synapse delta


    【解决方案1】:

    Synapse 不支持 sql 合并,例如 databricks。但是,您可以使用 python 解决方案。注意历史真的是我的更新......

    所以对于以上内容,我使用了:

    import delta
    
    main = delta.DeltaTable.forPath(spark,"path")
    
    (main
        .alias("main")
        .merge(historical.alias("historical"),
        .whenMatchedUpdate(set = {main.Employee_ID=historical.Employee_ID})
        .whenNotMathcedInsert(values = 
            {"employeeID":"historical.employeeID","name"="historical.name})
    .execute()
    )
    

    【讨论】:

      【解决方案2】:

      您的目标是更新目标表historical,但根据您的查询,目标表设置为main 而不是historical,更新语句设置为main,插入语句设置为@ 987654325@

      试试下面的,

      %%sql
      MERGE INTO historical target
      using main source
      on source.Employee_ID=target.Employee_ID
      WHEN MATCHED THEN 
          UPDATE SET 
              target.Name=source.Name
      WHEN NOT MATCHED THEN
          INSERT(Employee,Name)
          VALUES(source.Employee,source.Name)
      

      【讨论】:

      • 这也失败了,但因为突触是问题所在。让我在下面分享答案。
      【解决方案3】:

      目前处于预览阶段的 Spark 3.0 支持它,所以这可能值得一试。我确实在 Spark 3.0 池上看到了同样的错误,但它非常具有误导性,因为它实际上意味着您正在尝试合并重复数据,或者您正在向原始数据集提供重复数据。我已经通过使用无服务器 SQL 池和 Polybase 查询 delta Lake 和原始文件中的重复项来验证了这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        • 2023-03-13
        • 2012-07-01
        • 2019-02-23
        • 2021-11-19
        • 2021-07-26
        相关资源
        最近更新 更多