Hey Schneeflocke, schick mir eine E-Mail

Nov 30 2022
Snowflake kann jetzt E-Mails senden – bauen wir also eine gespeicherte Prozedur, die Ihnen jeden Morgen die Ergebnisse einer Abfrage sendet – auch wenn es irgendwo auf der Welt einen Feiertag gibt, der sich auf Ihre Zahlen auswirkt. Snowflake kann jetzt E-Mails senden Um eine E-Mail-Benachrichtigung mit Snowflake zu senden, benötigen Sie jetzt nur noch einen SQL-Aufruf: Das Ziel dieses Beitrags ist es, diese Funktionalität mit einem Planer und etwas Formatierungscode zu verknüpfen – damit wir sie jeden Morgen von Montag bis Freitag erhalten können Ergebnisse einer SQL-Abfrage, einschließlich bevorstehender Feiertage.

Snowflake kann jetzt E-Mails senden – bauen wir also eine gespeicherte Prozedur, die Ihnen jeden Morgen die Ergebnisse einer Abfrage sendet – auch wenn es irgendwo auf der Welt einen Feiertag gibt, der sich auf Ihre Zahlen auswirkt.

Von KI generiertes Bild

Snowflake kann jetzt E-Mails senden

Um eine E-Mail-Benachrichtigung mit Snowflake zu senden, benötigen Sie jetzt nur noch einen SQL-Aufruf:

call system$send_email(
    'my_email_int',
    '[email protected], [email protected], [email protected]',
    'This is the subject',
    'This is the body'
);

Wie benachrichtige ich Benutzer in Snowflake? ❄️ Schneeflocke in Kürze – E-Mail-Benachrichtigungen

Das Ziel dieses Beitrags ist es, diese Funktionalität mit einem Planer und etwas Formatierungscode zu verknüpfen – damit wir jeden Morgen von Montag bis Freitag die Ergebnisse einer SQL-Abfrage erhalten können, einschließlich aller bevorstehenden Feiertage. Wie dieser:

Eine von Snowflake gesendete E-Mail mit den bevorstehenden Feiertagen

Schritt 1: Entwickeln Sie eine gespeicherte Prozedur, die das Ergebnis jeder Abfrage formatiert und per E-Mail versendet

Dies ist der Code, den ich geschrieben habe, während ich meine Fähigkeiten debuggte, ein gut formatiertes Abfrageergebnis per E-Mail zu versenden:

with pretty_email_results as procedure()
returns string
language python
packages = ('snowflake-snowpark-python', 'tabulate')
handler = 'x'
as
$$
def x(session):
    printed = session.sql(
        "select * from table(result_scan(last_query_id(-1)))"
      ).to_pandas().to_markdown()
    session.call('system$send_email',
        'my_email_int',
        '[email protected]',
        'Email Alert: Task A has finished.',
        printed)
