Này Snowflake, gửi cho tôi một email

Nov 30 2022
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 email với Snowflake, giờ đây bạn chỉ cần một lệnh gọi SQL: 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 biểu và một số mã định dạng — vì vậy, mỗi sáng từ Thứ Hai đến Thứ Sáu, chúng ta 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.

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.

Hình ảnh được tạo bởi AI

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:

Một email được gửi bởi Snowflake, với các Ngày lễ sắp tới

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òng packages = (‘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ép pretty_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ới session.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ọi tabulate— 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ới packages=(...).

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
$$
;

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ỗi Remote 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.
Hình ảnh do AI tạo ra