Průvodce migrací

Migrace úloh do Delta Lake

Když migrujete úlohy na rozdílový Lake, měli byste si uvědomit následující zjednodušení a rozdíly v porovnání se zdroji dat poskytovanými Apache Spark a Apache Hive.

Rozdílový Lake zpracovává následující operace automaticky, které byste nikdy neměli provádět ručně:

  • REFRESH TABLE: Rozdílové tabulky vždycky vracejí nejaktuálnější informace, takže není nutné ručně volat REFRESH TABLE po změnách.

  • Přidání a odebrání oddílů: rozdílový Lake automaticky sleduje sadu oddílů v tabulce a aktualizuje seznam při přidávání nebo odebírání dat. V důsledku toho není nutné spouštět ALTER TABLE [ADD|DROP] PARTITION ani MSCK .

  • Načtení jednoho oddílu: jako optimalizace můžete někdy přímo načíst oddíl dat, která vás zajímají. Například, spark.read.parquet("/data/date=2017-01-01"). To není nutné u rozdílových Lake, protože může rychle přečíst seznam souborů z transakčního protokolu a najít relevantní. Pokud vás zajímá jeden oddíl, zadejte ho pomocí WHERE klauzule. Například, spark.read.delta("/data").where("date = '2017-01-01'"). U velkých tabulek s mnoha soubory v oddílu může to být mnohem rychlejší než načtení jednoho oddílu (s přímým odkazem na oddíl nebo s WHERE ) z tabulky Parquet, protože výpis souborů v adresáři je často pomalejší než čtení seznamu souborů z transakčního protokolu.

Když port existující aplikace nakonfigurujete na rozdílový Lake, měli byste se vyhnout následujícím operacím, které obcházejí transakční protokol:

  • Ruční úprava dat: rozdílový Lake používá transakční protokol k atomické potvrzení změn v tabulce. Vzhledem k tomu, že protokol je zdrojem pravdy, soubory, které jsou zapsány, ale nebyly přidány do transakčního protokolu, nepřečetl Spark. Podobně i v případě, že soubor ručně odstraníte, je ukazatel na soubor stále přítomen v transakčním protokolu. Místo ruční úpravy souborů uložených v rozdílové tabulce vždy použijte příkazy popsané v této příručce.

  • Externí čtenáři: data uložená v rozdílovém Lake Lake jsou zakódovaná jako Parquet soubory. Přístup k těmto souborům pomocí externího čtecího zařízení ale není bezpečný. Zobrazí se duplicity a nepotvrzená data a čtení může selhat, když někdo spustí Odebrání souborů, na které se už neodkazuje v tabulce rozdílů.

Poznámka

Vzhledem k tomu, že soubory jsou zakódované v otevřeném formátu, máte vždycky možnost přesunout soubory mimo rozdílový Lake. V tomto okamžiku můžete spustit VACUUM RETAIN 0 a odstranit transakční protokol. Soubory tabulky se tak nechají v konzistentním stavu, který může číst externí čtenář podle vašeho výběru.

Příklad

Předpokládejme, že máte Parquet data uložená v adresáři /data-pipeline a chcete vytvořit tabulku s názvem events . Vždy si můžete přečíst do datového rámce a uložit jako rozdílovou tabulku. Tento přístup kopíruje data a umožňuje Sparku spravovat tabulku. Alternativně můžete převést na rozdílový Lake, který je rychlejší, ale výsledky v nespravované tabulce.

Uložit jako rozdílovou tabulku

  1. Přečtěte si data do datového rámce a uložte je do nového adresáře ve delta formátu:

    data = spark.read.parquet("/data-pipeline")
    data.write.format("delta").save("/mnt/delta/data-pipeline/")
    
  2. Vytvořte rozdílovou tabulku events , která odkazuje na soubory v rozdílovém adresáři Lake:

    spark.sql("CREATE TABLE events USING DELTA LOCATION '/mnt/delta/data-pipeline/'")
    

Převést na rozdílovou tabulku

Pro převod tabulky Parquet na rozdílovou tabulku máte dvě možnosti:

  • Převést soubory na formát rozdílových formátů a vytvořit rozdílovou tabulku:

    CONVERT TO DELTA parquet.`/data-pipeline/`
    CREATE TABLE events USING DELTA LOCATION '/data-pipeline/'
    
  • Vytvořte tabulku Parquet a proveďte převod na rozdílovou tabulku:

    CREATE TABLE events USING PARQUET OPTIONS (path '/data-pipeline/')
    CONVERT TO DELTA events
    

Podrobnosti najdete v tématu převedení tabulky Parquet na rozdílovou tabulku.