מדריך לתרגום SQL ב-Snowflake

במאמר הזה מפורטים הדמיון וההבדלים בתחביר SQL בין Snowflake לבין BigQuery, כדי לעזור לכם לתכנן ולבצע מהר יותר את המעבר של מחסן הנתונים הארגוני (EDW) שלכם ל-BigQuery. מחסן הנתונים של Snowflake מיועד לעבוד עם תחביר SQL ספציפי ל-Snowflake. יכול להיות שתצטרכו לשנות סקריפטים שנכתבו עבור Snowflake כדי שתוכלו להשתמש בהם ב-BigQuery, כי יש הבדלים בניבי ה-SQL בין השירותים. אפשר להשתמש בתרגום SQL באצווה כדי להעביר את סקריפטים של SQL בכמות גדולה, או בתרגום SQL אינטראקטיבי כדי לתרגם שאילתות אד-הוק. שני הכלים תומכים ב-Snowflake SQL בגרסת preview.

סוגי נתונים

בקטע הזה מוצגים סוגי נתונים מקבילים ב-Snowflake וב-BigQuery.



פתית שלג BigQuery הערות
NUMBER/ DECIMAL/NUMERIC NUMERIC/BIGNUMERIC אפשר למפות אותו ל-NUMERIC או ל-BIGNUMERIC, בהתאם לדיוק ולסולם.

סוג הנתונים NUMBER ב-Snowflake תומך ב-38 ספרות של דיוק ו-37 ספרות של קנה מידה. אפשר לציין את רמת הדיוק וההיקף לפי המשתמש.

‫BigQuery תומך ב-NUMERIC וב-BIGNUMERIC עם דיוק וקנה מידה שמוגדרים באופן אופציונלי בתוך גבולות מסוימים.
INT/INTEGER BIGNUMERIC INT/INTEGER וכל סוגי הנתונים האחרים שדומים ל-INT, כמו BIGINT, TINYINT, SMALLINT, BYTEINT, מייצגים כינוי לסוג הנתונים NUMBER, שבו אי אפשר לציין את הדיוק והקנה מידה, והם תמיד NUMBER(38, 0)

אפשר להשתמש באפשרות ההגדרה REWRITE_ZERO_SCALE_NUMERIC_AS_INTEGER כדי להמיר במקום זאת את INTEGER ואת הסוגים שקשורים אליו ל-INT64.
BIGINT BIGNUMERIC
SMALLINT BIGNUMERIC
TINYINT BIGNUMERIC
BYTEINT BIGNUMERIC
FLOAT/
FLOAT4/
FLOAT8
FLOAT64 סוג הנתונים FLOAT ב-Snowflake קובע ש-NaN גדול מ-X, כאשר X הוא כל ערך FLOAT (שאינו NaN).

סוג הנתונים FLOAT ב-BigQuery מגדיר את הערך NaN כ-< X, כאשר X הוא כל ערך FLOAT (חוץ מ-NaN עצמו).
DOUBLE/
DOUBLE PRECISION/

REAL
FLOAT64 סוג הנתונים DOUBLE ב-Snowflake זהה לסוג הנתונים FLOAT ב-Snowflake, אבל בדרך כלל הוא מוצג באופן שגוי כ-FLOAT. הוא מאוחסן בצורה תקינה כ-DOUBLE.
VARCHAR STRING אורך הנתונים המקסימלי של סוג הנתונים VARCHAR ב-Snowflake הוא 16MB (לא דחוס). אם לא מציינים אורך, ברירת המחדל היא האורך המקסימלי.

סוג הנתונים STRING ב-BigQuery מאוחסן כ-Unicode בקידוד UTF-8 באורך משתנה. האורך המקסימלי הוא 16,000 תווים.
CHAR/CHARACTER STRING האורך המקסימלי של סוג הנתונים CHAR ב-Snowflake הוא 1.
STRING/TEXT STRING סוג הנתונים STRING ב-Snowflake זהה ל-VARCHAR ב-Snowflake.
BINARY BYTES
VARBINARY BYTES
BOOLEAN BOOL סוג הנתונים BOOL ב-BigQuery יכול לקבל רק TRUE/FALSE, בניגוד לסוג הנתונים BOOL ב-Snowflake, שיכול לקבל TRUE/FALSE/NULL.
DATE DATE הסוג DATE ב-Snowflake מקבל את רוב פורמטי התאריכים הנפוצים, בניגוד לסוג DATE ב-BigQuery, שמקבל רק תאריכים בפורמט 'YYYY-[M]M-[D]D'.
TIME TIME הסוג TIME ב-Snowflake תומך ב-0 עד 9 ננו-שניות של דיוק, בעוד שהסוג TIME ב-BigQuery תומך ב-0 עד 6 ננו-שניות של דיוק.
TIMESTAMP DATETIME TIMESTAMP הוא כינוי שניתן להגדרה על ידי המשתמש, ומוגדר כברירת מחדל כ-TIMESTAMP_NTZ, שממופה ל-DATETIME ב-BigQuery.
TIMESTAMP_LTZ TIMESTAMP
TIMESTAMP_NTZ/DATETIME DATETIME
TIMESTAMP_TZ TIMESTAMP
OBJECT JSON הסוג OBJECT ב-Snowflake לא תומך בערכים עם הקלדה מפורשת. הערכים הם מסוג VARIANT.
VARIANT JSON הסוג OBJECT ב-Snowflake לא תומך בערכים עם הקלדה מפורשת. הערכים הם מסוג VARIANT.
ARRAY ARRAY<JSON> הסוג ARRAY ב-Snowflake יכול לתמוך רק בסוגים VARIANT, בעוד שהסוג ARRAY ב-BigQuery יכול לתמוך בכל סוגי הנתונים, למעט מערך עצמו.

ב-BigQuery יש גם את סוגי הנתונים הבאים, שאין להם מקבילה ישירה ב-Snowflake:

תחביר של שאילתות ואופרטורים של שאילתות

בקטע הזה מוסבר על ההבדלים בתחביר של שאילתות בין Snowflake לבין BigQuery.

SELECT דוחות

רוב ההצהרות של Snowflake SELECT תואמות ל-BigQuery. בטבלה הבאה מפורטים כמה הבדלים קלים.

פתית שלג BigQuery

SELECT TOP ...

FROM table

SELECT expression

FROM table

ORDER BY expression DESC

LIMIT number

SELECT

x/total AS probability,

ROUND(100 * probability, 1) AS pct

FROM raw_data


הערה: ב-Snowflake אפשר ליצור כינוי ולהפנות אליו באותה הצהרת SELECT.

SELECT

x/total AS probability,

ROUND(100 * (x/total), 1) AS pct

FROM raw_data

SELECT * FROM (

VALUES (1), (2), (3)

)

SELECT AS VALUE STRUCT(1, 2, 3)

