Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 4.94 KB | None | 0 0
  1. -- Волт
  2.  
  3. -- 1) - проверенный рабочий вариант
  4. -- у самой первой версии выгрузки вольта надо проставить дату в далёком прошлом. Для этого добавляем фиктивный клон самой первой версии со старой датой. Самую первую версию будем определять по самой ранней дате выгрузки
  5. INSERT INTO TABLE core.vault
  6. SELECT reflect("java.util.UUID", "randomUUID"), reflect("java.util.UUID", "randomUUID"), "ATMain", t.name, t.fullname, t.moneyorstock, t.vaultnumber,
  7. t.isenable, t.vaultid, NULL AS isDeleted, "2000-01-01" AS start_date
  8. FROM (
  9.     SELECT v.name, v.fullname, v.moneyorstock, v.vaultnumber, v.isenable, v.vaultid, v.SOURCE, MIN(startDate) AS startDate
  10.     FROM (
  11.         SELECT v.name, v.fullname, v.moneyorstock, v.vaultnumber, v.isenable, v.vaultid, v.SOURCE, concat_ws("-", YEAR, MONTH, DAY) AS startDate
  12.         FROM raw.atmain_vault v
  13.     ) v
  14.     GROUP BY v.name, v.fullname, v.moneyorstock, v.vaultnumber, v.isenable, v.vaultid, v.SOURCE
  15. ) t
  16.  
  17. -- 2) - вариант с косяками и багами (в процессе исправления)
  18. -- Нужно учитывать:
  19. -- при загрузке от разных дат, если волт не менялся, то новая запись в core не должна появиться, т.е. по сути - это могла быть такая же запись, с новым Version_ID и новым stardDate. И вот если такая ситуация, то не нужно делать новую запись. Это требование порождает UNION ALL
  20. -- Для всех версий одного волта нужно проставлять один глобальный идентификатор Primary_ID.
  21. INSERT OVERWRITE TABLE core.vault
  22. SELECT IF(vv.primary_id IS NULL, reflect("java.util.UUID", "randomUUID"), vv.primary_id),
  23. reflect("java.util.UUID", "randomUUID") AS version_id, "ATMain", f.name, f.fullname, f.moneyorstock, f.vaultnumber, f.isenable, f.sourcevault_id, f.isdeleted, f.startDate
  24. FROM (
  25.     SELECT DISTINCT f.name, f.fullname, f.moneyorstock, f.vaultnumber, f.isenable, f.sourcevault_id, f.isdeleted, f.row_hash, f.startDate
  26.     FROM (
  27.         SELECT t.name, t.fullname, t.moneyorstock, t.vaultnumber, t.isenable, t.sourcevault_id, t.isdeleted, t.row_hash,
  28.         FIRST_VALUE(startDate) OVER (PARTITION BY t.name, t.fullname, t.moneyorstock, t.vaultnumber, t.isenable, t.sourcevault_id, t.isdeleted, t.row_hash ORDER BY t.tmp) AS startDate
  29.         FROM (
  30.             SELECT u.name, u.fullname, u.moneyorstock, u.vaultnumber, u.isenable, u.sourcevault_id, u.isdeleted, hash(concat_ws("_",
  31.                 IF (u.name IS NOT NULL AND u.name <> '', u.name, "null"),
  32.                 IF (u.fullname IS NOT NULL AND u.fullname <> '', u.fullname, "null"),
  33.                 IF (u.moneyorstock IS NOT NULL AND u.moneyorstock <> '', u.moneyorstock, "null"),
  34.                 IF (u.vaultnumber IS NOT NULL AND u.vaultnumber <> '', u.vaultnumber, "null"),
  35.                 CAST(u.isenable AS STRING),
  36.                 CAST(u.sourcevault_id AS STRING)
  37.             )) AS row_hash, u.startDate, 1 AS tmp
  38.             FROM core.vault u
  39.             UNION ALL
  40.             SELECT t.name, t.fullname, t.moneyorstock, t.vaultnumber, t.isenable, t.sourcevault_id, t.isdeleted, t.row_hash, t.startDate, 2 AS tmp
  41.             FROM (
  42.                 SELECT *
  43.                 FROM(
  44.                     SELECT name, fullname, moneyorstock, vaultnumber, isenable, vaultid AS sourcevault_id, NULL AS isdeleted, row_hash, concat_ws("-", YEAR, MONTH, DAY) AS startDate,
  45.                     lag(row_hash, 1) OVER (ORDER BY vaultid, YEAR, MONTH, DAY) AS prev_row_hash
  46.                     FROM (
  47.                         SELECT u.*, hash(concat_ws("_",
  48.                             IF (u.name IS NOT NULL AND u.name <> '', u.name, "null"),
  49.                             IF (u.fullname IS NOT NULL AND u.fullname <> '', u.fullname, "null"),
  50.                             IF (u.moneyorstock IS NOT NULL AND u.moneyorstock <> '', u.moneyorstock, "null"),
  51.                             IF (u.vaultnumber IS NOT NULL AND u.vaultnumber <> '', u.vaultnumber, "null"),
  52.                             CAST(u.isenable AS STRING),
  53.                             CAST(u.vaultid AS STRING)
  54.                         )) AS row_hash
  55.                         FROM raw.atmain_vault u
  56.                         ORDER BY u.vaultid, u.YEAR, u.MONTH, u.DAY         
  57.                     ) t
  58.                 )t
  59.                 WHERE (t.prev_row_hash IS NULL OR t.prev_row_hash <> t.row_hash)
  60.             )
  61.         ) t
  62.     ) f
  63. )f
  64. LEFT JOIN (
  65.     SELECT primary_id, sourcevault_id
  66.     FROM core.vault
  67.     GROUP BY primary_id, sourcevault_id
  68.     ORDER BY sourcevault_id
  69. ) vv ON f.sourcevault_id = vv.sourcevault_id;
  70.  
  71. -- ВАЖНО: version_id при таком переносе будет все время меняться. Но это не критично, т.к. ссылки на сущности определяются по primary_id
  72.  
  73. -- ВАЖНО: если, например, в core.vault не было vaultid = 100500, и в raw.atmain_vault есть сразу две версии с таким идентификатором, то primary_id у них прставится разный. Как это исправить?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement