מדריך לתרגום של Apache Hive SQL

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

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

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

סוגי נתונים

ל-Hive ול-BigQuery יש מערכות שונות של סוגי נתונים. ברוב המקרים, אפשר למפות סוגי נתונים ב-Hive לסוגי נתונים ב-BigQuery, עם כמה יוצאים מן הכלל, כמו MAP ו-UNION. ‫Hive תומך ביותר המרות מרומזות של סוגי נתונים מאשר BigQuery. כתוצאה מכך, כלי התרגום של SQL באצווה מוסיף הרבה המרות מפורשות.

Hive BigQuery
TINYINT INT64
SMALLINT INT64
INT INT64
BIGINT INT64
DECIMAL NUMERIC
FLOAT FLOAT64
DOUBLE FLOAT64
BOOLEAN BOOL
STRING STRING
VARCHAR STRING
CHAR STRING
BINARY BYTES
DATE DATE
- DATETIME
- TIME
TIMESTAMP DATETIME/TIMESTAMP
INTERVAL -
ARRAY ARRAY
STRUCT STRUCT
MAPS STRUCT עם ערכי מפתח (שדה REPEAT)
UNION STRUCT עם סוגים שונים
- GEOGRAPHY
- JSON

תחביר של שאילתות

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

SELECT דוחות

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

Case Hive BigQuery
שאילתת משנה

SELECT * FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
) tmp_table;

SELECT * FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
);

סינון עמודות

SET hive.support.quoted.identifiers=none;
SELECT `(col2|col3)?+.+` FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
) tmp_table;

SELECT * EXCEPT(col2,col3) FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
);

הרחבת מערך

SELECT tmp_table.pageid, adid FROM (
SELECT 'test_value' pageid, Array(1,2,3) ad_id) tmp_table
LATERAL VIEW
explode(tmp_table.ad_id) adTable AS adid;

SELECT tmp_table.pageid, ad_id FROM (
SELECT 'test_value' pageid, [1,2,3] ad_id) tmp_table,
UNNEST(tmp_table.ad_id) ad_id;

סעיף FROM

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

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

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

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

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

בטבלה הבאה מפורטים אופרטורים להמרה מ-Hive ל-BigQuery:

פונקציה או אופרטור Hive BigQuery
- מינוס אונרי
* כפל
/ חילוק
+ חיבור
- חיסור
כל סוגי המספרים כל סוגי המספרים.

כדי למנוע שגיאות במהלך פעולת החילוק, כדאי להשתמש ב-SAFE_DIVIDE או ב-IEEE_DIVIDE.

~ Bitwise not ‏
| Bitwise OR ‏
& Bitwise AND ‏
^ Bitwise XOR
סוג נתונים בוליאני סוג הנתונים הוא בוליאני.
Shift שמאלי

shiftleft(TINYINT|SMALLINT|INT a, INT b)
shiftleft(BIGINT a, INT b)

<< מספר שלם או בייטים

A << B, כשB צריך להיות מאותו סוג כמו A

Shift ימני

shiftright(TINYINT|SMALLINT|INT a, INT b)
shiftright(BIGINT a, INT b)

>> מספר שלם או בייטים

A >> B, כשB צריך להיות מאותו סוג כמו A

מודולוס (שארית) X % Y

כל סוגי המספרים

MOD(X, Y)
חילוק של מספרים שלמים A DIV B ו-A/B לדיוק מפורט כל סוגי המספרים.

הערה: כדי למנוע שגיאות במהלך פעולת החלוקה, מומלץ להשתמש בפונקציה SAFE_DIVIDE או IEEE_DIVIDE.

שלילה אונארית !, NOT NOT
סוגים שתומכים בהשוואות שוויון כל הסוגים הפרימיטיביים כל הסוגים להשוואה וSTRUCT.
a <=> b לא נתמך. תרגם את הטקסט הבא:

(a = b AND b IS NOT NULL OR a IS NULL)

a <> b לא נתמך. תרגם את הטקסט הבא:

NOT (a = b AND b IS NOT NULL OR a IS NULL)