כברירת מחדל, כינויים ומזהים ב-Snowflake הם לא תלויי-רישיות. כדי לשמור על האותיות הרישיות והקטנות, צריך להוסיף מירכאות כפולות (") לשמות ולמזהים.

סעיף FROM

סעיף FROM בשאילתה מציין את הטבלאות, התצוגות, שאילתות המשנה או פונקציות הטבלה שאפשר להשתמש בהן בהצהרת SELECT. כל ההפניות האלה לטבלאות נתמכות ב-BigQuery.

בטבלה הבאה מפורטים כמה הבדלים קלים.

פתית שלג BigQuery

SELECT $1, $2 FROM (VALUES (1, 'one'), (2, 'two'));

WITH table1 AS
(
SELECT STRUCT(1 as number, 'one' as spelling)
UNION ALL
SELECT STRUCT(2 as number, 'two' as spelling)
)
SELECT *
FROM table1

SELECT* FROM table SAMPLE(10)

SELECT* FROM table

TABLESAMPLE

BERNOULLI (0.1 PERCENT)

SELECT * FROM table1 AT(TIMESTAMP => timestamp) SELECT * FROM table1 BEFORE(STATEMENT => statementID)

SELECT * FROM table

FOR SYSTEM_TIME AS OF timestamp


הערה: אין ב-BigQuery חלופה ישירה לשימוש ב-BEFORE במזהה של הצהרה ב-Snowflake. הערך של חותמת הזמן לא יכול להיות מלפני יותר מ-7 ימים מחותמת הזמן הנוכחית.

@[namespace]<stage_name>[/path]

‫BigQuery לא תומך במושג של קבצים זמניים.

SELECT*

FROM table

START WITH predicate

CONNECT BY

[PRIOR] col1 = [PRIOR] col2

[, ...]

...

ב-BigQuery אין חלופה ישירה ל-CONNECT BY של Snowflake.

אפשר להפנות לטבלאות BigQuery בסעיף FROM באמצעות:

  • [project_id].[dataset_id].[table_name]
  • [dataset_id].[table_name]
  • [table_name]

‫BigQuery תומך גם בהפניות נוספות לטבלאות:

  • גרסאות היסטוריות של הגדרת הטבלה והשורות באמצעות FOR SYSTEM_TIME AS OF
  • נתיבי שדות, או כל נתיב שמוביל לשדה בתוך סוג נתונים (כלומר, STRUCT)
  • מערכים שטוחים

סעיף WHERE

הפסקה Snowflake WHERE והפסקה BigQuery WHERE זהות, למעט ההבדלים הבאים:

פתית שלג BigQuery

SELECT col1, col2 FROM table1, table2 WHERE col1 = col2(+)

SELECT col1, col2
FROM table1 INNER JOIN table2
ON col1 = col2

הערה: BigQuery לא תומך בתחביר (+) עבור JOINs

JOIN סוגים

גם Snowflake וגם BigQuery תומכים בסוגי הצירוף הבאים:

גם Snowflake וגם BigQuery תומכים בפסוקיתONandUSING.

בטבלה הבאה מפורטים כמה הבדלים קלים.

פתית שלג BigQuery

SELECT col1

FROM table1

NATURAL JOIN

table2

SELECT col1

FROM table1

INNER JOIN

table2

USING (col1, col2 [, ...])


הערה: ב-BigQuery, סעיפי JOIN דורשים תנאי JOIN, אלא אם מדובר ב-CROSS JOIN או שאחת מהטבלאות המצורפות היא שדה בתוך סוג נתונים או מערך.

SELECT ... FROM table1 AS t1, LATERAL ( SELECT*

FROM table2 AS t2

WHERE t1.col = t2.col )


הערה: בניגוד לפלט של צירוף לא לרוחב, הפלט של צירוף לרוחב כולל רק את השורות שנוצרו מהתצוגה המובנית. אין צורך לצרף את השורות בצד ימין לשורות בצד שמאל, כי השורות בצד שמאל כבר נלקחו בחשבון כשעברו לתצוגה המובנית.

SELECT ... FROM table1 as t1 LEFT JOIN table2 as t2

ON t1.col = t2.col

הערה: ב-BigQuery אין חלופה ישירה ל-LATERAL JOINs.

סעיף WITH

סעיף WITH של BigQuery מכיל שאילתות משנה בעלות שם אחת או יותר, שמופעלות בכל פעם שהצהרת SELECT עוקבת מפנה אליהן. התנהגות של סעיפים ב-Snowflake WITH זהה להתנהגות שלהם ב-BigQuery, למעט העובדה ש-BigQuery לא תומך ב-WITH RECURSIVE.

סעיף GROUP BY

‫Snowflake תומך בסעיפים GROUP BY GROUP BY, GROUP BY ROLLUP, GROUP BY GROUPING SETS, ו-GROUP BY CUBE, בעוד ש-BigQuery תומך בסעיפים GROUP BY GROUP BY, GROUP BY ALL, GROUP BY ROLLUP, GROUP BY GROUPING SETS, ו-GROUP BY CUBE.

‫Snowflake HAVING ו-BigQuery HAVING הם שמות נרדפים. חשוב לזכור שHAVING מתרחש אחרי GROUP BY וצבירה, ולפני ORDER BY.

פתית שלג BigQuery

SELECT col1 as one, col2 as two

FROM table GROUP BY (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY ROLLUP (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY ROLLUP (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY GROUPING SETS (one, 2)


הערה: ב-Snowflake אפשר להשתמש בעד 128 קבוצות קיבוץ באותו בלוק שאילתות

SELECT col1 as one, col2 as two

FROM table GROUP BY GROUPING SETS (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY CUBE (one,2)


הערה: ב-Snowflake אפשר להשתמש בעד 7 רכיבים (128 קבוצות קיבוץ) בכל קובייה

SELECT col1 as one, col2 as two

FROM table GROUP BY CUBE (one, 2)

סעיף ORDER BY

יש כמה הבדלים קלים בין פסקי Snowflake ORDER BY לבין פסקי BigQuery ORDER BY.

פתית שלג BigQuery
ב-Snowflake, כברירת מחדל, הערך NULL ממוקם אחרון (סדר עולה). ב-BigQuery, ‏ NULLS מדורגים ראשונים כברירת מחדל (סדר עולה).
אפשר לציין אם ערכי NULL צריכים להיות מסודרים ראשונים או אחרונים באמצעות NULLS FIRST או NULLS LAST, בהתאמה. אין ב-BigQuery אפשרות מקבילה לציין אם הערכים של NULL צריכים להיות ראשונים או אחרונים.

סעיף LIMIT/FETCH

הסעיף LIMIT/FETCH ב-Snowflake מגביל את המספר המקסימלי של השורות שמוחזרות על ידי הצהרה או שאילתת משנה. ‫LIMIT (תחביר של Postgres) ו-FETCH (תחביר של ANSI) מניבים את אותה תוצאה.

ב-Snowflake וב-BigQuery, הוספת פסקה של LIMIT לשאילתה לא משפיעה על כמות הנתונים שנקראים.

פתית שלג BigQuery

SELECT col1, col2

FROM table

ORDER BY col1

LIMIT count OFFSET start


SELECT ...

FROM ...

ORDER BY ...

OFFSET start {[ROW | ROWS]} FETCH {[FIRST | NEXT]} count

{[ROW | ROWS]} [ONLY]


הערה: NULL, מחרוזת ריקה ('') וערכים של $$$$ מתקבלים ומתפרשים כ'ללא הגבלה'. השימוש העיקרי הוא במחברים ובדרייברים.

SELECT col1, col2

FROM table

ORDER BY col1

LIMIT count OFFSET start


הערה: BigQuery לא תומך ב-FETCH. ‫LIMIT מחליף את FETCH.

הערה: ב-BigQuery, צריך להשתמש ב-OFFSET יחד עם LIMIT count. כדי להשיג את הביצועים הטובים ביותר, חשוב להגדיר את הערך count INT64 למספר המינימלי של השורות המוזמנות שנדרשות. סידור של כל שורות התוצאות שלא לצורך יוביל לביצועים גרועים יותר של שאילתת הביצוע.

סעיף QUALIFY

הסעיף QUALIFY ב-Snowflake מאפשר לסנן תוצאות של פונקציות חלון באופן דומה למה ש-HAVING עושה עם פונקציות מצטברות וסעיפי GROUP BY.

פתית שלג BigQuery

SELECT col1, col2 FROM table QUALIFY ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2) = 1;

הפסוקית QUALIFY של Snowflake עם פונקציית ניתוח כמו ROW_NUMBER(),‏ COUNT() ועם OVER PARTITION BY מבוטאת ב-BigQuery כפסוקית WHERE בשאילתת משנה שמכילה את ערך הניתוח.

שימוש ב-ROW_NUMBER():

SELECT col1, col2

FROM ( SELECT col1, col2

ROW NUMBER() OVER (PARTITION BY col1 ORDER by col2) RN FROM table ) WHERE RN = 1;


שימוש ב-ARRAY_AGG(), שתומך במחיצות גדולות יותר:

SELECT result.* FROM ( SELECT ARRAY_AGG(table ORDER BY table.col2 DESC LIMIT 1) [OFFSET(0)] FROM table

GROUP BY col1 ) AS result;

פונקציות

בקטעים הבאים מפורטות פונקציות של Snowflake והפונקציות המקבילות שלהן ב-BigQuery.

פונקציות צבירה

בטבלה הבאה מוצגים מיפויים בין פונקציות נפוצות של Snowflake לחישוב מצטבר, לניתוח מצטבר ולחישוב מצטבר משוער, לבין הפונקציות המקבילות שלהן ב-BigQuery.

פתית שלג BigQuery

ANY_VALUE([DISTINCT] expression) [OVER ...]


הערה: DISTINCT לא משפיע על

ANY_VALUE(expression) [OVER ...]

APPROX_COUNT_DISTINCT([DISTINCT] expression) [OVER ...]


הערה: DISTINCT לא משפיע על

APPROX_COUNT_DISTINCT(expression)


הערה: BigQuery לא תומך ב-APPROX_COUNT_DISTINCT עם פונקציות חלון

APPROX_PERCENTILE(expression, percentile) [OVER ...]


הערה: ב-Snowflake אין אפשרות RESPECT NULLS

APPROX_QUANTILES([DISTINCT] expression,100) [OFFSET((CAST(TRUNC(percentile * 100) as INT64))]


הערה: BigQuery לא תומך ב-APPROX_QUANTILES עם פונקציות חלון

APPROX_PERCENTILE_ACCUMULATE (expression)

‫BigQuery לא תומך באפשרות לאחסן מצב ביניים כשמבצעים חיזוי של ערכים משוערים.

APPROX_PERCENTILE_COMBINE(state)

‫BigQuery לא תומך באפשרות לאחסן מצב ביניים כשמבצעים חיזוי של ערכים משוערים.

APPROX_PERCENTILE_ESTIMATE(state, percentile)

‫BigQuery לא תומך באפשרות לאחסן מצב ביניים כשמבצעים חיזוי של ערכים משוערים.

APPROX_TOP_K(expression, [number [counters]]


הערה: אם לא מציינים פרמטר מספר, ברירת המחדל היא 1. הערך של המונה צריך להיות גדול משמעותית מהמספר.

APPROX_TOP_COUNT(expression, number)


הערה: BigQuery לא תומך ב-APPROX_TOP_COUNT עם פונקציות חלון.

APPROX_TOP_K_ACCUMULATE(expression, counters)

‫BigQuery לא תומך באפשרות לאחסן מצב ביניים כשמבצעים חיזוי של ערכים משוערים.

APPROX_TOP_K_COMBINE(state, [counters])

‫BigQuery לא תומך באפשרות לאחסן מצב ביניים כשמבצעים חיזוי של ערכים משוערים.

APPROX_TOP_K_ESTIMATE(state, [k])

‫BigQuery לא תומך באפשרות לאחסן מצב ביניים כשמבצעים חיזוי של ערכים משוערים.

APPROXIMATE_JACCARD_INDEX([DISTINCT] expression)


אפשר להשתמש בפונקציה בהגדרת המשתמש (UDF) כדי להטמיע את MINHASH עם k פונקציות גיבוב נפרדות. גישה נוספת לצמצום השונות ב-MINHASH היא לשמור
k של הערכים המינימליים של פונקציית גיבוב אחת. במקרה כזה, אפשר להעריך את מדד ג'קארד באופן הבא:

WITH

minhash_A AS (

SELECT DISTINCT FARM_FINGERPRINT(TO_JSON_STRING(t)) AS h

FROM TA AS t

ORDER BY h

LIMIT k),

minhash_B AS (

SELECT DISTINCT FARM_FINGERPRINT(TO_JSON_STRING(t)) AS h

FROM TB AS t

ORDER BY h

LIMIT k)

SELECT

COUNT(*) / k AS APPROXIMATE_JACCARD_INDEX

FROM minhash_A

INNER JOIN minhash_B

ON minhash_A.h = minhash_B.h

APPROXIMATE_SIMILARITY([DISTINCT] expression)


היא מילה נרדפת ל-APPROXIMATE_JACCARD_INDEX ואפשר להטמיע אותה באותה דרך.

ARRAY_AGG([DISTINCT] expression1) [WITHIN GROUP (ORDER BY ...)]

[OVER ([PARTITION BY expression2])]

Note: Snowflake does not support ability to IGNORE|RESPECT NULLS and to LIMIT directly in ARRAY_AGG.

ARRAY_AGG([DISTINCT] expression1

[{IGNORE|RESPECT}] NULLS] [ORDER BY ...] LIMIT ...])

[OVER (...)]

AVG([DISTINCT] expression) [OVER ...]

AVG([DISTINCT] expression) [OVER ...]


הערה: הפונקציה AVG של BigQuery לא מבצעת המרה אוטומטית של STRING.

BITAND_AGG(expression)

[OVER ...]

BIT_AND(expression) [OVER ...]

הערה: ב-BigQuery לא מתבצעת המרה מרומזת של עמודות מסוג תו/טקסט לערך INTEGER הקרוב ביותר.

BITOR_AGG(expression)

[OVER ...]

BIT_OR(expression)

[OVER ...]


הערה: BigQuery לא מבצע המרה מרומזת של עמודות מסוג תו או טקסט ל-INTEGER הקרוב ביותר.

BITXOR_AGG([DISTINCT] expression) [OVER ...]

BIT_XOR([DISTINCT] expression) [OVER ...]


הערה: BigQuery לא מבצע המרה מרומזת של עמודות מסוג תו או טקסט ל-INTEGER הקרוב ביותר.

BOOLAND_AGG(expression) [OVER ...]


הערה: ב-Snowflake אפשר להתייחס לערכים מספריים, עשרוניים וצפים כאל TRUE אם הם לא אפס.

LOGICAL_AND(expression)

[OVER ...]

BOOLOR_AGG(expression)

[OVER ...]


הערה: ב-Snowflake אפשר להתייחס לערכים מספריים, עשרוניים וצפים כאל TRUE אם הם לא אפס.

LOGICAL_OR(expression)

[OVER ...]

BOOLXOR_AGG(expression)

[OVER ([PARTITION BY <partition_expr> ])


הערה: ב-Snowflake אפשר להתייחס לערכים מספריים, עשרוניים וצפים כאל TRUE אם הם לא אפס.
לביטוי מספרי:

SELECT

CASE COUNT(*)

WHEN 1 THEN TRUE

WHEN 0 THEN NULL

ELSE FALSE

END AS BOOLXOR_AGG

FROM T

WHERE expression != 0


כדי להשתמש ב-OVER, אפשר להריץ את הפקודה הבאה (דוגמה בוליאנית):

SELECT

CASE COUNT(expression) OVER (PARTITION BY partition_expr)

WHEN 0 THEN NULL

ELSE

CASE COUNT(

CASE expression

WHEN TRUE THEN 1

END) OVER (PARTITION BY partition_expr)

WHEN 1 THEN TRUE

ELSE FALSE

END

END AS BOOLXOR_AGG

FROM T

CORR(dependent, independent)

[OVER ...]

CORR(dependent, independent)

[OVER ...]

COUNT([DISTINCT] expression [,expression2]) [OVER ...]

COUNT([DISTINCT] expression [,expression2]) [OVER ...]

COVAR_POP(dependent, independent) [OVER ...]

COVAR_POP(dependent, independent) [OVER ...]

COVAR_SAMP(dependent, independent)

[OVER ...]

COVAR_SAMP(dependent, independent)

[OVER ...]

GROUPING(expression1, [,expression2...])

ב-BigQuery אין חלופה ישירה ל-GROUPING של Snowflake. זמין דרך פונקציה בהגדרת המשתמש.

GROUPING_ID(expression1, [,expression2...])

ב-BigQuery אין חלופה ישירה ל-GROUPING_ID של Snowflake. זמין דרך פונקציה בהגדרת המשתמש.

HASH_AGG([DISTINCT] expression1, [,expression2])

[OVER ...]

SELECT
BIT_XOR(
FARM_FINGERPRINT(
TO_JSON_STRING(t))) [OVER]
FROM t

SELECT HLL([DISTINCT] expression1, [,expression2])

[OVER ...]


הערה: אי אפשר לציין את רמת הדיוק ב-Snowflake.

SELECT HLL_COUNT.EXTRACT(sketch) FROM (

SELECT HLL_COUNT.INIT(expression)

AS sketch FROM table )


הערה: BigQuery לא תומך ב-HLL_COUNT… עם פונקציות חלון. משתמש לא יכול לכלול כמה ביטויים בפונקציית HLL_COUNT... אחת.

HLL_ACCUMULATE([DISTINCT] expression)


הערה: אי אפשר לציין את רמת הדיוק ב-Snowflake.
HLL_COUNT.INIT(expression [, precision])

HLL_COMBINE([DISTINCT] state)

HLL_COUNT.MERGE_PARTIAL(סקיצה)

HLL_ESTIMATE(state)

HLL_COUNT.EXTRACT(sketch)

HLL_EXPORT(binary)

ב-BigQuery אין חלופה ישירה ל-HLL_EXPORT של Snowflake.

HLL_IMPORT(object)

ב-BigQuery אין חלופה ישירה ל-HLL_IMPORT של Snowflake.

KURTOSIS(expression)

[OVER ...]

ב-BigQuery אין חלופה ישירה ל-KURTOSIS של Snowflake.

LISTAGG(

[DISTINCT] aggregate_expression

[, delimiter]

)

[OVER ...]

STRING_AGG(

[DISTINCT] aggregate_expression

[, delimiter]

)

[OVER ...]

MEDIAN(expression) [OVER ...]


הערה: Snowflake לא תומכת באפשרות IGNORE|RESPECT NULLS וגם לא באפשרות LIMIT ישירות ב-ARRAY_AGG.

PERCENTILE_CONT(

value_expression,

0.5

[ {RESPECT | IGNORE} NULLS]

) OVER()

MAX(expression) [OVER ...]


MIN(expression) [OVER ...]

MAX(expression) [OVER ...]


MIN(expression) [OVER ...]

MINHASH(k, [DISTINCT] expressions)

אפשר להשתמש ב-UDF מותאם אישית כדי להטמיע את הפונקציה MINHASH עם k פונקציות גיבוב שונות. גישה נוספת לצמצום השונות ב-MINHASH היא לשמור על k של הערכים המינימליים של פונקציית גיבוב אחת: SELECT DISTINCT
FARM_FINGERPRINT(
TO_JSON_STRING(t)) AS MINHASH

FROM t

ORDER BY MINHASH

LIMIT k

MINHASH_COMBINE([DISTINCT] state)

<code<select
FROM (
SELECT DISTINCT
FARM_FINGERPRINT(
TO_JSON_STRING(t)) AS h
FROM TA AS t
ORDER BY h
LIMIT k
UNION
SELECT DISTINCT
FARM_FINGERPRINT(
TO_JSON_STRING(t)) AS h
FROM TB AS t
ORDER BY h
LIMIT k
)
ORDER BY h
LIMIT k

MODE(expr1)

OVER ( [ PARTITION BY <expr2> ] )

SELECT expr1

FROM (

SELECT

expr1,

ROW_NUMBER() OVER (

PARTITION BY expr2

ORDER BY cnt DESC) rn

FROM (

SELECT

expr1,

expr2,

COUNTIF(expr1 IS NOT NULL) OVER

(PARTITION BY expr2, expr1) cnt

FROM t))

WHERE rn = 1

OBJECT_AGG(key, value) [OVER ...]

אפשר להשתמש ב-TO_JSON_STRING כדי להמיר ערך למחרוזת בפורמט JSON

PERCENTILE_CONT(percentile) WITHIN GROUP (ORDER BY value_expression)

[OVER ...]

PERCENTILE_CONT(

value_expression,

percentile

[ {RESPECT | IGNORE} NULLS]

) OVER()

PERCENTILE_DISC(percentile) WITHIN GROUP (ORDER BY value_expression)

[OVER ...]

PERCENTILE_DISC(

value_expression,

percentile

[ {RESPECT | IGNORE} NULLS]

) OVER()

REGR_AVGX(dependent, independent)

[OVER ...]

SELECT AVG(independent) [OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

REGR_AVGY(dependent, independent)

[OVER ...]

SELECT AVG(dependent) [OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

REGR_COUNT(dependent, independent)

[OVER ...]

SELECT COUNT(*) [OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

REGR_INTERCEPT(dependent, independent)

[OVER ...]

SELECT

AVG(dependent) -

COVAR_POP(dependent,independent)/

VAR_POP(dependent) *

AVG(independent)

[OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

REGR_R2(dependent, independent)

[OVER ...]

SELECT

CASE

WHEN VAR_POP(independent) = 0

THEN NULL

WHEN VAR_POP(dependent) = 0 AND VAR_POP(independent) != 0

THEN 1

ELSE POWER(CORR(dependent, independent), 2)

END AS ...

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

REGR_SLOPE(dependent, independent)

[OVER ...]

SELECT

COVAR_POP(dependent,independent)/

VAR_POP(dependent)

[OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

REGR_SXX(dependent, independent)

[OVER ...]

SELECT COUNT(*)*VAR_POP(independent)

[OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

REGR_SYY(dependent, independent)

[OVER ...]

SELECT COUNT(*)*VAR_POP(dependent)

[OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

SKEW(expression)

ב-BigQuery אין חלופה ישירה ל- SKEW של Snowflake.

STDDEV([DISTINCT] expression)

[OVER ...]

STDDEV([DISTINCT] expression)

[OVER ...]

STDDEV_POP([DISTINCT] expression)

[OVER ...]

STDDEV_POP([DISTINCT] expression)

[OVER ...]

STDDEV_SAMP([DISTINCT] expression)

[OVER ...]

STDDEV_SAMP([DISTINCT] expression)

[OVER ...]

SUM([DISTINCT] expression)

[OVER ...]

SUM([DISTINCT] expression)

[OVER ...]

VAR_POP([DISTINCT] expression)

[OVER ...]


הערה: Snowflake תומך בהמרת VARCHARs לערכים של נקודה צפה.

VAR_POP([DISTINCT] expression)

[OVER ...]

VARIANCE_POP([DISTINCT] expression)

[OVER ...]


הערה: Snowflake תומך בהמרת VARCHARs לערכים של נקודה צפה.

VAR_POP([DISTINCT] expression)

[OVER ...]

VAR_SAMP([DISTINCT] expression)

[OVER ...]


הערה: Snowflake תומך בהמרת VARCHARs לערכים של נקודה צפה.

VAR_SAMP([DISTINCT] expression)

[OVER ...]

VARIANCE([DISTINCT] expression)

[OVER ...]


הערה: Snowflake תומך בהמרת VARCHARs לערכים של נקודה צפה.

VARIANCE([DISTINCT] expression)

[OVER ...]

ב-BigQuery יש גם את הפונקציות הבאות של צבירה, צבירה אנליטית וצבירה משוערת, שאין להן מקבילה ישירה ב-Snowflake:

פונקציות של ביטויים ברמת הביט

בטבלה הבאה מוצגים מיפויים בין פונקציות נפוצות של ביטויים בינאריים ב-Snowflake לבין הפונקציות המקבילות ב-BigQuery.

אם סוג הנתונים של ביטוי הוא לא INTEGER, מערכת Snowflake מנסה לבצע המרה (cast) ל-INTEGER. עם זאת, BigQuery לא מנסה לבצע המרה ל-INTEGER.

פתית שלג BigQuery

BITAND(expression1, expression2)

BIT_AND(x) FROM UNNEST([expression1, expression2]) AS x expression1 & expression2

BITNOT(expression)

~ expression

BITOR(expression1, expression2)

BIT_OR(x) FROM UNNEST([expression1, expression2]) AS x


expression1 | expression2

BITSHIFTLEFT (expression, n)

expression << n

BITSHIFTRIGHT

(expression, n)

expression >> n

BITXOR(expression, expression)


הערה: Snowflake לא תומך ב-DISTINCT.

BIT_XOR([DISTINCT] x) FROM UNNEST([expression1, expression2]) AS x


expression ^ expression

פונקציות של ביטויים מותנים

בטבלה הבאה מוצגים מיפויים בין ביטויים נפוצים של תנאים ב-Snowflake לבין הביטויים המקבילים ב-BigQuery.

פתית שלג BigQuery

expression [ NOT ] BETWEEN lower AND upper

(expression >= lower AND expression <= upper)

BOOLAND(expression1, expression2)


הערה: ב-Snowflake אפשר להתייחס לערכים מספריים, עשרוניים וצפים כאל TRUE אם הם לא אפס.

LOGICAL_AND(x)

FROM UNNEST([expression1, expression2]) AS x


expression1 AND expression2

BOOLNOT(expression1)


הערה: ב-Snowflake אפשר להתייחס לערכים מספריים, עשרוניים וצפים כאל TRUE אם הם לא אפס.

NOT expression

BOOLOR

הערה: ב-Snowflake אפשר להתייחס לערכים מספריים, עשרוניים וצפים כאל TRUE אם הם לא אפס.

LOGICAL_OR(x) FROM UNNEST([expression1, expression2]) AS x


expression1 OR expression2

BOOLXOR

הערה: ב-Snowflake אפשר להתייחס לערכים מספריים, עשרוניים וצפים כאל TRUE אם הם לא אפס.
ב-BigQuery אין תמיכה בחלופה ישירה ל-BOOLXOR. של Snowflake

CASE [expression] WHEN condition1 THEN result1 [WHEN condition2 THEN result2]

[...]

[ELSE result3]

END

CASE [expression] WHEN condition1 THEN result1 [WHEN condition2 THEN result2]

[...]

[ELSE result3]

END

COALESCE(expr1, expr2, [,...])


הערה: ב-Snowflake נדרשות לפחות שתי הבעות. ב-BigQuery נדרש רק אחד.

COALESCE(expr1, [,...])

DECODE(expression, search1, result1, [search2, result2...] [,default])

CASE [expression] WHEN condition1 THEN result1 [WHEN condition2 THEN result2]

[...]

[ELSE result3]

END

הערה: BigQuery תומך בשאילתות משנה בהצהרות של תנאים. אפשר להשתמש בזה כדי לשחזר את DECODE של Snowflake. המשתמש צריך להשתמש ב-IS NULL במקום ב-= NULL כדי להתאים בין ביטויי בחירה של NULL לבין ביטויי חיפוש של NULL.

EQUAL_NULL(expression1, expression2)

ב-BigQuery אין תמיכה בחלופה ישירה ל-EQUAL_NULL. של Snowflake

GREATEST(expression1, [,expression2]...)

GREATEST(expression1, [,expression2]...)

IFF(condition, true_result, false_result)

IF(condition, true_result, false_result)

IFNULL(expression1, expression2)

IFNULL(expression1, expression2)

[ NOT ] IN ...

[ NOT ] IN ...

expression1 IS [ NOT ] DISTINCT FROM expression2

ב-BigQuery אין תמיכה בחלופה ישירה ל-IS [ NOT ] DISTINCT FROM. של Snowflake

expression IS [ NOT ] NULL

expression IS [ NOT ] NULL

IS_NULL_VALUE(variant_expr)

‫BigQuery לא תומך בסוגי הנתונים VARIANT.

LEAST(expression,...)

LEAST(expression,...)

NULLIF(expression1,expression2)

NULLIF(expression1,expression2)

NVL(expression1, expression2)

IFNULL(expression1,expression2)

NVL2(expr1,expr2,expr2)

IF(expr1 IS NOT NULL, expr2,expr3)

REGR_VALX(expr1,expr2)

IF(expr1 IS NULL, NULL, expr2)

הערה: BigQuery לא תומך בחלופה ישירה לפונקציות REGR... של Snowflake.

REGR_VALY(expr1,expr2)

IF(expr2 IS NULL, NULL, expr1)


הערה: BigQuery לא תומך בחלופה ישירה לפונקציות של Snowflake REGR... .

ZEROIFNULL(expression)

IFNULL(expression,0)

פונקציות הקשר

בטבלה הבאה מוצגים מיפויים בין פונקציות נפוצות של הקשר ב-Snowflake לבין הפונקציות המקבילות ב-BigQuery.

פתית שלג BigQuery

CURRENT_ACCOUNT()

SESSION_USER()


הערה: אין השוואה ישירה. ב-Snowflake מוחזר מזהה החשבון, וב-BigQuery מוחזרת כתובת האימייל של המשתמש.

CURRENT_CLIENT()

מושג שלא נמצא בשימוש ב-BigQuery

CURRENT_DATABASE()

SELECT catalog_name

FROM INFORMATION_SCHEMA.SCHEMATA

הפונקציה מחזירה טבלה של שמות הפרויקטים. ההשוואה לא ישירה.

CURRENT_DATE[()]


הערה: כדי לעמוד בתקני ANSI,‏ Snowflake לא מחייבת להוסיף '()' אחרי הפקודה CURRENT_DATE.

CURRENT_DATE([timezone])


הערה: CURRENT_DATE ב-BigQuery אפשר לציין אזור זמן.

CURRENT_REGION()

SELECT location

FROM INFORMATION_SCHEMA.SCHEMATA


הערה: הפונקציה INFORMATION_SCHEMA.SCHEMATA של BigQuery מחזירה הפניות מיקום כלליות יותר מאשר הפונקציה CURRENT_REGION() של Snowflake. ההשוואה לא ישירה.

CURRENT_ROLE()

מושג שלא נמצא בשימוש ב-BigQuery

CURRENT_SCHEMA()

SELECT schema_name

FROM INFORMATION_SCHEMA.SCHEMATA

הפונקציה מחזירה טבלה של כל מערכי הנתונים (שנקראים גם סכימות) שזמינים בפרויקט או באזור. ההשוואה לא ישירה.

CURRENT_SCHEMAS()

מושג שלא נמצא בשימוש ב-BigQuery

CURRENT_SESSION()

מושג שלא נמצא בשימוש ב-BigQuery

CURRENT_STATEMENT()

SELECT query

FROM INFORMATION_SCHEMA.JOBS_BY_*


הערה: INFORMATION_SCHEMA.JOBS_BY_* מאפשר לחפש שאילתות לפי סוג העבודה, סוג ההתחלה/הסיום וכו'.

CURRENT_TIME[([frac_sec_prec])]


הערה: ב-Snowflake אפשר להגדיר דיוק אופציונלי של שבריר שנייה. הערכים התקינים הם 0 עד 9 ננו-שניות. ערך ברירת המחדל הוא 9. כדי לעמוד בדרישות של ANSI, אפשר לקרוא לפונקציה הזו בלי '()'.

CURRENT_TIME()

CURRENT_TIMESTAMP[([frac_sec_prec])]


הערה: ב-Snowflake אפשר להגדיר דיוק אופציונלי של שבריר שנייה. הערכים התקינים הם 0 עד 9 ננו-שניות. ערך ברירת המחדל הוא 9. כדי לעמוד בדרישות של ANSI, אפשר לקרוא לפונקציה הזו בלי '()'. מגדירים את TIMEZONE כפרמטר של סשן.

CURRENT_DATETIME([timezone]) CURRENT_TIMESTAMP()


הערה: CURRENT_DATETIME מחזירה את סוג הנתונים DATETIME (לא נתמך ב-Snowflake). ‫CURRENT_TIMESTAMP מחזירה את סוג הנתונים TIMESTAMP.

CURRENT_TRANSACTION()

SELECT job_id

FROM INFORMATION_SCHEMA.JOBS_BY_*

הערה: INFORMATION_SCHEMA.JOBS_BY_* ב-BigQuery מאפשר לחפש מזהי משימות לפי סוג העבודה, סוג ההתחלה/הסיום וכו'.

CURRENT_USER[()]


הערה: כדי לעמוד בתקני ANSI,‏ Snowflake לא מחייבת להוסיף '()' אחרי הפקודה CURRENT_USER.

SESSION_USER()


SELECT user_email

FROM INFORMATION_SCHEMA.JOBS_BY_*

הערה: אין השוואה ישירה. ‫Snowflake מחזירה את שם המשתמש, ו-BigQuery מחזירה את כתובת האימייל של המשתמש.

CURRENT_VERSION()

מושג שלא נמצא בשימוש ב-BigQuery

CURRENT_WAREHOUSE()

SELECT catalg_name

FROM INFORMATION_SCHEMA.SCHEMATA

LAST_QUERY_ID([num])

SELECT job_id

FROM INFORMATION_SCHEMA.JOBS_BY_*


הערה: INFORMATION_SCHEMA.JOBS_BY_* ב-BigQuery מאפשר חיפוש מזהי משימות לפי סוג העבודה, סוג ההתחלה/הסיום וכו'.

LAST_TRANSACTION()

SELECT job_id

FROM INFORMATION_SCHEMA.JOBS_BY_*


הערה: INFORMATION_SCHEMA.JOBS_BY_* ב-BigQuery מאפשר חיפוש מזהי משימות לפי סוג העבודה, סוג ההתחלה/הסיום וכו'.

LOCALTIME()


הערה: כדי לעמוד בתקני ANSI,‏ Snowflake לא מחייבת להוסיף '()' אחרי הפקודה LOCALTIME.

CURRENT_TIME()

LOCALTIMESTAMP()

CURRENT_DATETIME([timezone]) CURRENT_TIMESTAMP()


הערה: CURRENT_DATETIME מחזירה את סוג הנתונים DATETIME (לא נתמך ב-Snowflake). ‫CURRENT_TIMESTAMP מחזירה את סוג הנתונים TIMESTAMP.

פונקציות המרה

בטבלה הבאה מוצגים מיפויים בין פונקציות המרה נפוצות ב-Snowflake לבין הפונקציות המקבילות ב-BigQuery.

חשוב לזכור שפונקציות שנראות זהות ב-Snowflake וב-BigQuery עשויות להחזיר סוגי נתונים שונים.

Snowflake BigQuery

CAST(expression AS type)


expression :: type

CAST(expression AS type)

TO_ARRAY(expression)

[expression]


ARRAY(subquery)

TO_BINARY(expression[, format])


הערה: Snowflake תומך בהמרה של HEX, BASE64 ו-UTF-8. ‫Snowflake תומך גם ב-TO_BINARY באמצעות סוג הנתונים VARIANT. ב-BigQuery אין חלופה לסוג הנתונים VARIANT.

TO_HEX(CAST(expression AS BYTES)) TO_BASE64(CAST(expression AS BYTES))

CAST(expression AS BYTES)


הערה: ההמרה (casting) שמוגדרת כברירת מחדל ב-BigQuery משתמשת בקידוד UTF-8.STRING ב-Snowflake אין אפשרות לתמוך בקידוד BASE32.

TO_BOOLEAN(expression)


הערה:
  • INT64
    TRUE:
    אחרת, FALSE: 0
  • STRING
    TRUE: "true"/"t"/"yes"/"y"/"on"/"1", FALSE: "false"/"f"/"no"/"n"/"off"/"0"

CAST(expression AS BOOL)


הערה:
  • INT64
    TRUE:
    אחרת, FALSE: 0
  • STRING
    TRUE: "true", FALSE: "false"

TO_CHAR(expression[, format])


TO_VARCHAR(expression[, format])


הערה: מודלים של פורמטים של Snowflake זמינים כאן. ב-BigQuery אין חלופה לסוג הנתונים VARIANT.

CAST(expression AS STRING)


הערה: אפשר לעצב את ביטוי הקלט של BigQuery באמצעות FORMAT_DATE,‏ FORMAT_DATETIME,‏ FORMAT_TIME או FORMAT_TIMESTAMP.

TO_DATE(expression[, format])


DATE(expression[, format])


הערה: Snowflake תומכת באפשרות להמיר ישירות סוגים של INTEGER לסוגים של DATE. כאן אפשר למצוא את מודלים הפורמט של Snowflake. ב-BigQuery אין חלופה לסוג הנתונים VARIANT.

CAST(expression AS DATE)


הערה: אפשר לעצב את ביטוי הקלט של BigQuery באמצעות FORMAT, FORMAT_DATETIME או FORMAT_TIMESTAMP.

TO_DECIMAL(expression[, format]

[,precision[, scale]]


TO_NUMBER(expression[, format]

[,precision[, scale]]


TO_NUMERIC(expression[, format]

[,precision[, scale]]


הערה: אפשר למצוא את מודלים הפורמט של Snowflake לסוגי הנתונים DECIMAL, NUMBER ו-NUMERIC כאן. ב-BigQuery אין חלופה לסוג הנתונים VARIANT.

ROUND(CAST(expression AS NUMERIC)

, x)


הערה: אפשר לעצב את ביטוי הקלט של BigQuery באמצעות FORMAT.

TO_DOUBLE(expression[, format])


הערה: מודלים של פורמטים של Snowflake עבור DOUBLE סוגי נתונים זמינים כאן. ב-BigQuery אין חלופה לסוג הנתונים VARIANT.

CAST(expression AS FLOAT64)


הערה: אפשר לעצב את ביטוי הקלט של BigQuery באמצעות FORMAT.

TO_JSON(variant_expression)

ב-BigQuery אין חלופה לסוג הנתונים VARIANT של Snowflake.

TO_OBJECT(variant_expression)

ב-BigQuery אין חלופה לסוג הנתונים VARIANT של Snowflake.

TO_TIME(expression[, format])


TIME(expression[, format])


הערה: מודלים של פורמטים של Snowflake עבור STRING סוגי נתונים זמינים כאן. ב-BigQuery אין חלופה לסוג הנתונים VARIANT.

CAST(expression AS TIME)


הערה: ב-BigQuery אין חלופה לסוג הנתונים VARIANT של Snowflake. אפשר לעצב את ביטוי הקלט של BigQuery באמצעות FORMAT, FORMAT_DATETIME, FORMAT_TIMESTAMP או FORMAT_TIME.

TO_TIMESTAMP(expression[, scale])


TO_TIMESTAMP_LTZ(expression[, scale])


TO_TIMESTAMP_NTZ(expression[, scale])


TO_TIMESTAMP_TZ(expression[, scale])


הערה: ב-BigQuery אין חלופה לסוג הנתונים VARIANT.

CAST(expression AS TIMESTAMP)


הערה: אפשר לעצב את ביטוי הקלט של BigQuery באמצעות FORMAT, FORMAT_DATE, FORMAT_DATETIME, FORMAT_TIME. אפשר לכלול או לא לכלול את אזור הזמן באמצעות הפרמטרים FORMAT_TIMESTAMP.

TO_VARIANT(expression)

ב-BigQuery אין חלופה לסוג הנתונים VARIANT של Snowflake.

TO_XML(variant_expression)

ב-BigQuery אין חלופה לסוג הנתונים VARIANT של Snowflake.

TRY_CAST(expression AS type)

SAFE_CAST(expression AS type)

TRY_TO_BINARY(expression[, format])

TO_HEX(SAFE_CAST(expression AS BYTES)) TO_BASE64(SAFE_CAST(expression AS BYTES))

SAFE_CAST(expression AS BYTES)

TRY_TO_BOOLEAN(expression)

SAFE_CAST(expression AS BOOL)

TRY_TO_DATE(expression)

SAFE_CAST(expression AS DATE)

TRY_TO_DECIMAL(expression[, format]

[,precision[, scale]]


TRY_TO_NUMBER(expression[, format]

[,precision[, scale]]


TRY_TO_NUMERIC(expression[, format]

[,precision[, scale]]

ROUND(

SAFE_CAST(expression AS NUMERIC)

, x)

TRY_TO_DOUBLE(expression)

SAFE_CAST(expression AS FLOAT64)

TRY_TO_TIME(expression)

SAFE_CAST(expression AS TIME)

TRY_TO_TIMESTAMP(expression)


TRY_TO_TIMESTAMP_LTZ(expression)


TRY_TO_TIMESTAMP_NTZ(expression)


TRY_TO_TIMESTAMP_TZ(expression)

SAFE_CAST(expression AS TIMESTAMP)

ב-BigQuery יש גם את פונקציות ההמרה הבאות, שאין להן מקבילה ישירה ב-Snowflake:

פונקציות ליצירת נתונים

בטבלה הבאה מוצגים מיפויים בין פונקציות נפוצות ליצירת נתונים ב-Snowflake לבין הפונקציות המקבילות ב-BigQuery.

Snowflake BigQuery

NORMAL(mean, stddev, gen)

‫BigQuery לא תומך בהשוואה ישירה ל-NORMAL. של Snowflake

RANDOM([seed])

IF(RAND()>0.5, CAST(RAND()*POW(10, 18) AS INT64),

(-1)*CAST(RAND()*POW(10, 18) AS

INT64))


הערה: BigQuery לא תומך באתחול

RANDSTR(length, gen)

‫BigQuery לא תומך בהשוואה ישירה ל-RANDSTR. של Snowflake
SEQ1 / SEQ2 / SEQ4 / SEQ8 ‫BigQuery לא תומך בהשוואה ישירה ל-SEQ_. של Snowflake

UNIFORM(min, max, gen)

CAST(min + RAND()*(max-min) AS INT64)


הערה:כדי ליצור פונקציה שוות ערך ל-UNIFORM של Snowflake, צריך להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) שמתמידות. דוגמה כאן.
UUID_STRING([uuid, name])

הערה: Snowflake מחזירה 128 ביטים אקראיים. ‫Snowflake תומך ב-UUID בגרסה 4 (אקראית) ובגרסה 5 (עם שם).

GENERATE_UUID()


הערה: BigQuery מחזיר 122 ביטים אקראיים. ‫BigQuery תומך רק ב-UUID בגרסה 4.

ZIPF(s, N, gen)

‫BigQuery לא תומך בהשוואה ישירה ל-ZIPF. של Snowflake

פונקציות של תאריך ושעה

בטבלה הבאה מוצגים מיפויים בין פונקציות נפוצות של תאריך ושעה ב-Snowflake לבין הפונקציות המקבילות ב-BigQuery. פונקציות של נתונים ושעות ב-BigQuery כוללות פונקציות של תאריכים, פונקציות של תאריכים ושעות, פונקציות של שעות ופונקציות של חותמות זמן.

Snowflake BigQuery

ADD_MONTHS(date, months)

CAST(

DATE_ADD(

date,

INTERVAL integer MONTH

) AS TIMESTAMP

)

CONVERT_TIMEZONE(source_tz, target_tz, source_timestamp)


CONVERT_TIMEZONE(target_tz, source_timestamp)

PARSE_TIMESTAMP(

"%c%z",

FORMAT_TIMESTAMP(

"%c%z",

timestamp,

target_timezone

)

)


הערה: source_timezone הוא תמיד UTC ב-BigQuery

DATE_FROM_PARTS(year, month, day)


הערה: Snowflake תומך בתאריכים שליליים ובגלישה (overflow). לדוגמה, הפונקציה DATE_FROM_PARTS(2000, 1 + 24, 1) מחזירה את התאריך 1 בינואר 2002. האפשרות הזו לא אפשרית ב-BigQuery.

DATE(year, month, day)


DATE(timestamp_expression[, timezone])


DATE(datetime_expression)

DATE_PART(part, dateOrTime)


הערה: Snowflake תומך בסוגי החלקים הבאים: יום בשבוע לפי ISO, ננו-שנייה, ושנייה/אלפית השנייה/מיקרו-שנייה/ננו-שנייה מאז תקופת ה-Epoch. ב-BigQuery זה לא קורה. רשימה מלאה של סוגי החלקים ב-Snowflake.

EXTRACT(part FROM dateOrTime)


הערה: ‏BigQuery תומך בסוגי החלקים week(<weekday>),‏ microsecond ו-millisecond. ב-Snowflake זה לא המצב. כאן וכאן אפשר לראות את הרשימה המלאה של סוגי החלקים ב-BigQuery.

DATE_TRUNC(part, dateOrTime)


הערה: Snowflake תומך בסוג החלק של הננו-שנייה. ב-BigQuery זה לא קורה. רשימה מלאה של סוגי החלקים ב-Snowflake.

DATE_TRUNC(date, part)


DATETIME_TRUNC(datetime, part)


TIME_TRUNC(time, part)


TIMESTAMP_TRUNC(timestamp, part[, timezone])


הערה: BigQuery תומך בסוגי החלקים week(<weekday>),‏ ISO week ו-ISO year. ב-Snowflake זה לא המצב.

DATEADD(part, value, dateOrTime)

DATE_ADD(date, INTERVAL value part)

DATEDIFF(

part,

start_date_or_time,

end_date_or_time

)


הערה: Snowflake תומכת בחישוב ההפרש בין שני סוגים של תאריך, שעה וחותמת זמן בפונקציה הזו.

DATE_DIFF(

end_date,

start_date,

part

)


DATETIME_DIFF(

end_datetime,

start_datetime,

part

)


TIME_DIFF(

start_time,

end_time,

part

)


TIMESTAMP_DIFF(

end_timestamp,

start_timestamp,

part

)


הערה: BigQuery תומך בסוגי החלקים week(<weekday>)‎ ו-ISO year.

DAYNAME(dateOrTimestamp)

FORMAT_DATE('%a', date)


FORMAT_DATETIME('%a', datetime)


FORMAT_TIMESTAMP('%a', timestamp)

EXTRACT(part FROM dateOrTime)


הערה: Snowflake תומך בסוגי החלקים הבאים: יום בשבוע לפי ISO, ננו-שנייה, ושנייה/אלפית השנייה/מיקרו-שנייה/ננו-שנייה מאז תקופת ה-Epoch. ב-BigQuery זה לא קורה. רשימה מלאה של סוגי החלקים ב-Snowflake.

EXTRACT(part FROM dateOrTime)


הערה: ‏BigQuery תומך בסוגי החלקים week(<weekday>),‏ microsecond ו-millisecond. ב-Snowflake זה לא המצב. כאן וכאן אפשר לראות את הרשימה המלאה של סוגי החלקים ב-BigQuery.

[HOUR, MINUTE, SECOND](timeOrTimestamp)

EXTRACT(part FROM timestamp [AT THE ZONE timezone])

LAST_DAY(dateOrTime[, part])

DATE_SUB( DATE_TRUNC(

DATE_ADD(date, INTERVAL

1 part),

part),

INTERVAL 1 DAY)

MONTHNAME(dateOrTimestamp)

FORMAT_DATE('%b', date)


FORMAT_DATETIME('%b', datetime)


FORMAT_TIMESTAMP('%b', timestamp)

NEXT_DAY(dateOrTime, dowString)

DATE_ADD(

DATE_TRUNC(

date,

WEEK(dowString)),

INTERVAL 1 WEEK)


הערה: יכול להיות שיהיה צורך לשנות את הפורמט של dowString. לדוגמה, הערך 'su' ב-Snowflake יהפוך לערך 'SUNDAY' ב-BigQuery.

PREVIOUS_DAY(dateOrTime, dowString)

DATE_TRUNC(

date,

WEEK(dowString)

)


הערה: יכול להיות שיהיה צורך לשנות את הפורמט של dowString. לדוגמה, הערך 'su' ב-Snowflake יהפוך לערך 'SUNDAY' ב-BigQuery.

TIME_FROM_PARTS(hour, minute, second[, nanosecond)


הערה: Snowflake תומך בזמני גלישה. לדוגמה, הפקודה TIME_FROM_PARTS(0, 100, 0) מחזירה 01:40:00... האפשרות הזו לא אפשרית ב-BigQuery. ‫BigQuery לא תומך בננו-שניות.

TIME(hour, minute, second)


TIME(timestamp, [timezone])


TIME(datetime)

TIME_SLICE(dateOrTime, sliceLength, part[, START]


TIME_SLICE(dateOrTime, sliceLength, part[, END]

DATE_TRUNC(

DATE_SUB(CURRENT_DATE(),

INTERVAL value MONTH),

MONTH)


DATE_TRUNC(

DATE_ADD(CURRENT_DATE(),

INTERVAL value MONTH),

MONTH)


הערה: אין ב-BigQuery תמיכה בהשוואה ישירה ומדויקת ל-TIME_SLICE של Snowflake. משתמשים ב-DATETINE_TRUNC, ב-TIME_TRUNC או ב-TIMESTAMP_TRUNC לסוג הנתונים המתאים.

TIMEADD(part, value, dateOrTime)

TIME_ADD(time, INTERVAL value part)

TIMEDIFF(

part,

expression1,

expression2,

)


הערה: Snowflake תומכת בחישוב ההפרש בין שני סוגים של תאריך, שעה וחותמת זמן בפונקציה הזו.

DATE_DIFF(

dateExpression1,

dateExpression2,

part

)


DATETIME_DIFF(

datetimeExpression1,

datetimeExpression2,

part

)


TIME_DIFF(

timeExpression1,

timeExpression2,

part

)


TIMESTAMP_DIFF(

timestampExpression1,

timestampExpression2,

part

)


הערה: BigQuery תומך בסוגי החלקים week(<weekday>)‎ ו-ISO year.

TIMESTAMP_[LTZ, NTZ, TZ _]FROM_PARTS (year, month, day, hour, second [, nanosecond][, timezone])

TIMESTAMP(

string_expression[, timezone] | date_expression[, timezone] |

datetime_expression[, timezone]

)


הערה: ב-BigQuery צריך להזין חותמות זמן כסוגים STRING. דוגמה: "2008-12-25 15:30:00"

TIMESTAMPADD(part, value, dateOrTime)

TIMESTAMPADD(timestamp, INTERVAL value part)

TIMESTAMPDIFF(

part,

expression1,

expression2,

)


הערה: Snowflake תומכת בחישוב ההפרש בין שני סוגים של תאריך, שעה וחותמת זמן בפונקציה הזו.

DATE_DIFF(

dateExpression1,

dateExpression2,

part

)


DATETIME_DIFF(

datetimeExpression1,

datetimeExpression2,

part

)


TIME_DIFF(

timeExpression1,

timeExpression2,

part

)


TIMESTAMP_DIFF(

timestampExpression1,

timestampExpression2,

part

)


הערה: BigQuery תומך בסוגי החלקים week(<weekday>)‎ ו-ISO year.

TRUNC(dateOrTime, part)


הערה: Snowflake תומך בסוג החלק של הננו-שנייה. ב-BigQuery זה לא קורה. רשימה מלאה של סוגי החלקים ב-Snowflake.

DATE_TRUNC(date, part)


DATETIME_TRUNC(datetime, part)


TIME_TRUNC(time, part)


TIMESTAMP_TRUNC(timestamp, part[, timezone])


הערה: BigQuery תומך בסוגי החלקים week(<weekday>),‏ ISO week ו-ISO year. ב-Snowflake זה לא המצב.

[YEAR*, DAY*, WEEK*, MONTH, QUARTER](dateOrTimestamp)

EXTRACT(part FROM timestamp [AT THE ZONE timezone])

ב-BigQuery יש גם את הפונקציות הבאות של תאריך ושעה, שאין להן מקבילה ישירה ב-Snowflake:

סכמת מידע ופונקציות טבלה

מבחינה רעיונית, BigQuery לא תומך בהרבה פונקציות של סכימת מידע וטבלה ב-Snowflake. ‫Snowflake מציעה את פונקציות הטבלה וסכימת המידע הבאות, שאין להן אנלוגיה ישירה ב-BigQuery:

בהמשך מפורטת רשימה של פונקציות טבלה וסכימות מידע משויכות של BigQuery ו-Snowflake.

Snowflake BigQuery
QUERY_HISTORY

QUERY_HISTORY_BY_*
INFORMATION_SCHEMA.JOBS_BY_*

הערה: זו לא חלופה ישירה.
TASK_HISTORY INFORMATION_SCHEMA.JOBS_BY_*

הערה: זו לא חלופה ישירה.

‫BigQuery מציע את סכימת המידע ופונקציות הטבלה הבאות, שאין להן מקבילה ישירה ב-Snowflake:

פונקציות מספריות

בטבלה הבאה מוצגים מיפויים בין פונקציות מספריות נפוצות ב-Snowflake לבין הפונקציות המקבילות ב-BigQuery.

Snowflake BigQuery

ABS(expression)

ABS(expression)

ACOS(expression)

ACOS(expression)

ACOSH(expression)

ACOSH(expression)

ASIN(expression)

ASIN(expression)

ASINH(expression)

ASINH(expression)

ATAN(expression)

ATAN(expression)

ATAN2(y, x)

ATAN2(y, x)

ATANH(expression)

ATANH(expression)

CBRT(expression)

POW(expression, ⅓)

CEIL(expression [, scale])

CEIL(expression)


הערה: הפונקציה CEIL של BigQuery לא תומכת בציון דיוק או קנה מידה. ROUND לא מאפשרת לציין עיגול כלפי מעלה.

COS(expression)

COS(expression)

COSH(expression)

COSH(expression)

COT(expression)

1/TAN(expression)

DEGREES(expression)

(expression)*(180/ACOS(-1))

EXP(expression)

EXP(expression)

FACTORIAL(expression)

אין ב-BigQuery חלופה ישירה ל-FACTORIAL של Snowflake. שימוש בפונקציה בהגדרת המשתמש.

FLOOR(expression [, scale])

FLOOR(expression)


הערה: הפונקציה FLOOR של BigQuery לא תומכת בציון דיוק או קנה מידה. ROUND לא מאפשרת לציין עיגול כלפי מעלה. הפונקציה TRUNC פועלת באופן זהה למספרים חיוביים, אבל לא למספרים שליליים, כי היא מחשבת ערך מוחלט.

HAVERSINE(lat1, lon1, lat2, lon2)

ST_DISTANCE( ST_GEOGPOINT(lon1, lat1),

ST_GEOGPOINT(lon2, lat2)

)/1000


הערה: ההתאמה לא מדויקת, אבל קרובה מספיק.

LN(expression)

LN(expression)

LOG(base, expression)

LOG(expression [,base])


LOG10(expression)


הערה:ברירת המחדל של הבסיס ל-LOG היא 10.

MOD(expression1, expression2)

MOD(expression1, expression2)

PI()

ACOS(-1)

POW(x, y)


POWER(x, y)

POW(x, y)


POWER(x, y)

RADIANS(expression)

(expression)*(ACOS(-1)/180)

ROUND(expression [, scale])

ROUND(expression, [, scale])

SIGN(expression)

SIGN(expression)

SIN(expression)

SIN(expression)

SINH(expression)

SINH(expression)

SQRT(expression)

SQRT(expression)

SQUARE(expression)

POW(expression, 2)

TAN(expression)

TAN(expression)

TANH(expression)

TANH(expression)

TRUNC(expression [, scale])


TRUNCATE(expression [, scale])

TRUNC(expression [, scale])


הערה: הערך שמוחזר ב-BigQuery צריך להיות קטן מהביטוי. אין תמיכה בערך ששווה לביטוי.

ב-BigQuery יש גם את הפונקציות המתמטיות הבאות, שאין להן מקבילה ישירה ב-Snowflake:

פונקציות של נתונים חצי מובְנים

Snowflake BigQuery
ARRAY_APPEND פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_CAT ARRAY_CONCAT
ARRAY_COMPACT פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_CONSTRUCT [ ]
ARRAY_CONSTRUCT_COMPACT פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_CONTAINS פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_INSERT פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_INTERSECTION פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_POSITION פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_PREPEND פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_SIZE ARRAY_LENGTH
ARRAY_SLICE פונקציה בהגדרת המשתמש מותאמת אישית
ARRAY_TO_STRING ARRAY_TO_STRING
ARRAYS_OVERLAP פונקציה בהגדרת המשתמש מותאמת אישית
AS_<object_type> CAST
AS_ARRAY CAST
AS_BINARY CAST
AS_BOOLEAN CAST
AS_CHAR , AS_VARCHAR CAST
AS_DATE CAST
AS_DECIMAL , AS_NUMBER CAST
AS_DOUBLE , AS_REAL CAST
AS_INTEGER CAST
AS_OBJECT CAST
AS_TIME CAST
AS_TIMESTAMP_* CAST
CHECK_JSON פונקציה בהגדרת המשתמש מותאמת אישית
CHECK_XML פונקציה בהגדרת המשתמש מותאמת אישית
FLATTEN UNNEST
GET פונקציה בהגדרת המשתמש מותאמת אישית
GET_IGNORE_CASE פונקציה בהגדרת המשתמש מותאמת אישית

GET_PATH , :

פונקציה בהגדרת המשתמש מותאמת אישית
IS_<object_type> פונקציה בהגדרת המשתמש מותאמת אישית
IS_ARRAY פונקציה בהגדרת המשתמש מותאמת אישית
IS_BINARY פונקציה בהגדרת המשתמש מותאמת אישית
IS_BOOLEAN פונקציה בהגדרת המשתמש מותאמת אישית
IS_CHAR , IS_VARCHAR פונקציה בהגדרת המשתמש מותאמת אישית
IS_DATE , IS_DATE_VALUE פונקציה בהגדרת המשתמש מותאמת אישית
IS_DECIMAL פונקציה בהגדרת המשתמש מותאמת אישית
IS_DOUBLE , IS_REAL פונקציה בהגדרת המשתמש מותאמת אישית
IS_INTEGER פונקציה בהגדרת המשתמש מותאמת אישית
IS_OBJECT פונקציה בהגדרת המשתמש מותאמת אישית
IS_TIME פונקציה בהגדרת המשתמש מותאמת אישית
IS_TIMESTAMP_* פונקציה בהגדרת המשתמש מותאמת אישית
OBJECT_CONSTRUCT פונקציה בהגדרת המשתמש מותאמת אישית
OBJECT_DELETE פונקציה בהגדרת המשתמש מותאמת אישית
OBJECT_INSERT פונקציה בהגדרת המשתמש מותאמת אישית
PARSE_JSON JSON_EXTRACT
PARSE_XML פונקציה בהגדרת המשתמש מותאמת אישית
STRIP_NULL_VALUE פונקציה בהגדרת המשתמש מותאמת אישית
STRTOK_TO_ARRAY SPLIT
TRY_PARSE_JSON פונקציה בהגדרת המשתמש מותאמת אישית
TYPEOF פונקציה בהגדרת המשתמש מותאמת אישית
XMLGET פונקציה בהגדרת המשתמש מותאמת אישית

פונקציות של מחרוזות ופונקציות בינאריות

Snowflake BigQuery

string1 || string2

CONCAT(string1, string2)

ASCII

TO_CODE_POINTS(string1)[OFFSET(0)]

BASE64_DECODE_BINARY

SAFE_CONVERT_BYTES_TO_STRING(

FROM_BASE64(<bytes_input>)

)

BASE64_DECODE_STRING

SAFE_CONVERT_BYTES_TO_STRING(

FROM_BASE64(<string1>)

)

BASE64_ENCODE

TO_BASE64(

SAFE_CAST(<string1> AS BYTES)

)

BIT_LENGTH

BYTE_LENGTH * 8

CHARACTER_LENGTH

CHARINDEX(substring, string)

STRPOS(string, substring)

CHR,CHAR

CODE_POINTS_TO_STRING([number])

COLLATE פונקציה בהגדרת המשתמש מותאמת אישית
COLLATION פונקציה בהגדרת המשתמש מותאמת אישית
COMPRESS פונקציה בהגדרת המשתמש מותאמת אישית

CONCAT(string1, string2)

CONCAT(string1, string2)

הערה: הפונקציה CONCAT(...)‎ של BigQuery תומכת בשרשור של כל מספר מחרוזות.
CONTAINS פונקציה בהגדרת המשתמש מותאמת אישית
DECOMPRESS_BINARY פונקציה בהגדרת המשתמש מותאמת אישית
DECOMPRESS_STRING פונקציה בהגדרת המשתמש מותאמת אישית
EDITDISTANCE EDIT_DISTANCE
ENDSWITH פונקציה בהגדרת המשתמש מותאמת אישית
HEX_DECODE_BINARY

SAFE_CONVERT_BYTES_TO_STRING(

FROM_HEX(<string1>)

HEX_DECODE_STRING

SAFE_CONVERT_BYTES_TO_STRING(

FROM_HEX(<string1>)

HEX_ENCODE

TO_HEX(

SAFE_CAST(<string1> AS BYTES))

ILIKE פונקציה בהגדרת המשתמש מותאמת אישית
ILIKE ANY פונקציה בהגדרת המשתמש מותאמת אישית
INITCAP INITCAP
INSERT פונקציה בהגדרת המשתמש מותאמת אישית
LEFT פונקציה בהגדרת המשתמש
LENGTH

LENGTH(expression)

LIKE LIKE
LIKE ALL פונקציה בהגדרת המשתמש מותאמת אישית
LIKE ANY פונקציה בהגדרת המשתמש מותאמת אישית
LOWER

LOWER(string)

LPAD

LPAD(string1, length[, string2])

LTRIM

LTRIM(string1, trim_chars)

MD5,MD5_HEX

MD5(string)

MD5_BINARY פונקציה בהגדרת המשתמש מותאמת אישית
OCTET_LENGTH פונקציה בהגדרת המשתמש מותאמת אישית
PARSE_IP פונקציה בהגדרת המשתמש מותאמת אישית
PARSE_URL פונקציה בהגדרת המשתמש מותאמת אישית
POSITION

STRPOS(string, substring)

REPEAT

REPEAT(string, integer)

REPLACE

REPLACE(string1, old_chars, new_chars)

REVERSE

number_characters

)

REVERSE(expression)

RIGHT פונקציה בהגדרת המשתמש
RPAD RPAD
RTRIM

RTRIM(string, trim_chars)

RTRIMMED_LENGTH פונקציה בהגדרת המשתמש מותאמת אישית
SHA1,SHA1_HEX

SHA1(string)

SHA1_BINARY פונקציה בהגדרת המשתמש מותאמת אישית
SHA2,SHA2_HEX פונקציה בהגדרת המשתמש מותאמת אישית
SHA2_BINARY פונקציה בהגדרת המשתמש מותאמת אישית
SOUNDEX פונקציה בהגדרת המשתמש מותאמת אישית
SPACE פונקציה בהגדרת המשתמש מותאמת אישית
SPLIT SPLIT
SPLIT_PART פונקציה בהגדרת המשתמש מותאמת אישית
SPLIT_TO_TABLE פונקציה בהגדרת המשתמש מותאמת אישית
STARTSWITH פונקציה בהגדרת המשתמש מותאמת אישית
STRTOK

SPLIT(instring, delimiter)[ORDINAL(tokennum)]


הערה: כל מחרוזת הארגומנט של התו המפריד משמשת כתו מפריד יחיד. ברירת המחדל של תו המפריד היא פסיק.
STRTOK_SPLIT_TO_TABLE פונקציה בהגדרת המשתמש מותאמת אישית
SUBSTR,SUBSTRING SUBSTR
TRANSLATE פונקציה בהגדרת המשתמש מותאמת אישית
TRIM TRIM
TRY_BASE64_DECODE_BINARY פונקציה בהגדרת המשתמש מותאמת אישית
TRY_BASE64_DECODE_STRING

SUBSTR(string, 0, integer)

TRY_HEX_DECODE_BINARY

SUBSTR(string, -integer)

TRY_HEX_DECODE_STRING

LENGTH(expression)

UNICODE פונקציה בהגדרת המשתמש מותאמת אישית

UPPER

UPPER

פונקציות מחרוזת (ביטויים רגולריים)

Snowflake BigQuery
REGEXP

IF(REGEXP_CONTAINS,1,0)=1

REGEXP_COUNT

ARRAY_LENGTH(

REGEXP_EXTRACT_ALL(

source_string,

pattern

)

)


אם מציינים את position:

ARRAY_LENGTH(

REGEXP_EXTRACT_ALL(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern

)

)


הערה: BigQuery מספק תמיכה בביטויים רגולריים באמצעות ספריית re2. אפשר לעיין במסמכי התיעוד של הספרייה כדי לראות את התחביר של הביטויים הרגולריים.
REGEXP_INSTR

IFNULL(

STRPOS(

source_string,

REGEXP_EXTRACT(

source_string,

pattern)

), 0)


אם מצוין position:

IFNULL(

STRPOS(

SUBSTR(source_string, IF(position <= 0, 1, position)),

REGEXP_EXTRACT(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern)

) + IF(position <= 0, 1, position) - 1, 0)


אם מציינים את occurrence:

IFNULL(

STRPOS(

SUBSTR(source_string, IF(position <= 0, 1, position)),

REGEXP_EXTRACT_ALL(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern

)[SAFE_ORDINAL(occurrence)]

) + IF(position <= 0, 1, position) - 1, 0)


הערה: BigQuery מספק תמיכה בביטויים רגולריים באמצעות ספריית re2. אפשר לעיין במסמכי התיעוד של הספרייה כדי לראות את התחביר של הביטויים הרגולריים.

REGEXP_LIKE

IF(REGEXP_CONTAINS,1,0)=1

REGEXP_REPLACE

REGEXP_REPLACE(

source_string,

pattern,

""

)


אם מציינים את replace_string:

REGEXP_REPLACE(

source_string,

pattern,

replace_string

)


אם מציינים את position:

CASE

WHEN position > LENGTH(source_string) THEN source_string

WHEN position <= 0 THEN

REGEXP_REPLACE(

source_string,

pattern,

""

)

ELSE

CONCAT(

SUBSTR(

source_string, 1, position - 1),

REGEXP_REPLACE(

SUBSTR(source_string, position),

pattern,

replace_string

)

)

END


הערה: BigQuery מספק תמיכה בביטויים רגולריים באמצעות ספריית re2. אפשר לעיין במסמכי התיעוד של הספרייה כדי לראות את התחביר של הביטויים הרגולריים.
REGEXP_SUBSTR

REGEXP_EXTRACT(

source_string,

pattern

)


אם מציינים את position:

REGEXP_EXTRACT(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern

)


אם מציינים את occurrence:

REGEXP_EXTRACT_ALL(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern

)[SAFE_ORDINAL(occurrence)]


הערה: BigQuery מספק תמיכה בביטויים רגולריים באמצעות ספריית re2. אפשר לעיין במסמכי התיעוד של הספרייה כדי לראות את התחביר של הביטויים הרגולריים.
RLIKE

IF(REGEXP_CONTAINS,1,0)=1

פונקציות מערכת

Snowflake BigQuery
SYSTEM$ABORT_SESSION פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$ABORT_TRANSACTION פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$CANCEL_ALL_QUERIES פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$CANCEL_QUERY פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$CLUSTERING_DEPTH פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$CLUSTERING_INFORMATION פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$CLUSTERING_RATIO — Deprecated פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$CURRENT_USER_TASK_NAME פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$DATABASE_REFRESH_HISTORY פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$DATABASE_REFRESH_PROGRESS , SYSTEM$DATABASE_REFRESH_PROGRESS_BY_JOB פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$GET_AWS_SNS_IAM_POLICY פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$GET_PREDECESSOR_RETURN_VALUE פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$LAST_CHANGE_COMMIT_TIME פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$PIPE_FORCE_RESUME פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$PIPE_STATUS פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$SET_RETURN_VALUE פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$SHOW_OAUTH_CLIENT_SECRETS פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$STREAM_GET_TABLE_TIMESTAMP פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$STREAM_HAS_DATA פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$TASK_DEPENDENTS_ENABLE פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$TYPEOF פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$WAIT פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$WHITELIST פונקציה בהגדרת המשתמש מותאמת אישית
SYSTEM$WHITELIST_PRIVATELINK פונקציה בהגדרת המשתמש מותאמת אישית

פונקציות טבלה

Snowflake BigQuery
GENERATOR פונקציה בהגדרת המשתמש מותאמת אישית
GET_OBJECT_REFERENCES פונקציה בהגדרת המשתמש מותאמת אישית
RESULT_SCAN פונקציה בהגדרת המשתמש מותאמת אישית
VALIDATE פונקציה בהגדרת המשתמש מותאמת אישית

פונקציות בסיסיות ופונקציות גיבוב (Hash)

Snowflake BigQuery
GET_DDL בקשת תכונה
HASH ‫HASH היא פונקציה קניינית שספציפית ל-Snowflake. אי אפשר לתרגם בלי לדעת את הלוגיקה הבסיסית שבה נעשה שימוש ב-Snowflake.

פונקציות חלון

Snowflake BigQuery
CONDITIONAL_CHANGE_EVENT פונקציה בהגדרת המשתמש מותאמת אישית
CONDITIONAL_TRUE_EVENT פונקציה בהגדרת המשתמש מותאמת אישית
CUME_DIST CUME_DIST
DENSE_RANK DENSE_RANK
FIRST_VALUE FIRST_VALUE
LAG LAG
LAST_VALUE LAST_VALUE
LEAD LEAD
NTH_VALUE NTH_VALUE
NTILE NTILE
PERCENT_RANK PERCENT_RANK
RANK RANK
RATIO_TO_REPORT פונקציה בהגדרת המשתמש מותאמת אישית
ROW_NUMBER ROW_NUMBER
WIDTH_BUCKET פונקציה בהגדרת המשתמש מותאמת אישית

‫BigQuery תומך גם ב-SAFE_CAST(expression AS typename), שמחזירה NULL אם BigQuery לא מצליחה לבצע המרה (לדוגמה, SAFE_CAST("apple" AS INT64) מחזירה NULL).

אופרטורים

בקטעים הבאים מפורטים אופרטורים של Snowflake והאופרטורים המקבילים שלהם ב-BigQuery.

אופרטורים אריתמטיים

בטבלה הבאה מוצגים מיפויים בין אופרטורים אריתמטיים ב-Snowflake לבין המקבילים שלהם ב-BigQuery.

Snowflake BigQuery

(Unary) (+'5')

CAST("5" AS NUMERIC)

a + b

a + b

(Unary) (-'5')

(-1) * CAST("5" AS NUMERIC)


הערה: BigQuery תומך במינוס אונרי סטנדרטי, אבל לא ממיר מספרים שלמים בפורמט מחרוזת לסוג INT64, NUMERIC או FLOAT64.

a - b

a - b

date1 - date2


date1 - 365

DATE_DIFF(date1, date2, date_part) DATE_SUB(date1, date2, date_part)

a * b

a * b

a / b

a / b

a % b

MOD(a, b)

כדי לראות את הפרטים של קנה המידה והדיוק של Snowflake כשמבצעים פעולות אריתמטיות, אפשר לעיין בתיעוד של Snowflake.

אופרטורים להשוואה

אופרטורים להשוואה ב-Snowflake זהים לאופרטורים להשוואה ב-BigQuery.

אופרטורים לוגיים/בוליאניים

אופרטורים לוגיים/בוליאניים ב-Snowflake זהים לאופרטורים לוגיים/בוליאניים ב-BigQuery.

הגדרת אופרטורים

בטבלה הבאה מוצגים מיפויים בין אופרטורים של קבוצות ב-Snowflake לבין המקבילים שלהם ב-BigQuery.

Snowflake BigQuery

SELECT ... INTERSECT SELECT ...

SELECT ...

INTERSECT DISTINCT

SELECT...

SELECT ... MINUS SELECT ...

SELECT ... EXCEPT SELECT …


הערה: MINUS ו- EXCEPT הן מילים נרדפות.

SELECT ... EXCEPT DISTINCT SELECT ...

SELECT ... UNION SELECT ...

SELECT ... UNION ALL SELECT ...

SELECT ... UNION DISTINCT SELECT ...


SELECT ... UNION ALL SELECT ...

אופרטורים של שאילתות משנה

בטבלה הבאה מוצגים מיפויים בין אופרטורים של שאילתות משנה ב-Snowflake לבין האופרטורים המקבילים ב-BigQuery.

Snowflake BigQuery

SELECT ... FROM ... WHERE col <operator> ALL … SELECT ... FROM ... WHERE col <operator> ANY ...

‫BigQuery לא תומך בחלופה ישירה ל-ALL/ANY של Snowflake.

SELECT ... FROM ...

WHERE [NOT] EXISTS...

SELECT ... FROM ...

WHERE [NOT] EXISTS...

SELECT ... FROM ...

WHERE [NOT] IN...

SELECT ... FROM ...

WHERE [NOT] IN...

SELECT * FROM table1

UNION

SELECT * FROM table2

EXCEPT

SELECT * FROM table3

SELECT * FROM table1

UNION ALL

(

SELECT * FROM table2

EXCEPT

SELECT * FROM table3

)


הערה: ב-BigQuery צריך להשתמש בסוגריים כדי להפריד בין פעולות שונות על קבוצות. אם אותו אופרטור של קבוצה חוזר על עצמו, אין צורך בסוגריים.

תחביר DML

בקטע הזה נסביר על ההבדלים בתחביר של שפת ניהול הנתונים בין Snowflake לבין BigQuery.

INSERT דוחות

‫Snowflake מציעה מילת מפתח DEFAULT שניתנת להגדרה לעמודות. ב-BigQuery, הערך DEFAULT בעמודות שאפשר להשאיר ריקות הוא NULL, והערך DEFAULT לא נתמך בעמודות חובה. רוב ההצהרות של Snowflake INSERT תואמות ל-BigQuery. בטבלה הבאה מוצגים יוצאים מן הכלל.

Snowflake BigQuery

INSERT [OVERWRITE] INTO table

VALUES [... | DEFAULT | NULL] ...


הערה: ב-BigQuery אין תמיכה בהוספה של אובייקטים מסוג JSON באמצעות INSERT statement.

INSERT [INTO] table (column1 [, ...])

VALUES (DEFAULT [, ...])

הערה: ב-BigQuery אין תמיכה בחלופה ישירה ל-OVERWRITE של Snowflake. במקום זאת, אתם צריכים להשתמש ב-DELETE.

INSERT INTO table (column1 [, ...]) SELECT... FROM ...

INSERT [INTO] table (column1, [,...])

SELECT ...

FROM ...

INSERT [OVERWRITE] ALL <intoClause> ... INSERT [OVERWRITE] {FIRST | ALL} {WHEN condition THEN <intoClause>}

[...]

[ELSE <intoClause>]

...

הערה: <intoClause> מייצג את INSERT statement הרגיל, שמפורט למעלה.
‫BigQuery לא תומך ב-INSERTsmulti-table עם תנאים או ללא תנאים.

‫BigQuery תומך גם בהוספת ערכים באמצעות שאילתת משנה (כאשר אחד מהערכים מחושב באמצעות שאילתת משנה), אבל Snowflake לא תומך בכך. לדוגמה:

INSERT INTO table (column1, column2)
VALUES ('value_1', (
  SELECT column2
  FROM table2
))

COPY דוחות

‫Snowflake תומך בהעתקת נתונים מקבצים זמניים לטבלה קיימת ומטבלה למיקום זמני פנימי עם שם, למיקום זמני חיצוני עם שם ולמיקום חיצוני (Amazon S3,‏ Google Cloud Storage או Microsoft Azure).

ב-BigQuery לא משתמשים בפקודה COPY של SQL כדי לטעון נתונים, אבל אפשר להשתמש בכמה כלים ואפשרויות שאינם SQL כדי לטעון נתונים לטבלאות של BigQuery. אפשר גם להשתמש ב-sink-ים של פייפליין שזמינים ב-Apache Spark או ב-Apache Beam כדי לכתוב נתונים ב-BigQuery.

UPDATE דוחות

רוב ההצהרות של Snowflake UPDATE תואמות ל-BigQuery. בטבלה הבאה מוצגים חריגים.

Snowflake BigQuery

UPDATE table SET col = value [,...] [FROM ...] [WHERE ...]

UPDATE table

SET column = expression [,...]

[FROM ...]

WHERE TRUE


הערה: כל הצהרות UPDATE ב-BigQuery דורשות מילת מפתח WHERE, ואחריה תנאי.

DELETE ודוחות TRUNCATE TABLE

ההצהרות DELETE ו-TRUNCATE TABLE הן שתי דרכים להסרת שורות מטבלה בלי להשפיע על סכימת הטבלה או על האינדקסים.

ב-Snowflake, גם DELETE וגם TRUNCATE TABLE שומרים נתונים שנמחקו באמצעות Time Travel של Snowflake למטרות שחזור למשך תקופת שמירת הנתונים. עם זאת, הפקודה DELETE לא מוחקת את היסטוריית הטעינה של הקובץ החיצוני ואת מטא-הנתונים של הטעינה.

ב-BigQuery, להצהרת DELETE חייב להיות סעיף WHERE. מידע נוסף על DELETE ב-BigQuery זמין בדוגמאות לשימוש ב-DELETE ב-BigQuery במסמכי ה-DML.

Snowflake BigQuery

DELETE FROM table_name [USING ...]

[WHERE ...]



TRUNCATE [TABLE] [IF EXISTS] table_name

DELETE [FROM] table_name [alias]

WHERE ...


הערה: בהצהרות של BigQuery DELETE נדרש WHERE clause.

MERGE דוחות

ההצהרה MERGE יכולה לשלב פעולות של INSERT,‏ UPDATE ו-DELETE בהצהרה אחת של 'עדכון או הוספה' ולבצע את הפעולות באופן אוטומטי. MERGEהפעולה צריכה להתאים לשורת מקור אחת לכל היותר עבור כל שורת יעד.

ההגבלה על טבלאות BigQuery היא 1,000 הצהרות DML ביום, ולכן מומלץ לאחד הצהרות INSERT, ‏ UPDATE ו-DELETE להצהרת MERGE אחת, כמו שמוצג בטבלה הבאה:

Snowflake BigQuery

MERGE INTO target USING source ON target.key = source.key WHEN MATCHED AND source.filter = 'Filter_exp' THEN

UPDATE SET target.col1 = source.col1, target.col1 = source.col2,

...


הערה: ב-Snowflake יש תמיכה בפרמטר של סשן ERROR_ON_NONDETERMINISTIC_MERGE לטיפול בתוצאות לא דטרמיניסטיות.

MERGE target

USING source

ON target.key = source.key

WHEN MATCHED AND source.filter = 'filter_exp' THEN

UPDATE SET

target.col1 = source.col1,

target.col2 = source.col2,

...



הערה: אם מעדכנים את כל העמודות, צריך לכלול את כולן.

GET ודוחות LIST

ההצהרה GET מורידה קבצי נתונים מאחד משלבי Snowflake הבאים לספרייה או לתיקייה מקומיות במחשב לקוח:

  • שלב פנימי עם שם
  • שלב פנימי של טבלה ספציפית
  • שלב פנימי למשתמש הנוכחי

ההצהרה LIST (LS) מחזירה רשימה של קבצים שהועלו (כלומר, הועלו ממערכת קבצים מקומית או נפרקו מטבלה) באחד משלבי Snowflake הבאים:

  • שלב פנימי עם שם
  • שלב חיצוני עם שם
  • שלב לטבלה ספציפית
  • השלב של המשתמש הנוכחי

‫BigQuery לא תומך במושג של העברה זמנית של נתונים, ואין לו מקבילות ל-GET ול-LIST.

PUT ודוחות REMOVE

ההעלאות של הצהרות PUT (כלומר, שלבים) הן קבצי נתונים מספרייה או מתיקייה מקומיות במחשב לקוח לאחד מהשלבים הבאים ב-Snowflake:

  • שלב פנימי עם שם
  • שלב פנימי של טבלה ספציפית
  • שלב פנימי למשתמש הנוכחי

ההצהרה REMOVE (RM) מסירה קבצים שהועברו לסביבת Staging באחד מהשלבים הפנימיים הבאים של Snowflake:

  • שלב פנימי עם שם
  • שלב לטבלה ספציפית
  • השלב של המשתמש הנוכחי

‫BigQuery לא תומך במושג של העברה זמנית של נתונים, ואין לו מקבילות ל-PUT ול-REMOVE.

תחביר DDL

בקטע הזה מוסבר על ההבדלים בתחביר של שפת הגדרת הנתונים בין Snowflake לבין BigQuery.

DDL של מסד נתונים, סכימה ושיתוף

רוב המינוחים ב-Snowflake זהים לאלה שב-BigQuery, חוץ מהמינוח Snowflake Database שדומה ל-BigQuery Dataset. מיפוי מפורט של המינוח מ-Snowflake ל-BigQuery

CREATE DATABASE דוחות

ב-Snowflake אפשר ליצור מסד נתונים ולנהל אותו באמצעות פקודות לניהול מסד נתונים, וב-BigQuery יש כמה אפשרויות ליצירת מערכי נתונים, כמו שימוש ב-Console, ב-CLI, בספריות לקוח וכו'. בקטע הזה נשתמש בפקודות BigQuery CLI שמתאימות לפקודות Snowflake כדי להסביר את ההבדלים.

Snowflake BigQuery

CREATE DATABASE <name>


הערה: Snowflake מספקת את הדרישות האלה למתן שמות למסדי נתונים. השם יכול לכלול עד 255 תווים.

bq mk <name>


הערה: ב-BigQuery יש דרישות דומות לשמות של מערכי נתונים כמו ב-Snowflake, אבל שם אפשר להשתמש בשם באורך של עד 1,024 תווים.

CREATE OR REPLACE DATABASE <name>

אין תמיכה בהחלפת מערך הנתונים ב-BigQuery.

CREATE TRANSIENT DATABASE <name>

אין תמיכה ביצירת מערך נתונים זמני ב-BigQuery.

CREATE DATABASE IF NOT EXISTS <name>

מושג שלא נתמך ב-BigQuery

CREATE DATABASE <name>

CLONE <source_db>

[ { AT | BEFORE }

( { TIMESTAMP => <timestamp> |

OFFSET => <time_difference> |

STATEMENT => <id> } ) ]

אין תמיכה בשיבוט של מערכי נתונים ב-BigQuery.

CREATE DATABASE <name>

DATA_RETENTION_TIME_IN_DAYS = <num>

אין תמיכה ב-BigQuery בשינוי של מערך נתונים לנקודת זמן קודמת. עם זאת, יש תמיכה בשינוי התקופה שמוצגת בטבלה ובתוצאות השאילתה.

CREATE DATABASE <name>

DEFAULT_DDL_COLLATION = '<collation_specification>'

אין תמיכה בהשוואה ב-DDL ב-BigQuery.

CREATE DATABASE <name>

COMMENT = '<string_literal>'

bq mk \

--description "<string_literal>" \

<name>

CREATE DATABASE <name>

FROM SHARE <provider_account>.<share_name>

אין תמיכה ביצירת מערכי נתונים משותפים ב-BigQuery. עם זאת, אחרי שיוצרים את מערך הנתונים, המשתמשים יכולים לשתף אותו דרך המסוף או ממשק המשתמש.

CREATE DATABASE <name>

AS REPLICA OF

<region>.<account>.<primary_db_name>

AUTO_REFRESH_MATERIALIZED_VIEWS_ON_SECONDARY = { TRUE | FALSE }


הערה: ב-Snowflake יש אפשרות לתחזוקה אוטומטית ברקע של תצוגות חומריות במסד הנתונים המשני, אבל האפשרות הזו לא נתמכת ב-BigQuery.

bq mk --transfer_config \

--target_dataset = <name> \

--data_source = cross_region_copy \ --params='

{"source_dataset_id":"<primary_db_name>"

,"source_project_id":"<project_id>"

,"overwrite_destination_table":"true"}'

הערה: ב-BigQuery יש תמיכה בהעתקה של מערכי נתונים באמצעות שירות העברת הנתונים ל-BigQuery. כאן מפורטות הדרישות המוקדמות להעתקה של מערך נתונים.

ב-BigQuery יש גם את אפשרויות הפקודה הבאות bq mk, שאין להן מקבילה ישירה ב-Snowflake:

  • --location <dataset_location>
  • --default_table_expiration <time_in_seconds>
  • --default_partition_expiration <time_in_seconds>

ALTER DATABASE דוחות

בקטע הזה נשתמש בפקודות BigQuery CLI שמתאימות לפקודות Snowflake כדי לטפל בהבדלים בהצהרות ALTER.

Snowflake BigQuery

ALTER DATABASE [ IF EXISTS ] <name> RENAME TO <new_db_name>

אין תמיכה בשינוי השם של מערכי נתונים ב-BigQuery, אבל יש תמיכה בהעתקה של מערכי נתונים.

ALTER DATABASE <name>

SWAP WITH <target_db_name>

אין תמיכה בהחלפת מערכי נתונים ב-BigQuery.

ALTER DATABASE <name>

SET

[DATA_RETENTION_TIME_IN_DAYS = <num>]

[ DEFAULT_DDL_COLLATION = '<value>']

אין תמיכה בניהול של שמירת נתונים ואיסוף נתונים ברמת מערך הנתונים ב-BigQuery.

ALTER DATABASE <name>

SET COMMENT = '<string_literal>'

bq update \

--description "<string_literal>" <name>

ALTER DATABASE <name>

ENABLE REPLICATION TO ACCOUNTS <snowflake_region>.<account_name>

[ , <snowflake_region>.<account_name> ... ]

המושג לא נתמך ב-BigQuery.

ALTER DATABASE <name>

DISABLE REPLICATION [ TO ACCOUNTS <snowflake_region>.<account_name>

[ , <snowflake_region>.<account_name> ... ]]

המושג לא נתמך ב-BigQuery.

ALTER DATABASE <name>

SET AUTO_REFRESH_MATERIALIZED_VIEWS_ON_SECONDARY = { TRUE | FALSE }

המושג לא נתמך ב-BigQuery.

ALTER DATABASE <name> REFRESH

המושג לא נתמך ב-BigQuery.

ALTER DATABASE <name>

ENABLE FAILOVER TO ACCOUNTS <snowflake_region>.<account_name>

[ , <snowflake_region>.<account_name> ... ]

המושג לא נתמך ב-BigQuery.

ALTER DATABASE <name>

DISABLE FAILOVER [ TO ACCOUNTS <snowflake_region>.<account_name>

[ , <snowflake_region>.<account_name> ... ]]

המושג לא נתמך ב-BigQuery.

ALTER DATABASE <name>

PRIMARY

המושג לא נתמך ב-BigQuery.

DROP DATABASE דוחות

בקטע הזה נשתמש בפקודת BigQuery CLI שמתאימה לפקודת Snowflake כדי לטפל בהבדל בהצהרת DROP.

Snowflake BigQuery

DROP DATABASE [ IF EXISTS ] <name>

[ CASCADE | RESTRICT ]


הערה: ב-Snowflake, מחיקת מסד נתונים לא מסירה אותו מהמערכת באופן סופי. גרסה של מסד הנתונים שהוסר נשמרת למספר הימים שצוין בפרמטר DATA_RETENTION_TIME_IN_DAYS של מסד הנתונים.

bq rm -r -f -d <name>


Where

-r הסרת כל האובייקטים במערך הנתונים

-f is to skip confirmation for execution

-d מציין מערך נתונים

הערה: ב-BigQuery, מחיקה של מערך נתונים היא פעולה קבועה. בנוסף, לא ניתן להשתמש בהעברה מדורגת ברמת מערך הנתונים, כי כל הנתונים והאובייקטים במערך הנתונים נמחקים.

‫Snowflake תומך גם בפקודה UNDROP DATASET, שמשחזרת את הגרסה האחרונה של מערכי נתונים שנמחקו. האפשרות הזו לא נתמכת ב-BigQuery ברמת מערך הנתונים.

USE DATABASE דוחות

ב-Snowflake יש אפשרות להגדיר את מסד הנתונים לסשן של משתמש באמצעות הפקודה USE DATABASE. כך אין צורך לציין שמות אובייקטים שמוגדרים במלואם בפקודות SQL. ב-BigQuery אין חלופה לפקודה USE DATABASE של Snowflake.

SHOW DATABASE דוחות

בקטע הזה נשתמש בפקודת BigQuery CLI שמתאימה לפקודת Snowflake כדי להסביר את ההבדל בהצהרת SHOW.

Snowflake BigQuery

SHOW DATABASES


הערה: Snowflake מספקת אפשרות אחת לרישום ולהצגת פרטים על כל מסדי הנתונים, כולל מסדי נתונים שהוסרו שנמצאים בתוך תקופת השמירה.
bq ls --format=prettyjson
או

bq show <dataset_name>


הערה: ב-BigQuery, הפקודה ls מספקת רק את השמות של מערכי הנתונים ומידע בסיסי, והפקודה show מספקת פרטים כמו חותמת הזמן של השינוי האחרון, רשימות ACL ותוויות של מערך נתונים. ב-BigQuery אפשר גם לקבל פרטים נוספים על מערכי הנתונים באמצעות Information Schema.

SHOW TERSE DATABASES


הערה: באפשרות TERSE, ‏ Snowflake מאפשרת להציג רק מידע או שדות ספציפיים לגבי מערכי נתונים.
המושג לא נתמך ב-BigQuery.

SHOW DATABASES HISTORY

המושג 'מסע בזמן' לא נתמך ב-BigQuery ברמת מערך הנתונים.
SHOW DATABASES

[LIKE '<pattern>']

[STARTS WITH '<name_string>']

סינון תוצאות לפי שמות של מערכי נתונים לא נתמך ב-BigQuery. עם זאת, יש תמיכה בסינון לפי תוויות.
SHOW DATABASES

LIMIT <rows> [FROM '<name_string>']


הערה: כברירת מחדל, Snowflake לא מגביל את מספר התוצאות. עם זאת, הערך של LIMIT לא יכול להיות גבוה מ-10,000.

bq ls \

--max_results <rows>


הערה: כברירת מחדל, ב-BigQuery מוצגות רק 50 תוצאות.

ב-BigQuery יש גם את אפשרויות הפקודה הבאות bq, שאין להן מקבילה ישירה ב-Snowflake:

  • bq ls --format=pretty: מחזירה תוצאות בפורמט בסיסי
  • ‫*bq ls -a: *מחזירה רק מערכי נתונים אנונימיים (אלה שמתחילים בקו תחתון)
  • bq ls --all: מחזירה את כל מערכי הנתונים, כולל אנונימיים
  • bq ls --filter labels.key:value: מחזירה תוצאות מסוננות לפי תווית של מערך נתונים
  • bq ls --d: לא כולל בתוצאות מערכי נתונים אנונימיים
  • bq show --format=pretty: מחזירה תוצאות מפורטות בפורמט בסיסי לכל מערכי הנתונים

ניהול SCHEMA

‫Snowflake מספקת כמה פקודות לניהול סכימות , בדומה לפקודות לניהול מסדי נתונים. הקונספט הזה של יצירה וניהול של סכימה לא נתמך ב-BigQuery.

עם זאת, ב-BigQuery אפשר להגדיר את הסכימה של הטבלה כשאתם טוענים נתונים לטבלה, וכשאתם יוצרים טבלה ריקה. לחלופין, אפשר להשתמש בזיהוי אוטומטי של סכימה עבור פורמטים נתמכים של נתונים.

ניהול SHARE

‫Snowflake מספקת כמה פקודות לניהול שיתופים , בדומה לפקודות לניהול מסדי נתונים וסכימות. המושג הזה של יצירה וניהול של שיתוף לא נתמך ב-BigQuery.

‫DDL של טבלה, תצוגה ורצף

CREATE TABLE דוחות

רוב ההצהרות של Snowflake CREATE TABLE תואמות ל-BigQuery, למעט רכיבי התחביר הבאים שלא נמצאים בשימוש ב-BigQuery:

Snowflake BigQuery

CREATE TABLE table_name

(

col1 data_type1 NOT NULL,

col2 data_type2 NULL,

col3 data_type3 UNIQUE,

col4 data_type4 PRIMARY KEY,

col5 data_type5

)


הערה: UNIQUE ו-PRIMARY KEY הן הגבלות שמיועדות למתן מידע, והמערכת של Snowflake לא אוכפת אותן.

CREATE TABLE table_name

(

col1 data_type1 NOT NULL,

col2 data_type2,

col3 data_type3,

col4 data_type4,

col5 data_type5,

)

CREATE TABLE table_name

(

col1 data_type1[,...]

table_constraints

)


כאשר table_constraints הם:

[UNIQUE(column_name [, ... ])]

[PRIMARY KEY(column_name [, ...])]

[FOREIGN KEY(column_name [, ...])

REFERENCES reftable [(refcolumn)]


הערה: UNIQUE וגם PRIMARY KEY אילוצים הם אינפורמטיביים ולא נאכפים על ידי מערכת Snowflake.

CREATE TABLE table_name

(

col1 data_type1[,...]

)

PARTITION BY column_name

CLUSTER BY column_name [, ...]


הערה: ב-BigQuery לא נעשה שימוש באילוצי טבלה מסוג UNIQUE,‏ PRIMARY KEY או FOREIGN KEY. כדי להשיג אופטימיזציה דומה לזו שמספקות המגבלות האלה במהלך ביצוע השאילתה, צריך לבצע חלוקה למחיצות ואשכול בטבלאות BigQuery. ‫CLUSTER BY תומך בעד ארבע עמודות.

CREATE TABLE table_name

LIKE original_table_name

בדוגמה הזו מוסבר איך להשתמש בטבלאות INFORMATION_SCHEMA כדי להעתיק שמות של עמודות, סוגי נתונים ואילוצים של NOT NULL לטבלה חדשה.

CREATE TABLE table_name

(

col1 data_type1

)

BACKUP NO


הערה:ב-Snowflake, ההגדרה BACKUP NO מצוינת כ'שמירת זמן העיבוד כשיוצרים תמונות מצב ומשחזרים מתמונות מצב, וצמצום נפח האחסון'.
לא נעשה שימוש באפשרות הטבלה BACKUP NO, והיא גם לא נדרשת, כי BigQuery שומר באופן אוטומטי עד 7 ימים של גרסאות היסטוריות של כל הטבלאות, בלי להשפיע על זמן העיבוד או על נפח האחסון שמחויב.

CREATE TABLE table_name

(

col1 data_type1

)

table_attributes


כאשר table_attributes הם:

[DISTSTYLE {AUTO|EVEN|KEY|ALL}]

[DISTKEY (column_name)]

[[COMPOUND|INTERLEAVED] SORTKEY

(column_name [, ...])]

‫BigQuery תומך ביצירת אשכולות, שמאפשרת לאחסן מפתחות בסדר ממוין.

CREATE TABLE table_name

AS SELECT ...

CREATE TABLE table_name

AS SELECT ...

CREATE TABLE IF NOT EXISTS table_name

...

CREATE TABLE IF NOT EXISTS table_name

...

‫BigQuery תומך גם בהצהרת DDL‏ CREATE OR REPLACE TABLEשמחליפה טבלה אם היא כבר קיימת.

הצהרת CREATE TABLE של BigQuery תומכת גם בסעיפים הבאים, שלא קיימים ב-Snowflake:

מידע נוסף על CREATE TABLE ב-BigQuery זמין בדוגמאות להצהרות CREATE TABLE במסמכי ה-DDL.

ALTER TABLE דוחות

בקטע הזה נשתמש בפקודות BigQuery CLI שמתאימות לפקודות Snowflake כדי לטפל בהבדלים בהצהרות ALTER לטבלאות.

Snowflake BigQuery

ALTER TABLE [ IF EXISTS ] <name> RENAME TO <new_name>

ALTER TABLE [IF EXISTS] <name>

SET OPTIONS (friendly_name="<new_name>")

ALTER TABLE <name>

SWAP WITH <target_db_name>

אין תמיכה בהחלפת טבלאות ב-BigQuery.

ALTER TABLE <name>

SET

[DEFAULT_DDL_COLLATION = '<value>']

ניהול אוסף כללים (collation) לטבלאות לא אפשרי ב-BigQuery.

ALTER TABLE <name>

SET

[DATA_RETENTION_TIME_IN_DAYS = <num>]

ALTER TABLE [IF EXISTS] <name>

SET OPTIONS (expiration_timestamp=<timestamp>)

ALTER TABLE <name>

SET

COMMENT = '<string_literal>'

ALTER TABLE [IF EXISTS] <name>

SET OPTIONS (description='<string_literal>')

בנוסף, Snowflake מספקת אפשרויות של אשכולות, עמודות ואילוצים לשינוי טבלאות שלא נתמכות על ידי BigQuery.

DROP TABLE ודוחות UNDROP TABLE

בקטע הזה נשתמש בפקודת BigQuery CLI שמתאימה לפקודת Snowflake כדי לטפל בהבדל בין הצהרות DROP ו-UNDROP.

Snowflake BigQuery

DROP TABLE [IF EXISTS] <table_name>

[CASCADE | RESTRICT]


הערה: ב-Snowflake, מחיקת טבלה לא מסירה אותה מהמערכת באופן סופי. גרסה של הטבלה שהוסרה נשמרת למספר הימים שצוין בפרמטר DATA_RETENTION_TIME_IN_DAYS של מסד הנתונים.

bq rm -r -f -d <dataset_name>.<table_name>


Where

‫‎-r משמש להסרת כל האובייקטים במערך הנתונים
‫‎-f משמש לדילוג על אישור לביצוע
‫‎-d מציין מערך נתונים

הערה: ב-BigQuery, גם מחיקה של טבלה היא לא קבועה, אבל נשמרת תמונה של הטבלה למשך 7 ימים בלבד.

UNDROP TABLE <table_name>

bq cp \ <dataset_name>.<table_name>@<unix_timestamp> <dataset_name>.<new_table_name>


הערה: ב-BigQuery, קודם צריך לקבוע את חותמת הזמן של מערכת UNIX שבה הטבלה הייתה קיימת (באלפיות השנייה). אחר כך מעתיקים את הטבלה בחותמת הזמן הזו לטבלה חדשה. השם של הטבלה החדשה צריך להיות שונה מהשם של הטבלה שנמחקה.

CREATE EXTERNAL TABLE דוחות

ב-BigQuery אפשר ליצור טבלאות חיצוניות קבועות וזמניות ולהריץ שאילתות על נתונים ישירות מ:

ב-Snowflake אפשר ליצור טבלה חיצונית קבועה, שכשמבצעים עליה שאילתה, היא קוראת נתונים מקבוצה של קובץ אחד או יותר בשלב חיצוני שצוין.

בקטע הזה נשתמש בפקודת BigQuery CLI שמתאימה לפקודת Snowflake כדי לטפל בהבדלים בפקודה CREATE EXTERNAL TABLE.

Snowflake BigQuery
CREATE [OR REPLACE] EXTERNAL TABLE

table

((<col_name> <col_type> AS <expr> )

| (<part_col_name> <col_type> AS <part_expr>)[ inlineConstraint ]

[ , ... ] )

LOCATION = externalStage

FILE_FORMAT =

({FORMAT_NAME='<file_format_name>'

|TYPE=source_format [formatTypeOptions]})


Where:

externalStage = @[namespace.]ext_stage_name[/path]


הערה: ב-Snowflake אפשר להכין את הקבצים שמכילים את הנתונים לקריאה, ולציין אפשרויות של סוג פורמט לטבלאות חיצוניות. סוגי פורמטים של Snowflake –‏ BigQuery תומך בכל הפורמטים האלה (CSV, ‏ JSON, ‏ AVRO, ‏ PARQUET, ‏ ORC) חוץ מפורמט XML.

[1] bq mk \

--external_table_definition=definition_file \

dataset.table


OR


[2] bq mk \

--external_table_definition=schema_file@source_format={Cloud Storage URI | drive_URI} \

dataset.table


OR


[3] bq mk \

--external_table_definition=schema@source_format = {Cloud Storage URI | drive_URI} \

dataset.table


הערה: ב-BigQuery אפשר ליצור טבלה קבועה שמקושרת למקור הנתונים באמצעות קובץ הגדרת טבלה [1], קובץ סכימת JSON [2] או הגדרת סכימה מוטבעת [3]. אין תמיכה בהעברה של קבצים זמניים לקריאה ובהגדרת אפשרויות של סוג פורמט ב-BigQuery.

CREATE [OR REPLACE] EXTERNAL TABLE [IF EXISTS]

<table_name>

((<col_name> <col_type> AS <expr> )

[ , ... ] )

[PARTITION BY (<identifier>, ...)]

LOCATION = externalStage

[REFRESH_ON_CREATE = {TRUE|FALSE}]

[AUTO_REFRESH = {TRUE|FALSE}]

[PATTERN = '<regex_pattern>']

FILE_FORMAT = ({FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET} [ formatTypeOptions]})

[COPY GRANTS]

[COMMENT = '<string_literal>']

bq mk \

--external_table_definition=definition_file \

dataset.table


הערה: BigQuery לא תומך באף אחת מהאפשרויות של הפרמטרים האופציונליים ש-Snowflake מספקת ליצירת טבלאות חיצוניות. לצורך חלוקה למחיצות, BigQuery תומך בשימוש בעמודה הווירטואלית _FILE_NAME כדי ליצור טבלאות או תצוגות מחולקות למחיצות על בסיס הטבלאות החיצוניות. מידע נוסף זמין במאמר בנושא שאילתות על פסאודו-עמודה של _FILE_NAME.

בנוסף, BigQuery תומך גם בשאילתות של נתונים עם חלוקה חיצונית למחיצות בפורמטים AVRO,‏ PARQUET,‏ ORC,‏ JSON ו-CSV, שמאוחסנים ב-Google Cloud Storage באמצעות פריסת חלוקה למחיצות של Hive כברירת מחדל.

CREATE VIEW דוחות

בטבלה הבאה מוצגים מקבילים בין Snowflake לבין BigQuery עבור הצהרת CREATE VIEW.

Snowflake BigQuery

CREATE VIEW view_name AS SELECT ...

CREATE VIEW view_name AS SELECT ...

CREATE OR REPLACE VIEW view_name AS SELECT ...

CREATE OR REPLACE VIEW

view_name AS SELECT ...

CREATE VIEW view_name

(column_name, ...)

AS SELECT ...

CREATE VIEW view_name

AS SELECT ...

לא נתמך CREATE VIEW IF NOT EXISTS

view_name

OPTIONS(view_option_list)

AS SELECT ...

CREATE VIEW view_name

AS SELECT ...

WITH NO SCHEMA BINDING

כדי ליצור תצוגה ב-BigQuery, כל האובייקטים שהתצוגה מפנה אליהם צריכים כבר להתקיים.

ב-BigQuery אפשר להריץ שאילתות על מקורות נתונים חיצוניים.

CREATE SEQUENCE דוחות

לא נעשה שימוש ברצפים ב-BigQuery, אבל אפשר להשיג את אותה תוצאה באמצעות השיטה הבאה לעיבוד אצווה. למידע נוסף על מפתחות חלופיים ומאפיינים שמשתנים לאט (SCD), אפשר לעיין במדריכים הבאים:

INSERT INTO dataset.table SELECT *, ROW_NUMBER() OVER () AS id FROM dataset.table

הוראות DDL לטעינה ולפריקה של נתונים

מערכת Snowflake תומכת בטעינה ובפריקה של נתונים באמצעות פקודות לניהול שלב, פורמט קובץ וצינור. ב-BigQuery יש גם כמה אפשרויות כמו bq load,‏ שירות העברת נתונים ל-BigQuery,‏ bq extract וכו'. בקטע הזה מוסבר על ההבדלים בשימוש במתודולוגיות האלה לטעינה ולפריקה של נתונים.

‫DDL של חשבון וסשן

המושגים 'חשבון' ו'סשן' של Snowflake לא נתמכים ב-BigQuery. ב-BigQuery אפשר לנהל חשבונות באמצעות Cloud IAM בכל הרמות. בנוסף, טרנזקציות עם כמה הצהרות אינן אפשריות ב-BigQuery.

פונקציות בהגדרת המשתמש (UDF)

פונקציה מוגדרת על ידי המשתמש מאפשרת לכם ליצור פונקציות לפעולות בהתאמה אישית. הפונקציות האלה מקבלות עמודות קלט, מבצעות פעולות ומחזירות את התוצאה של הפעולות האלה בתור ערך.

גם Snowflake וגם BigQuery תומכים בפונקציות בהגדרת המשתמש (UDF) באמצעות ביטויי SQL וקוד JavaScript.

במאגר GitHub‏ GoogleCloudPlatform/bigquery-utils/ אפשר למצוא ספרייה של פונקציות נפוצות מוגדרות על ידי המשתמש (UDF) ב-BigQuery.

תחביר CREATE FUNCTION

בטבלה הבאה מפורטים ההבדלים בתחביר של יצירת פונקציות מוגדרות על ידי המשתמש (UDF) ב-SQL בין Snowflake לבין BigQuery.

Snowflake BigQuery

CREATE [ OR REPLACE ] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition

s

CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

AS sql_function_definition


הערה: ב-SQL UDF ב-BigQuery, סוג הנתונים שמוחזר הוא אופציונלי. מערכת BigQuery מסיקה את סוג התוצאה של הפונקציה מגוף פונקציית ה-SQL כששאילתה קוראת לפונקציה.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS TABLE (col_name, col_data_type[,..])

AS sql_function_definition


CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


הערה:ב-SQL UDF ב-BigQuery אין תמיכה בהחזרת סוג טבלה, אבל התכונה הזו נמצאת בתוכנית הפיתוח של המוצר ותהיה זמינה בקרוב. עם זאת, BigQuery תומך בהחזרת ARRAY מסוג STRUCT.

CREATE [SECURE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


הערה: Snowflake מספקת אפשרות מאובטחת להגבלת ההגדרה והפרטים של פונקציות UDF רק למשתמשים מורשים (כלומר, משתמשים שהוקצה להם התפקיד שכולל את התצוגה).

CREATE FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


הערה: אבטחת הפונקציה היא לא פרמטר שאפשר להגדיר ב-BigQuery. ‫BigQuery תומך ביצירת תפקידים והרשאות של IAM כדי להגביל את הגישה לנתונים הבסיסיים ולהגדרת הפונקציה.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


הערה: ההתנהגות של הפונקציה עבור קלט null מטופלת באופן מרומז ב-BigQuery, ואין צורך לציין אותה כאפשרות נפרדת.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[VOLATILE | IMMUTABLE]

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


הערה:תנודתיות הפונקציה היא לא פרמטר שאפשר להגדיר ב-BigQuery. כל התנודתיות של UDF ב-BigQuery שווה לתנודתיות של IMMUTABLE ב-Snowflake (כלומר, היא לא מבצעת חיפושים במסד הנתונים או משתמשת במידע שלא מופיע ישירות ברשימת הארגומנטים שלה).

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS [' | $$]

sql_function_definition

[' | $$]

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


הערה: שימוש בגרשיים בודדים או ברצף תווים כמו ציטוט באמצעות סימן הדולר ($$) is not required or supported in BigQuery. BigQuery implicitly interprets the SQL expression.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[COMMENT = '<string_literal>']

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Note: Adding comments or descriptions in UDFs is not supported in BigQuery.

CREATE [OR REPLACE] FUNCTION function_name

(x integer, y integer)

RETURNS integer

AS $$

SELECT x + y

$$


Note: Snowflake does not support ANY TYPE for SQL UDFs. However, it supports using VARIANT data types.

CREATE [OR REPLACE] FUNCTION function_name

(x ANY TYPE, y ANY TYPE)

AS

SELECT x + y



Note: BigQuery supports using ANY TYPE as argument type. The function will accept an input of any type for this argument. For more information, see templated parameter in BigQuery.

BigQuery also supports the CREATE FUNCTION IF NOT EXISTSstatement which treats the query as successful and takes no action if a function with the same name already exists.

BigQuery's CREATE FUNCTIONstatement also supports creating TEMPORARY or TEMP functions, which do not have a Snowflake equivalent. See calling UDFs for details on executing a BigQuery persistent UDF.

DROP FUNCTION syntax

The following table addresses differences in DROP FUNCTION syntax between Snowflake and BigQuery.

Snowflake BigQuery

DROP FUNCTION [IF EXISTS]

function_name

([arg_data_type, ... ])

DROP FUNCTION [IF EXISTS] dataset_name.function_name


Note: BigQuery does not require using the function's signature (argument data type) for deleting the function.

BigQuery requires that you specify the project_name if the function is not located in the current project.

Additional function commands

This section covers additional UDF commands supported by Snowflake that are not directly available in BigQuery.

ALTER FUNCTION syntax

Snowflake supports the following operations using ALTER FUNCTION syntax.

  • Renaming a UDF
  • Converting to (or reverting from) a secure UDF
  • Adding, overwriting, removing a comment for a UDF

As configuring function security and adding function comments is not available in BigQuery, ALTER FUNCTION syntax is not supported. However, the CREATE FUNCTION statement can be used to create a UDF with the same function definition but a different name.

DESCRIBE FUNCTION syntax

Snowflake supports describing a UDF using DESC[RIBE] FUNCTION syntax. This is not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.

SHOW USER FUNCTIONS syntax

In Snowflake, SHOW USER FUNCTIONS syntax can be used to list all UDFs for which users have access privileges. This is not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.

Stored procedures

Snowflake stored procedures are written in JavaScript, which can execute SQL statements by calling a JavaScript API. In BigQuery, stored procedures are defined using a block of SQL statements.

CREATE PROCEDURE syntax

In Snowflake, a stored procedure is executed with a CALL command while in BigQuery, stored procedures are executed like any other BigQuery function.

The following table addresses differences in stored procedure creation syntax between Snowflake and BigQuery.

Snowflake BigQuery

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

AS procedure_definition;


Note: Snowflake requires that stored procedures return a single value. Hence, return data type is a required option.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_mode arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


arg_mode: IN | OUT | INOUT


Note: BigQuery doesn't support a return type for stored procedures. Also, it requires specifying argument mode for each argument passed.

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

AS

$$

javascript_code

$$;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

statement_list

END;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[{CALLED ON NULL INPUT | {RETURNS NULL ON NULL INPUT | STRICT}}]

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


הערה: ההתנהגות של הפרוצדורה עבור קלט null מטופלת באופן מרומז ב-BigQuery, ואין צורך לציין אותה כאפשרות נפרדת.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[VOLATILE | IMMUTABLE]

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


הערה:התנודתיות של הפרוצדורה היא לא פרמטר שאפשר להגדיר ב-BigQuery. היא מקבילה ל-IMMUTABLE volatility של Snowflake.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[COMMENT = '<string_literal>']

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


הערה: הוספת הערות או תיאורים בהגדרות של פרוצדורות אינה נתמכת ב-BigQuery.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[EXECUTE AS { CALLER | OWNER }]

AS procedure_definition;


הערה: Snowflake תומך בהגדרת המתקשר או הבעלים של הפרוצדורה לביצוע

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


הערה: תהליכים מאוחסנים ב-BigQuery תמיד מופעלים כמתקשר

‫BigQuery תומך גם בהצהרה CREATE PROCEDURE IF NOT EXISTS, שמטפלת בשאילתה כהצלחה ולא מבצעת פעולה אם כבר קיימת פונקציה עם אותו שם.

תחביר DROP PROCEDURE

בטבלה הבאה מפורטים ההבדלים בתחביר של DROP FUNCTION בין Snowflake לבין BigQuery.

Snowflake BigQuery

DROP PROCEDURE [IF EXISTS]

procedure_name

([arg_data_type, ... ])

DROP PROCEDURE [IF EXISTS] dataset_name.procedure_name


הערה: כדי למחוק את הפרוצדורה ב-BigQuery, לא צריך להשתמש בחתימה שלה (סוג הנתונים של הארגומנט).

ב-BigQuery, חובה לציין את project_name אם הפרוצדורה לא נמצאת בפרויקט הנוכחי.

פקודות נוספות של הליך

ב-Snowflake יש פקודות נוספות כמו ALTER PROCEDURE,‏ DESC[RIBE] PROCEDURE ו-SHOW PROCEDURES לניהול הפרוצדורות המאוחסנות. אין תמיכה בערכים האלה ב-BigQuery.

מטא-נתונים והצהרות SQL של טרנזקציות

Snowflake BigQuery

BEGIN [ { WORK | TRANSACTION } ] [ NAME <name> ]; START_TRANSACTION [ name <name> ];

ב-BigQuery תמיד נעשה שימוש בבידוד של תמונת מצב. פרטים נוספים זמינים בקטע הבטחות עקביות בהמשך המאמר הזה.

COMMIT;

לא בשימוש ב-BigQuery.

ROLLBACK;

לא בשימוש ב-BigQuery

SHOW LOCKS [ IN ACCOUNT ]; SHOW TRANSACTIONS [ IN ACCOUNT ]; Note: If the user has the ACCOUNTADMIN role, the user can see locks/transactions for all users in the account.

לא בשימוש ב-BigQuery.

הצהרות SQL מרובות שורות והצהרות SQL מרובות

גם Snowflake וגם BigQuery תומכות בטרנזקציות (סשנים), ולכן תומכות בהצהרות שמופרדות באמצעות נקודה-פסיק ומופעלות יחד באופן עקבי. מידע נוסף מופיע במאמר בנושא טרנזקציות עם כמה תדפיסי חשבון.

עמודות של מטא-נתונים לקבצים בהמתנה

‫Snowflake יוצרת אוטומטית מטא-נתונים לקבצים בשלבים פנימיים וחיצוניים. אפשר לשאול שאילתות על המטא-נתונים האלה ולטעון אותם לטבלה לצד עמודות נתונים רגילות. אפשר להשתמש בעמודות המטא-נתונים הבאות:

התחייבויות עקביות ורמת בידוד של טרנזקציה

גם Snowflake וגם BigQuery הן אטומיות – כלומר, הן תואמות ל-ACID ברמת כל שינוי, על פני שורות רבות.

טרנזקציות

לכל עסקה ב-Snowflake מוקצה זמן התחלה ייחודי (כולל אלפיות השנייה) שמוגדר כמזהה העסקה. ‫Snowflake תומך רק ברמת הבידוד READ COMMITTED. עם זאת, יכול להיות שמשפט יראה שינויים שבוצעו על ידי משפט אחר אם שניהם נמצאים באותה עסקה – גם אם השינויים האלה עדיין לא אושרו. ב-Snowflake, עסקאות מקבלות נעילות על משאבים (טבלאות) כשמתבצע שינוי במשאב. המשתמשים יכולים לשנות את הזמן המקסימלי שבו הצהרה חסומה תמתין עד שתפוג. פקודות DML עוברות אישור אוטומטי אם הפרמטר AUTOCOMMIT מופעל.

‫BigQuery גם תומך בעסקאות. ‫BigQuery עוזר להבטיח בקרת בו-זמניות אופטימית (הראשון שמבצע commit זוכה) באמצעות בידוד snapshot, שבו שאילתה קוראת את הנתונים האחרונים שבוצעו לפני שהשאילתה מתחילה. גישה זו מבטיחה את אותה רמת עקביות בכל שורה, בכל שינוי ובכל השורות באותה פקודת DML, ועדיין מונעת מצבי קיפאון. במקרה של כמה עדכוני DML באותה טבלה, BigQuery עובר לבקרת בו-זמניות פסימית. אפשר להריץ משימות טעינה באופן עצמאי לחלוטין ולצרף אותן לטבלאות. עם זאת, ב-BigQuery אין גבולות ברורים לטרנזקציות או להפעלות.

חזרה לגרסה קודמת

אם סשן של עסקה ב-Snowflake מסתיים באופן לא צפוי לפני שהעסקה מאושרת או מבוטלת, העסקה נשארת במצב מנותק. המשתמש צריך להריץ את הפקודה SYSTEM$ABORT_TRANSACTION כדי לבטל את העסקה המנותקת, אחרת Snowflake יבצע Rollback לעסקה המנותקת אחרי ארבע שעות של חוסר פעילות. אם מתרחש מצב של קיפאון, Snowflake מזהה את הקיפאון ובוחר את ההצהרה העדכנית ביותר לביטול. אם פקודת ה-DML בעסקה שנפתחה באופן מפורש נכשלת, השינויים מבוטלים, אבל העסקה נשארת פתוחה עד שהיא מאושרת או מבוטלת. אי אפשר לבטל הצהרות DDL ב-Snowflake כי הן מתבצעות אוטומטית.

‫BigQuery תומך בהצהרת ROLLBACK TRANSACTION. אין הצהרה של ABORT ב-BigQuery.

מגבלות על מסדי נתונים

חשוב תמיד לעיין במסמכים הציבוריים של BigQuery כדי לראות את המכסות והמגבלות העדכניות. משתמשים עם נפח גדול יכולים לפנות לצוות התמיכה של Cloud כדי להגדיל את המכסות שלהם.

בכל החשבונות ב-Snowflake מוגדרות כברירת מחדל מגבלות רכות. הגבלות רכות מוגדרות במהלך יצירת החשבון, והן עשויות להשתנות. אפשר להגדיל הרבה מהמגבלות הרכות של Snowflake באמצעות צוות ניהול החשבון של Snowflake או כרטיס תמיכה.

בטבלה הבאה מוצגת השוואה בין מגבלות מסד הנתונים של Snowflake ושל BigQuery.

מגבלה Snowflake BigQuery
גודל הטקסט של השאילתה ‫1MB ‫1MB
מספר מקסימלי של שאילתות בו-זמנית ‫XS Warehouse - 8
‫S Warehouse - 16
‫M Warehouse - 32
L Warehouse - 64
‫XL Warehouse - 128
100