Hey Schneeflocke, schick mir eine E-Mail
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:
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:
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 undcallspä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önnenpackages = (‘tabulate’). - Mit
result_scan(last_query_id(-1)Snowflake kann auf die Ergebnisse der zuletzt ausgeführten Abfrage zugegriffen werden – was es ermöglichtpretty_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önnensession.sql(). session.sql()gibt uns einen Snowpark DataFrame, und.to_pandas()wenn wir ihn aufrufen, erhalten wir Pandas DataFrame. Pandas.to_markdown()ruft dann antabulate– und es wird sich beschweren, es sei denn, Sie fordern dieses Paket nicht ausdrücklich mit anpackages=(...).
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
$$
;
- Um eine Tabelle mit allen Feiertagen für die nächsten 60 Tage zu erhalten , ruft es mein zuvor definiertes
holidaysUDTF auf. Generieren aller Feiertage in SQL – mit einem Python-UDTF
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 FehlerRemote 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 Formatierungsoptionen
tabulate.

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