אופרטורים יחסיים ( =, ==, !=, <, >, >= ) כל הסוגים הפרימיטיביים כל הסוגים להשוואה.
השוואת מחרוזות RLIKE, REGEXP פונקציה מובנית REGEXP_CONTAINS. משתמש בתבניות של ביטויים רגולריים בתחביר של ביטויים רגולריים של BigQuery לפונקציות של מחרוזות.
[NOT] LIKE, [NOT] BETWEEN, IS [NOT] NULL A [NOT] BETWEEN B AND C, A IS [NOT] (TRUE|FALSE), A [NOT] LIKE B כמו ב-Hive. בנוסף, BigQuery תומך גם באופרטור IN.

תנאי JOIN

גם Hive וגם BigQuery תומכים בסוגי הצירופים הבאים:

  • [INNER] JOIN

  • LEFT [OUTER] JOIN

  • RIGHT [OUTER] JOIN

  • FULL [OUTER] JOIN

  • CROSS JOIN ו-comma cross join המרומז המקביל

מידע נוסף זמין במאמרים בנושא איחוד בין מערכי נתונים ואיחוד בין מערכי נתונים ב-Hive.

המרת סוגים (type conversion) והמרת טיפוסים (casting)

בטבלה הבאה מפורטות פונקציות להמרה מ-Hive ל-BigQuery:

פונקציה או אופרטור Hive BigQuery
המרה של סוגים אם ההמרה נכשלת, הפונקציה מחזירה `NULL`.

תחביר זהה ל-Hive. מידע נוסף על כללי המרה של סוגים ב-BigQuery זמין במאמר כללי המרה.

אם ההפעלה של Cast נכשלת, מוצגת שגיאה. כדי לקבל את אותה התנהגות כמו ב-Hive, משתמשים במקום זאת ב-SAFE_CAST.

SAFE בקשות להפעלת פונקציות אם מוסיפים את הקידומת SAFE לקריאות לפונקציה, הפונקציה מחזירה את הערך NULL במקום לדווח על כשל. לדוגמה, הפונקציה SAFE.SUBSTR('foo', 0, -2) AS safe_output; מחזירה NULL.

הערה: אם ההפעלה של Cast מתבצעת בצורה בטוחה וללא שגיאות, אפשר להשתמש ב-SAFE_CAST.

סוגי המרות משתמעים

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

מהסוג BigQuery לסוג BigQuery
INT64 FLOAT64, NUMERIC, BIGNUMERIC
BIGNUMERIC FLOAT64
NUMERIC BIGNUMERIC, FLOAT64

ב-BigQuery מתבצעות גם המרות מרומזות של הערכים המילוליים הבאים:

מהסוג BigQuery לסוג BigQuery
STRING מילולי (לדוגמה, "2008-12-25") DATE
STRING מילולי (לדוגמה, "2008-12-25 15:30:00") TIMESTAMP
STRING מילולי (לדוגמה, "2008-12-25T07:30:00") DATETIME
STRING מילולי (לדוגמה, "15:30:00") TIME

סוגי המרות מפורשים

אם רוצים להמיר סוגי נתונים של Hive ש-BigQuery לא ממיר באופן מרומז, צריך להשתמש בפונקציה CAST(expression AS type) של BigQuery.

פונקציות

בקטע הזה מפורטות פונקציות נפוצות שמשמשות ב-Hive וב-BigQuery.

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

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

Hive BigQuery
count(DISTINCT expr[, expr...]) count(DISTINCT expr[, expr...])
percentile_approx(DOUBLE col, array(p1 [, p2]...) [, B]) WITHIN GROUP (ORDER BY expression) APPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))]

‫BigQuery לא תומך בשאר הארגומנטים שמוגדרים ב-Hive.

AVG AVG
X | Y BIT_OR / X | Y
X ^ Y BIT_XOR / X ^ Y
X & Y BIT_AND / X & Y
COUNT COUNT
COLLECT_SET(col), \ COLLECT_LIST(col) ARRAY_AGG(col)
COUNT COUNT
MAX MAX
MIN MIN
REGR_AVGX AVG(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, ind_var_expr)

)

REGR_AVGY AVG(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, dep_var_expr)

)

REGR_COUNT SUM(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, 1)

)

REGR_INTERCEPT AVG(dep_var_expr)

- AVG(ind_var_expr)

* (COVAR_SAMP(ind_var_expr,dep_var_expr)

/ VARIANCE(ind_var_expr)

)

REGR_R2 (COUNT(dep_var_expr) *

SUM(ind_var_expr * dep_var_expr) -

SUM(dep_var_expr) * SUM(ind_var_expr))