$$
call pretty_email_results();

  • Snowflake verfügt jetzt über „ anonyme Prozeduren “, mit denen Sie sie in einem Schritt definieren und aufrufen können. Sie brauchen nicht create or replacezuerst und callspäter – was besonders beim Debuggen nützlich ist.
  • Ich habe mich entschieden, diese Prozedur in Python zu schreiben, um die Bibliothek zu verwenden tabulate. Diese Bibliothek formatiert die Ergebnisse einer Abfrage, damit sie in unseren ausgehenden E-Mails hübsch aussehen.
  • Die tabulateBibliothek wird bereits von Anaconda in Snowflake bereitgestellt, sodass wir sie mit der Zeile verwenden können packages = (‘tabulate’).
  • Mit result_scan(last_query_id(-1)Snowflake kann auf die Ergebnisse der zuletzt ausgeführten Abfrage zugegriffen werden – was es ermöglicht pretty_email_results(), alle Ergebnisse, die wir im vorherigen Schritt erhalten haben, per E-Mail zu versenden.
  • Snowpark gibt uns das sessionObjekt in unserer gespeicherten Prozedur, mit der wir den Ergebnisscan mit ausführen können session.sql().
  • session.sql()gibt uns einen Snowpark DataFrame, und .to_pandas()wenn wir ihn aufrufen, erhalten wir Pandas DataFrame. Pandas .to_markdown()ruft dann an tabulate– und es wird sich beschweren, es sei denn, Sie fordern dieses Paket nicht ausdrücklich mit an packages=(...).

Sobald Ihr interaktives Debugging abgeschlossen ist, können Sie den Code in eine dauerhaft gespeicherte Prozedur verschieben:

create or replace procedure email_last_results(send_to string, subject string)
returns string
language python
runtime_version=3.8
packages = ('snowflake-snowpark-python', 'tabulate')
handler = 'x'
execute as caller
as
$$
import snowflake

def x(session, send_to, subject):
    try: 
        body = session.sql(
          "select * from table(result_scan(last_query_id(-1))) limit 100"
        ).to_pandas().to_markdown()
    except snowflake.snowpark.exceptions.SnowparkSQLException as e:
        body = '%s\n%s' % (type(e), e)
    session.call('system$send_email',
        'my_email_int',
        send_to,
        subject,
        body)
    return 'email sent:\n%s' % body
$$;

  • execute as callerwird hier benötigt, damit die gespeicherte Prozedur den Abfrageverlauf des aufrufenden Benutzers finden kann.
  • runtime_version=3.8muss in einer dauerhaft gespeicherten Prozedur explizit sein.
  • Ich habe Code hinzugefügt, um Ausnahmen abzufangen und trotzdem eine hübsche E-Mail zu senden.
  • Ich habe den Betreff und die Empfänger in die Prozedurargumente verschoben.
  • Ich habe ein hinzugefügt limit 100, um das Senden von E-Mails in TB-Größe zu verhindern.

call email_last_results('[email protected]', 'results from snowflake');

Jetzt kann eine einfache gespeicherte SQL-Prozedur eine Abfrage ausführen und unsere Python-Prozedur auffordern, die Ergebnisse per E-Mail zu senden:

create or replace procedure run_query_and_email_it()
returns string
execute as caller
as
$$
begin
    -- any query you'd like to run
    select 'now' as what, to_char(current_timestamp) as value
    union all
    select 'upcoming', day || ' ' ||holiday
    from table(fh_db.public.holidays('US', [year(current_date), year(current_date)+1]))
    where day between current_date() and current_date()+60
    ;
    -- call the stored procedure that formats and emails the results
    call email_last_results('[email protected]', 'upcoming holidays');
    return 'done';
end
$$
;

call run_query_and_email_it();

Snowflake hat einen Aufgabenplaner für Ihre Anfragen bereit:

create or replace task email_me_frequently
warehouse = 's'
schedule = 'using cron 0 8 * * 1-5 America/Los_Angeles'
as call run_query_and_email_it();

Einige Notizen:

  • Ich bat ihn, mein Lager namens „s“ zu benutzen. Snowflake bietet auch Serverless Tasks , aber diese führen keine gespeicherten Python-Prozeduren aus.
  • Ich musste meine holidays()UDF ändern, indem ich die Python - .zipAbhängigkeiten von einer Benutzerphase in eine benannte Phase verlagerte . Als es in meiner Benutzerphase lebte, warf die Aufgabe den Fehler Remote file ‘holidays.zip’ was not found.
  • Ändern Sie den Zeitplan in alle, 1 minutewenn Sie debuggen müssen.

alter task email_me_frequently resume;

select *
  from table(information_schema.task_history(
    scheduled_time_range_start=>dateadd('hour',-48,current_timestamp()),
    result_limit => 100));

      
                
Images generated by AI

Machen Sie sich nicht zu viele Gedanken über den Aufbau eines Warnsystems – Snowflake entwickelt dies bereits ( derzeit in privater Vorschau ):

CREATE ALERT Warehouse_Credit_Usage_Alert
 WAREHOUSE = my_warehouse
 SCHEDULE = ‘USING CRON 0 7 * * *UTC’ // everyday at 7 am
 IF (EXISTS (SELECT
  Warehouse_name,
  SUM(CREDITS_USED) AS credits
  FROM snowflake.account_usage.warehouse_metering_history
  // aggregate warehouse Credit_used for the past 24 hours
 WHERE datediff(hour, start_time, CURRENT_TIMESTAMP ())<=24
 GROUP BY 1
 HAVING credits > 10
 ORDER BY 2 DESC))
 THEN system$send_email (
  ‘My_email_notification_integration’, 
        ‘admin1@company,com, [email protected]’,
        ‘Email Alert: Excessive warehouse usage!’, 
        ‘Warehouse usage exceeds 10 credits in the past 24 hours’
)

  • Probieren Sie es mit einem kostenlosen Snowflake -Testkonto aus – Sie brauchen nur eine E-Mail-Adresse, um loszulegen.
  • Spielen Sie mit den angebotenen Formatierungsoptionentabulate .
Von KI generierte Bilder