Này Snowflake, gửi cho tôi một email
Snowflake có thể gửi email ngay bây giờ — vì vậy, hãy xây dựng một quy trình được lưu trữ để gửi cho bạn kết quả truy vấn mỗi sáng — bao gồm cả việc có một Ngày lễ ở đâu đó trên thế giới ảnh hưởng đến các con số của bạn hay không.
Snowflake có thể gửi email ngay bây giờ
Để gửi thông báo qua email với Snowflake, giờ đây bạn chỉ cần một lệnh gọi SQL:
call system$send_email(
'my_email_int',
'[email protected], [email protected], [email protected]',
'This is the subject',
'This is the body'
);
Làm cách nào để thông báo cho người dùng trong Snowflake? ❄️ Sơ lược về bông tuyết — Thông báo qua email
Mục tiêu của bài đăng này là kết hợp chức năng này với một bộ lập lịch và một số mã định dạng — để mỗi sáng từ Thứ Hai đến Thứ Sáu, chúng tôi có thể nhận được kết quả của một truy vấn SQL, bao gồm mọi Ngày lễ sắp tới. Giống như cái này:
Bước 1: Phát triển một thủ tục được lưu trữ để định dạng và gửi email kết quả của bất kỳ truy vấn nào
Đây là mã tôi đã viết, trong khi gỡ lỗi các khả năng của tôi để gửi email kết quả truy vấn được định dạng tốt:
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 hiện có “ Quy trình ẩn danh ” cho phép bạn xác định và gọi chúng trong một bước. Bạn không cần
create or replacetrước vàcallsau — điều này đặc biệt hữu ích khi gỡ lỗi. - Tôi đã chọn viết quy trình này bằng Python để sử dụng thư viện
tabulate. Thư viện này sẽ định dạng kết quả của một truy vấn để chúng trông đẹp mắt trên email gửi đi của chúng tôi. - Thư
tabulateviện đã được cung cấp bởi Anaconda trong Snowflake, vì vậy chúng tôi có thể sử dụng nó với dòngpackages = (‘tabulate’). - Với
result_scan(last_query_id(-1)Snowflake có thể truy cập kết quả của truy vấn cuối cùng được thực hiện — cho phéppretty_email_results()gửi email bất kỳ kết quả nào chúng tôi nhận được ở bước trước. - Snowpark cung cấp cho chúng tôi
sessionđối tượng trong thủ tục được lưu trữ của chúng tôi, mà chúng tôi có thể sử dụng để thực hiện quét kết quả vớisession.sql(). session.sql()cung cấp cho chúng tôi Khung dữ liệu Snowpark và gọi.to_pandas()nó sẽ nhận được Khung dữ liệu Pandas cho chúng tôi. Pandas'.to_markdown()sau đó được gọitabulate— và nó sẽ khiếu nại trừ khi bạn không yêu cầu gói này một cách rõ ràng vớipackages=(...).
Khi quá trình gỡ lỗi tương tác của bạn hoàn tất, bạn có thể chuyển mã sang một thủ tục được lưu trữ vĩnh viễn:
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 callercần thiết ở đây để thủ tục được lưu trữ có thể tìm thấy lịch sử truy vấn của người dùng gọi nó.runtime_version=3.8cần phải rõ ràng trong một thủ tục được lưu trữ vĩnh viễn.- Tôi đã thêm mã để bắt ngoại lệ và vẫn gửi một email đẹp.
- Tôi đã chuyển chủ đề và người nhận sang đối số thủ tục.
- Tôi đã thêm một
limit 100để ngăn gửi email có kích thước hàng TB.
call email_last_results('[email protected]', 'results from snowflake');
Giờ đây, một thủ tục lưu sẵn SQL đơn giản có thể chạy một truy vấn và yêu cầu thủ tục Python của chúng ta gửi kết quả qua email:
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
$$
;
- Để có được một bảng có tất cả các Ngày lễ trong 60 ngày tiếp theo , nó gọi UDTF đã xác định trước đó của tôi.
holidays Tạo tất cả các ngày lễ trong SQL — với Python UDTF
call run_query_and_email_it();
Snowflake có một bộ lập lịch tác vụ sẵn sàng cho các yêu cầu của bạn:
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();
Một số lưu ý:
- Tôi đã yêu cầu nó sử dụng kho hàng của tôi có tên là “s”. Snowflake cũng cung cấp Serverless Tasks , nhưng chúng không chạy các thủ tục lưu sẵn của Python.
- Tôi đã phải sửa đổi
holidays()UDF của mình bằng cách di chuyển các phần phụ thuộc Python.ziptừ giai đoạn người dùng sang giai đoạn được đặt tên . Khi nó tồn tại trong giai đoạn người dùng của tôi, tác vụ đã gây ra lỗiRemote file ‘holidays.zip’ was not found. - Thay đổi lịch trình thành mọi
1 minutenếu bạn cần gỡ lỗi.
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
Đừng quá lo lắng về việc xây dựng một hệ thống cảnh báo — Snowflake đã phát triển hệ thống này ( hiện ở chế độ xem trước riêng tư ):
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’
)
- Hãy thử điều này với tài khoản dùng thử miễn phí Snowflake — bạn chỉ cần một địa chỉ email để bắt đầu.
- Chơi với các tùy chọn định dạng cung
tabulatecấp.

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