/ SQRT(

(COUNT(ind_var_expr) *

SUM(POWER(ind_var_expr, 2)) *

POWER(SUM(ind_var_expr),2)) *

(COUNT(dep_var_expr) *

SUM(POWER(dep_var_expr, 2)) *

POWER(SUM(dep_var_expr), 2)))

REGR_SLOPE COVAR_SAMP(ind_var_expr,

dep_var_expr)

/ VARIANCE(ind_var_expr)

REGR_SXX SUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
REGR_SXY SUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
REGR_SYY SUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
ROLLUP ROLLUP
STDDEV_POP STDDEV_POP
STDDEV_SAMP STDDEV_SAMP, STDDEV
SUM SUM
VAR_POP VAR_POP
VAR_SAMP VAR_SAMP, VARIANCE
CONCAT_WS STRING_AGG

פונקציות אנליטיות

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

Hive BigQuery
AVG AVG
COUNT COUNT
COVAR_POP COVAR_POP
COVAR_SAMP COVAR_SAMP
CUME_DIST CUME_DIST
DENSE_RANK DENSE_RANK
FIRST_VALUE FIRST_VALUE
LAST_VALUE LAST_VALUE
LAG LAG
LEAD LEAD
COLLECT_LIST, \ COLLECT_SET ARRAY_AGG ARRAY_CONCAT_AGG
MAX MAX
MIN MIN
NTILE NTILE(constant_integer_expression)
PERCENT_RANK PERCENT_RANK
RANK () RANK
ROW_NUMBER ROW_NUMBER
STDDEV_POP STDDEV_POP
STDDEV_SAMP STDDEV_SAMP, STDDEV
SUM SUM
VAR_POP VAR_POP
VAR_SAMP VAR_SAMP, VARIANCE
VARIANCE VARIANCE ()
WIDTH_BUCKET אפשר להשתמש בפונקציה בהגדרת המשתמש (UDF).

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

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

DATE_ADD DATE_ADD(date_expression, INTERVAL int64_expression date_part)
DATE_SUB DATE_SUB(date_expression, INTERVAL int64_expression date_part)
CURRENT_DATE CURRENT_DATE
CURRENT_TIME CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_DATETIME מומלץ, כי הערך הזה לא תלוי באזור זמן והוא זהה לערך CURRENT_TIMESTAMP \ CURRENT_TIMESTAMP ב-Hive.
EXTRACT(field FROM source) EXTRACT(part FROM datetime_expression)
LAST_DAY DATE_SUB( DATE_TRUNC( DATE_ADD(

date_expression, INTERVAL 1 MONTH

), MONTH ), INTERVAL 1 DAY)

MONTHS_BETWEEN DATE_DIFF(date_expression, date_expression, MONTH)
NEXT_DAY DATE_ADD(

DATE_TRUNC(

date_expression,

WEEK(day_value)

),

INTERVAL 1 WEEK

)

TO_DATE PARSE_DATE
FROM_UNIXTIME UNIX_SECONDS
FROM_UNIXTIMESTAMP FORMAT_TIMESTAMP
YEAR \ QUARTER \ MONTH \ HOUR \ MINUTE \ SECOND \ WEEKOFYEAR EXTRACT
DATEDIFF DATE_DIFF

‫BigQuery מציע את הפונקציות הנוספות הבאות של תאריך ושעה:

פונקציות מחרוזת

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

Hive BigQuery
ASCII TO_CODE_POINTS(string_expr)[OFFSET(0)]
HEX TO_HEX
LENGTH CHAR_LENGTH
LENGTH CHARACTER_LENGTH
CHR CODE_POINTS_TO_STRING
CONCAT CONCAT
LOWER LOWER
LPAD LPAD
LTRIM LTRIM
REGEXP_EXTRACT REGEXP_EXTRACT
REGEXP_REPLACE REGEXP_REPLACE
REPLACE REPLACE
REVERSE REVERSE
RPAD RPAD
RTRIM RTRIM
SOUNDEX SOUNDEX
SPLIT SPLIT(instring, delimiter)[ORDINAL(tokennum)]
SUBSTR, \ SUBSTRING SUBSTR
TRANSLATE TRANSLATE
LTRIM LTRIM
RTRIM RTRIM
TRIM TRIM
UPPER UPPER

‫BigQuery מציע את הפונקציות הנוספות הבאות למחרוזות:

פונקציות מתמטיות

