Поддерживает ли Azure Databricks SparkSQL рекурсивные запросы - PullRequest
0 голосов
/ 08 октября 2019

Я перемещаю данные из SQL Server в Azure data lake gen2 и преобразую SQL-запросы в рекурсивные запросы.

Вот пример SQL-запроса с рекурсией с использованием CTE (Common Table Expression)

 WITH RECURSIVE AS BOM
          (SELECT p.MItemId AS RootPartNumber,
                  p.MItemId AS PartNumber,
                  NULL AS ParentPartNumber,
                  0    AS BomLevel,
                  1.0  AS Quantity
           FROM   PartItem p

           UNION ALL
           SELECT BOM.RootPartNumber,
                 CAST(BSM.ChildItem AS string) AS PartNumber,
                 CAST(DB.PartNumber AS string) AS ParentPartNumber,
                 BOM.BomLevel + 1  as BomLevel,
                 BSM.Quantity AS Quantity 
           FROM  PartItemBomList BSM
           INNER JOIN BOM  ON BOM.PartNumber = BSM.ParentItem
           INNER JOIN PartItem p           ON p.MItemId = BSM.ChildItem
           WHERE BSM.IsDeleted = 0 
  )
  SELECT * FROM BOM

Я попытался изменить запрос, встраивая рекурсию в предложение FROM, как показано ниже, но безуспешно.

 SELECT * FROM 
          (SELECT p.MItemId AS RootPartNumber,
                  p.MItemId AS PartNumber,
                  NULL AS ParentPartNumber,
                  0    AS BomLevel,
                  1.0  AS Quantity
           FROM   PartItem p
           WHERE p.PartType =    'Cloud-OrderableAssembly' 
           UNION ALL
           SELECT BOM.RootPartNumber,
                 CAST(BSM.ChildItem AS string) AS PartNumber,
                 CAST(DB.PartNumber AS string) AS ParentPartNumber,
                 BOM.BomLevel + 1  as BomLevel,
                 BSM.Quantity AS Quantity 
           FROM  PartItemBomList BSM
           INNER JOIN BOM  ON BOM.PartNumber = BSM.ParentItem
           INNER JOIN PartItem p           ON p.MItemId = BSM.ChildItem
           WHERE BSM.IsDeleted = 0 
  ) as BOM

Вот ошибка, которую я получаю из сеанса Azure Databricks.

Ошибка в операторе SQL: AnalysisException: таблица или представление не найдены: спецификация;линия 16 поз 22 * ​​1012 *

1 Ответ

1 голос
/ 09 октября 2019

Проблема здесь

INNER JOIN BOM  ON BOM.PartNumber = BSM.ParentItem

Это внутренний запрос, и, насколько я понимаю, спецификация определена снаружи, и поэтому эта часть запроса выполняет спецификацию не существует.

Если бы я был на вашем месте, я мог бы попытаться исправить приведенный ниже запрос, запустив его непосредственно в SQL. Неверный способ ссылки на спецификацию

SELECT p.MItemId AS RootPartNumber, p.MItemId AS PartNumber, NULL AS ParentPartNumber, 0 AS BomLevel, 1.0 AS Quantity FROM PartItem p WHERE p.PartType = 'Cloud-OrderableAssembly' UNION ALL SELECT BOM.RootPartNumber, CAST(BSM.ChildItem AS string) AS PartNumber, CAST(DB.PartNumber AS string) AS ParentPartNumber, BOM.BomLevel + 1 as BomLevel, BSM.Quantity AS Quantity FROM PartItemBomList BSM INNER JOIN BOM ON BOM.PartNumber = BSM.ParentItem INNER JOIN PartItem p ON p.MItemId = BSM.ChildItem WHERE BSM.IsDeleted = 0

...