בטבלה הבאה מוצגים מיפויים בין פונקציות מתמטיות ב-Hive לבין הפונקציות המקבילות ב-BigQuery:

Hive BigQuery
ABS ABS
ACOS ACOS
ASIN ASIN
ATAN ATAN
CEIL CEIL
CEILING CEILING
COS COS
FLOOR FLOOR
GREATEST GREATEST
LEAST LEAST
LN LN
LNNVL שימוש עם ISNULL.
LOG LOG
MOD (% operator) MOD
POWER POWER, POW
RAND RAND
ROUND ROUND
SIGN SIGN
SIN SIN
SQRT SQRT
HASH FARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
STDDEV_POP STDDEV_POP
STDDEV_SAMP STDDEV_SAMP
TAN TAN
TRUNC TRUNC
NVL IFNULL(expr, 0), COALESCE(exp, 0)

ב-BigQuery יש פונקציות מתמטיות נוספות:

פונקציות לוגיות ותנאיות

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

Hive BigQuery
CASE CASE
COALESCE COALESCE
NVL IFNULL(expr, 0), COALESCE(exp, 0)
NULLIF NULLIF
IF IF(expr, true_result, else_result)
ISNULL IS NULL
ISNOTNULL IS NOT NULL
NULLIF NULLIF

פונקציות UDF ופונקציות UDAF

‫Apache Hive תומך בכתיבת פונקציות בהגדרת המשתמש (UDF) ב-Java. אפשר לטעון פונקציות UDF ל-Hive כדי להשתמש בהן בשאילתות רגילות. פונקציות UDF ב-BigQuery צריך לכתוב ב-GoogleSQL או ב-JavaScript. מומלץ להמיר את פונקציות UDF של Hive לפונקציות UDF של SQL כי פונקציות UDF של SQL פועלות טוב יותר. אם אתם צריכים להשתמש ב-JavaScript, כדאי לקרוא את המאמר שיטות מומלצות לשימוש בפונקציות מוגדרות על ידי המשתמש (UDF) ב-JavaScript. בשפות אחרות, BigQuery תומך בפונקציות מרוחקות שמאפשרות להפעיל את הפונקציות בפונקציות Cloud Run או ב-Cloud Run משאילתות GoogleSQL.

‫BigQuery לא תומך בפונקציות צבירה שהוגדרו על ידי המשתמש (UDAFs).

תחביר DML

בקטע הזה מוסבר על ההבדלים בתחביר של שפת טיפול בנתונים (DML) בין Hive לבין BigQuery.

INSERT דוחות

רוב ההצהרות של Hive INSERT תואמות ל-BigQuery. בטבלה הבאה מוצגים חריגים:

Hive BigQuery
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...] INSERT INTO table (...) VALUES (...);

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

INSERT OVERWRITE [LOCAL] DIRECTORY directory1

[ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)

SELECT ... FROM ...

‫BigQuery לא תומך בפעולות insert-overwrite. אפשר להעביר את התחביר הזה של Hive להצהרות TRUNCATE ו-INSERT.

ב-BigQuery יש מכסות DML שמגבילות את מספר הצהרות ה-DML שאפשר להריץ מדי יום. כדי להפיק את המרב מהמכסה, כדאי לשקול את הגישות הבאות:

  • לשלב כמה שורות בהצהרת INSERT אחת, במקום שורה אחת לכל פעולת INSERT.

  • אפשר לשלב כמה פקודות DML (כולל INSERT) באמצעות פקודת MERGE.

  • משתמשים ב-CREATE TABLE ... AS SELECT כדי ליצור טבלאות חדשות ולאכלס אותן.

UPDATE דוחות

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

Hive BigQuery
UPDATE tablename SET column = value [, column = value ...] [WHERE expression] UPDATE table

SET column = expression [,...]

[FROM ...]

WHERE TRUE

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

DELETE ודוחות TRUNCATE

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

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

Hive BigQuery
DELETE FROM tablename [WHERE expression] DELETE FROM table_name WHERE TRUE

הצהרות BigQuery DELETE דורשות פסקה WHERE .

TRUNCATE [TABLE] table_name [PARTITION partition_spec]; TRUNCATE TABLE [[project_name.]dataset_name.]table_name

MERGE דוחות

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

Hive BigQuery
MERGE INTO AS T USING AS S ON

WHEN MATCHED [AND ] THEN UPDATE SET

WHEN MATCHED [AND ] THEN DELETE

WHEN NOT MATCHED [AND ] THEN INSERT VALUES

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,

...

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

ALTER דוחות

בטבלה הבאה מפורטות המרות של הצהרות CREATE VIEW מ-Hive ל-BigQuery:

פונקציה Hive BigQuery
Rename table ALTER TABLE table_name RENAME TO new_table_name; לא נתמך. פתרון עקיף הוא להשתמש במשימת העתקה עם השם שרוצים בתור טבלת היעד, ואז למחוק את הטבלה הישנה.

bq copy project.dataset.old_table project.dataset.new_table

bq rm --table project.dataset.old_table

Table properties ALTER TABLE table_name SET TBLPROPERTIES table_properties;

table_properties:

: (property_name = property_value, property_name = property_value, ... )

Table Comment: ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

{ALTER TABLE | ALTER TABLE IF EXISTS}

table_name

SET OPTIONS(table_set_options_list)

SerDe properties (Serialize and deserialize) ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];

ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;

serde_properties:

: (property_name = property_value, property_name = property_value, ... )

הסדרות והדה-סדרות מנוהלות על ידי שירות BigQuery ולא ניתן להגדיר אותן על ידי המשתמש.

במאמר יצירת טבלאות חיצוניות ב-Cloud Storage מוסבר איך מאפשרים ל-BigQuery לקרוא נתונים מקובצי CSV,‏ JSON,‏ AVRO,‏ PARQUET או ORC.

תמיכה בפורמטים לייצוא: CSV,‏ JSON,‏ AVRO ו-PARQUET. מידע נוסף זמין במאמר פורמטים לייצוא וסוגי דחיסה.

Table storage properties ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)] INTO num_buckets BUCKETS; התכונה לא נתמכת בהצהרות ALTER.
Skewed table Skewed: ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...) ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...]

[STORED AS DIRECTORIES];

Not Skewed: ALTER TABLE table_name NOT SKEWED;

Not Stored as Directories: ALTER TABLE table_name NOT STORED AS DIRECTORIES;

Skewed Location: ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );

שירות BigQuery מנהל את האיזון בין האחסון לבין שאילתות הביצועים, ואי אפשר להגדיר אותו.
Table constraints ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column, ...) DISABLE NOVALIDATE; ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column, ...) REFERENCES table_name(column, ...) DISABLE NOVALIDATE RELY;

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

ALTER TABLE [[project_name.]dataset_name.]table_name
ADD [CONSTRAINT [IF NOT EXISTS] [constraint_name]] constraint NOT ENFORCED;
ALTER TABLE [[project_name.]dataset_name.]table_name
ADD PRIMARY KEY(column_list) NOT ENFORCED;

מידע נוסף זמין בדף החשבון של ALTER TABLE ADD PRIMARY KEY.

Add partition ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

partition_spec:

: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

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

מידע נוסף זמין במאמר בנושא ניהול טבלאות מחולקות.

Rename partition ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec; לא נתמך.
Exchange partition -- Move partition from table_name_1 to table_name_2

ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1; -- multiple partitions

ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec, partition_spec2, ...) WITH TABLE table_name_1;

לא נתמך.
Recover partition MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS]; לא נתמך.
Drop partition ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...] [IGNORE PROTECTION] [PURGE]; אפשר להשתמש בשיטות הבאות:
  • bq rm 'mydataset.table_name$partition_id'
  • DELETE from table_name$partition_id WHERE 1=1

  • מידע נוסף מופיע במאמר בנושא מחיקת מחיצה.

(Un)Archive partition ALTER TABLE table_name ARCHIVE PARTITION partition_spec; ALTER TABLE table_name UNARCHIVE PARTITION partition_spec; לא נתמך.
Table and partition file format ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format; לא נתמך.
Table and partition location ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location"; לא נתמך.
Table and partition touch ALTER TABLE table_name TOUCH [PARTITION partition_spec]; לא נתמך.
Table and partition protection ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE NO_DROP [CASCADE];

ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE OFFLINE;

לא נתמך.
Table and partition compact ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] COMPACT 'compaction_type'[AND WAIT]

[WITH OVERWRITE TBLPROPERTIES ("property"="value" [, ...])];

לא נתמך.
Table and artition concatenate ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE; לא נתמך.
Table and partition columns ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] UPDATE COLUMNS; התכונה לא נתמכת בהצהרות ALTER TABLE.
Column name, type, position, and comment ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT]; לא נתמך.

תחביר DDL

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

CREATE TABLE ודוחות DROP TABLE

בטבלה הבאה מפורטות המרות של הצהרות CREATE TABLE מ-Hive ל-BigQuery:

סוג Hive BigQuery
טבלאות מנוהלות create table table_name (

id int,

dtDontQuery string,

name string

)

CREATE TABLE `myproject`.mydataset.table_name (

id INT64,

dtDontQuery STRING,

name STRING

)

טבלאות מחולקות למחיצות create table table_name (

id int,

dt string,

name string

)

partitioned by (date string)

CREATE TABLE `myproject`.mydataset.table_name (

id INT64,

dt DATE,

name STRING

)

PARTITION BY dt

OPTIONS(

partition_expiration_days=3,

description="a table partitioned by date_col"

)

Create table as select (CTAS) CREATE TABLE new_key_value_store

ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"

STORED AS RCFile

AS

SELECT (key % 1024) new_key, concat(key, value) key_value_pair, dt

FROM key_value_store

SORT BY new_key, key_value_pair;

CREATE TABLE `myproject`.mydataset.new_key_value_store

כשמבצעים חלוקה למחיצות לפי תאריך, מבטלים את ההערה של השורות הבאות:

PARTITION BY dt

OPTIONS(

description="Table Description",

כשמבצעים חלוקה למחיצות לפי תאריך, מבטלים את ההערה בשורות הבאות. מומלץ להשתמש ב-require_partition כשהטבלה מחולקת למחיצות.

require_partition_filter=TRUE

) AS

SELECT (key % 1024) new_key, concat(key, value) key_value_pair, dt

FROM key_value_store

SORT BY new_key, key_value_pair'

Create Table Like:

הצורה LIKE של CREATE TABLE מאפשרת להעתיק בדיוק הגדרה קיימת של טבלה.

CREATE TABLE empty_key_value_store

LIKE key_value_store [TBLPROPERTIES (property_name=property_value, ...)];

לא נתמך.
טבלאות ממוינות עם חלוקה לדליים (clustered במינוח של BigQuery) CREATE TABLE page_view(

viewTime INT,

userid BIGINT,

page_url STRING,

referrer_url STRING,

ip STRING COMMENT 'IP Address of the User'

)

COMMENT 'This is the page view table'

PARTITIONED BY(dt STRING, country STRING)

CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\001'

COLLECTION ITEMS TERMINATED BY '\002'

MAP KEYS TERMINATED BY '\003'

STORED AS SEQUENCEFILE;

CREATE TABLE `myproject` mydataset.page_view (

viewTime INT,

dt DATE,

userId BIGINT,

page_url STRING,

referrer_url STRING,

ip STRING OPTIONS (description="IP Address of the User")

)

PARTITION BY dt

CLUSTER BY userId

OPTIONS (

partition_expiration_days=3,

description="This is the page view table",

require_partition_filter=TRUE

)'

מידע נוסף זמין במאמר בנושא יצירה ושימוש בטבלאות מקובצות.

טבלאות מוטות (טבלאות שבהן עמודה אחת או יותר כוללות ערכים מוטים) CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)

SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];

לא נתמך.
טבלאות זמניות CREATE TEMPORARY TABLE list_bucket_multiple (

col1 STRING,

col2 int,

col3 STRING);

כדי לעשות את זה, אפשר להשתמש בזמן התפוגה באופן הבא:

CREATE TABLE mydataset.newtable

(

col1 STRING OPTIONS(description="An optional INTEGER field"),

col2 INT64,

col3 STRING

)

PARTITION BY DATE(_PARTITIONTIME)

OPTIONS(

expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",

partition_expiration_days=1,

description="a table that expires in 2020, with each partition living for 24 hours",

labels=[("org_unit", "development")]

)

טבלאות של עסקאות CREATE TRANSACTIONAL TABLE transactional_table_test(key string, value string) PARTITIONED BY(ds string) STORED AS ORC; כל השינויים בטבלאות ב-BigQuery תואמים ל-ACID (אטומיות, עקביות, בידוד ועמידות).
הסרת טבלה DROP TABLE [IF EXISTS] table_name [PURGE]; {DROP TABLE | DROP TABLE IF EXISTS}

table_name

חיתוך טבלה TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:

: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

לא נתמך. אלה הפתרונות האפשריים:

  • מבטלים את הטבלה ויוצרים אותה מחדש עם אותה סכימה.
  • מגדירים את מאפיין הכתיבה של הטבלה ל-WRITE_TRUNCATE אם פעולת החיתוך היא תרחיש לדוגמה נפוץ עבור הטבלה הנתונה.
  • משתמשים בהצהרה CREATE OR REPLACE TABLE.
  • משתמשים בהצהרה DELETE from table_name WHERE 1=1.

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

CREATE EXTERNAL TABLE ודוחות DROP EXTERNAL TABLE

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

CREATE VIEW ודוחות DROP VIEW

בטבלה הבאה מפורטות המרות של הצהרות CREATE VIEW מ-Hive ל-BigQuery:

Hive BigQuery
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]

[COMMENT view_comment]

[TBLPROPERTIES (property_name = property_value, ...)]

AS SELECT ...;

{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}

view_name

[OPTIONS(view_option_list)]

AS query_expression

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name

[DISABLE REWRITE]

[COMMENT materialized_view_comment]

[PARTITIONED ON (col_name, ...)]

[

[ROW FORMAT row_format]

[STORED AS file_format]

| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]

]

[LOCATION hdfs_path]

[TBLPROPERTIES (property_name=property_value, ...)]

AS

;

CREATE MATERIALIZED VIEW [IF NOT EXISTS] \ [project_id].[dataset_id].materialized_view_name

-- cannot disable rewrites in BigQuery

[OPTIONS(

[description="materialized_view_comment",] \ [other materialized_view_option_list]

)]

[PARTITION BY (col_name)] --same as source table

CREATE FUNCTION ודוחות DROP FUNCTION

בטבלה הבאה מפורטות המרות של פרוצדורות מאוחסנות מ-Hive ל-BigQuery:

Hive BigQuery
CREATE TEMPORARY FUNCTION function_name AS class_name; CREATE { TEMPORARY | TEMP } FUNCTION function_name ([named_parameter[, ...]])

[RETURNS data_type]

AS (sql_expression)

named_parameter:

param_name param_type

DROP TEMPORARY FUNCTION [IF EXISTS] function_name; לא נתמך.
CREATE FUNCTION [db_name.]function_name AS class_name

[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

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

CREATE { FUNCTION | FUNCTION IF NOT EXISTS | OR REPLACE FUNCTION }

function_name ([named_parameter[, ...]])

[RETURNS data_type]

AS (expression);

named_parameter:

param_name param_type

DROP FUNCTION [IF EXISTS] function_name; DROP FUNCTION [ IF EXISTS ] function_name
RELOAD FUNCTION; לא נתמך.

CREATE MACRO ודוחות DROP MACRO

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

Hive BigQuery
CREATE TEMPORARY MACRO macro_name([col_name col_type, ...]) expression; לא נתמך. במקרים מסוימים, אפשר להשתמש במקום זאת בפונקציה מוגדרת על ידי המשתמש (UDF).
DROP TEMPORARY MACRO [IF EXISTS] macro_name; לא נתמך.

קודי שגיאה והודעות שגיאה

קודי השגיאה של Hive שונים מקודי השגיאה של BigQuery. אם הלוגיקה של האפליקציה שלכם מזהה שגיאות, צריך לסלק את מקור השגיאה כי BigQuery לא מחזיר את אותם קודי שגיאה.

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

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

גם Hive וגם BigQuery תומכים בעסקאות עם סמנטיקה של ACID. האפשרות Transactions מופעלת כברירת מחדל ב-Hive 3.

סמנטיקה של ACID

‫Hive תומך בבידוד snapshot. כשמריצים שאילתה, היא מקבלת תמונת מצב עקבית של מסד הנתונים, והיא משתמשת בה עד לסיום ההרצה. ‫Hive מספקת סמנטיקה מלאה של ACID ברמת השורה, ומאפשרת לאפליקציה אחת להוסיף שורות בזמן שאפליקציה אחרת קוראת מאותה מחיצה, בלי שהפעולות יפריעו זו לזו.

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

טרנזקציות

‫Hive לא תומך בעסקאות עם כמה הצהרות. הוא לא תומך בהצהרות BEGIN,‏ COMMIT ו-ROLLBACK. ב-Hive, כל פעולות השפה מתבצעות אוטומטית.

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