Guia de tradução de SQL do Apache Hive

Este documento detalha as semelhanças e as diferenças na sintaxe SQL entre o Apache Hive e o BigQuery para ajudar a planear a sua migração. Para migrar os seus scripts SQL em massa, use a tradução de SQL em lote. Para traduzir consultas ad hoc, use a tradução de SQL interativa.

Em alguns casos, não existe um mapeamento direto entre um elemento SQL no Hive e no BigQuery. No entanto, na maioria dos casos, o BigQuery oferece um elemento alternativo ao Hive para ajudar a alcançar a mesma funcionalidade, conforme mostrado nos exemplos neste documento.

O público-alvo deste documento são arquitetos empresariais, administradores de bases de dados, programadores de aplicações e especialistas em segurança de TI. Assume que tem conhecimentos sobre o Hive.

Tipos de dados

O Hive e o BigQuery têm sistemas de tipos de dados diferentes. Na maioria dos casos, pode mapear os tipos de dados no Hive para tipos de dados do BigQuery com algumas exceções, como MAP e UNION. O Hive suporta mais conversões de tipos implícitas do que o BigQuery. Como resultado, o tradutor de SQL em lote insere muitas conversões explícitas.

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 com chaves-valores (campo REPEAT)
UNION STRUCT com diferentes tipos
- GEOGRAPHY
- JSON

Sintaxe de consulta

Esta secção aborda as diferenças na sintaxe de consulta entre o Hive e o BigQuery.

SELECT declaração

A maioria das declarações SELECT do Hive é compatível com o BigQuery. A tabela seguinte contém uma lista de diferenças menores:

Caixa Hive BigQuery
Subconsulta

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

Filtragem de colunas

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

Expandir uma matriz

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 cláusula

A cláusula FROM numa consulta apresenta as referências de tabelas a partir das quais os dados são selecionados. No Hive, as referências de tabelas possíveis incluem tabelas, vistas e subconsultas. O BigQuery também suporta todas estas referências de tabelas.

Pode fazer referência a tabelas do BigQuery na cláusula FROM através do seguinte:

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

O BigQuery também suporta referências de tabelas adicionais:

Operadores de comparação

A tabela seguinte fornece detalhes sobre a conversão de operadores do Hive para o BigQuery:

Função ou operador Hive BigQuery
- Menos unário
* Multiplicação
/ Divisão
+ Adição
- Subtração
Todos os tipos de números Todos os tipos de números.

Para evitar erros durante a operação de divisão, considere usar SAFE_DIVIDE ou IEEE_DIVIDE.

~ NOT bit-a-bit
| OR bit-a-bit
& AND bit-a-bit
^ XOU bit-a-bit
Tipo de dados booleano Tipo de dados booleano.
Shift do lado esquerdo

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

<< Número inteiro ou bytes

A << B, onde B tem de ser do mesmo tipo que A

Shift do lado direito

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

>> Número inteiro ou bytes

A >> B, onde B tem de ser do mesmo tipo que A

Módulo (resto) X % Y

Todos os tipos de números

MOD(X, Y)
Divisão de números inteiros A DIV B e A/B para uma precisão detalhada Todos os tipos de números.

Nota: para evitar erros durante a operação de divisão, considere usar SAFE_DIVIDE ou IEEE_DIVIDE.

Negação unária !, NOT NOT
Tipos que suportam comparações de igualdade Todos os tipos primitivos Todos os tipos comparáveis e STRUCT.
a <=> b Não suportado. Traduza para o seguinte:

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

a <> b Não suportado. Traduza para o seguinte:

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

Operadores relacionais ( =, ==, !=, <, >, >= ) Todos os tipos primitivos Todos os tipos comparáveis.
Comparação de strings RLIKE, REGEXP Função integrada REGEXP_CONTAINS. Usa a sintaxe regex do BigQuery para funções de strings para os padrões de expressões regulares.
[NOT] LIKE, [NOT] BETWEEN, IS [NOT] NULL A [NOT] BETWEEN B AND C, A IS [NOT] (TRUE|FALSE), A [NOT] LIKE B Igual ao Hive. Além disso, o BigQuery também suporta o operador IN.

Condições da união

O Hive e o BigQuery suportam os seguintes tipos de junções:

  • [INNER] JOIN

  • LEFT [OUTER] JOIN

  • RIGHT [OUTER] JOIN

  • FULL [OUTER] JOIN

  • CROSS JOIN e a união cruzada com vírgula implícita equivalente

Para mais informações, consulte os artigos Operação de junção e Junções do Hive.

Conversão de tipos e conversão explícita

A tabela seguinte fornece detalhes sobre a conversão de funções do Hive para o BigQuery:

Função ou operador Hive BigQuery
Conversão de tipo Quando uma conversão falha, é devolvido `NULL`.

A mesma sintaxe que o Hive. Para mais informações sobre as regras de conversão de tipos do BigQuery, consulte o artigo Regras de conversão.

Se a transmissão falhar, é apresentado um erro. Para ter o mesmo comportamento que o Hive, use SAFE_CAST.

SAFE chamadas de funções Se prefixar as chamadas de funções com SAFE, a função devolve NULL em vez de comunicar a falha. Por exemplo, SAFE.SUBSTR('foo', 0, -2) AS safe_output; devolve NULL.

Nota: quando transmitir em segurança sem erros, use SAFE_CAST.

Tipos de conversões implícitas

Quando migra para o BigQuery, tem de converter a maioria das conversões implícitas do Hive em conversões explícitas do BigQuery, exceto para os seguintes tipos de dados, que o BigQuery converte implicitamente.

Do tipo BigQuery Para o tipo do BigQuery
INT64 FLOAT64, NUMERIC, BIGNUMERIC
BIGNUMERIC FLOAT64
NUMERIC BIGNUMERIC, FLOAT64

O BigQuery também faz conversões implícitas para os seguintes literais:

Do tipo BigQuery Para o tipo do BigQuery
STRING literal (por exemplo, "2008-12-25") DATE
STRING literal (por exemplo, "2008-12-25 15:30:00") TIMESTAMP
STRING literal (por exemplo, "2008-12-25T07:30:00") DATETIME
STRING literal (por exemplo, "15:30:00") TIME

Tipos de conversão explícitos

Se quiser converter tipos de dados do Hive que o BigQuery não converte implicitamente, use a função CAST(expression AS type) do BigQuery.

Funções

Esta secção aborda as funções comuns usadas no Hive e no BigQuery.

Funções de agregação

A tabela seguinte mostra os mapeamentos entre funções de agregação comuns do Hive, de agregação estatística e de agregação aproximada com os respetivos equivalentes do 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))]

O BigQuery não suporta os restantes argumentos definidos pelo 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

Funções analíticas

A tabela seguinte mostra os mapeamentos entre as funções analíticas comuns do Hive e os respetivos equivalentes no 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 Pode usar uma função definida pelo utilizador (UDF).

Funções de data e hora

A tabela seguinte mostra os mapeamentos entre as funções de data e hora comuns do Hive e os respetivos equivalentes no 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 é recomendado, uma vez que este valor não tem fuso horário e é sinónimo de CURRENT_TIMESTAMP \ CURRENT_TIMESTAMP no 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

O BigQuery oferece as seguintes funções adicionais de data e hora:

Funções de string

A tabela seguinte mostra os mapeamentos entre as funções de string do Hive e os respetivos equivalentes do 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

O BigQuery oferece as seguintes funções de strings adicionais:

Funções matemáticas

A tabela seguinte mostra os mapeamentos entre as funções matemáticas do Hive e os respetivos equivalentes no 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 Use com 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)

O BigQuery oferece as seguintes funções matemáticas adicionais:

Funções lógicas e condicionais

A tabela seguinte mostra os mapeamentos entre as funções lógicas e condicionais do Hive e os respetivos equivalentes no 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

FDUs e FDAs

O BigQuery suportaUDFs, mas não funções de agregação definidas pelo utilizador (UDAFs).

Sintaxe DML

Esta secção aborda as diferenças na sintaxe da linguagem de manipulação de dados (DML) entre o Hive e o BigQuery.

INSERT declaração

A maioria das declarações do Hive INSERT é compatível com o BigQuery. A tabela seguinte mostra as exceções:

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

Nota: no BigQuery, a omissão dos nomes das colunas na declaração INSERT só funciona se os valores de todas as colunas na tabela de destino estiverem incluídos por ordem ascendente com base nas respetivas posições ordinais.

INSERT OVERWRITE [LOCAL] DIRECTORY directory1

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

SELECT ... FROM ...

O BigQuery não suporta as operações insert-overwrite. Esta sintaxe do Hive pode ser migrada para declarações TRUNCATE e INSERT.

O BigQuery impõe quotas de DML que restringem o número de declarações DML que pode executar diariamente. Para tirar o melhor partido da sua quota, considere as seguintes abordagens:

  • Combine várias linhas numa única declaração INSERT, em vez de uma linha para cada operação INSERT.

  • Combine várias declarações DML (incluindo INSERT) usando uma declaração MERGE.

  • Use CREATE TABLE ... AS SELECT para criar e preencher novas tabelas.

UPDATE declaração

A maioria das declarações do Hive UPDATE é compatível com o BigQuery. A tabela seguinte mostra as exceções:

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

SET column = expression [,...]

[FROM ...]

WHERE TRUE

Nota: todas as declarações UPDATE no BigQuery requerem uma palavra-chave WHERE, seguida de uma condição.

DELETE e TRUNCATE extratos

Pode usar declarações DELETE ou TRUNCATE para remover linhas de uma tabela sem afetar o esquema ou os índices da tabela.

No BigQuery, a declaração DELETE tem de ter uma cláusula WHERE. Para mais informações sobre o DELETE no BigQuery, consulte os DELETE exemplos.

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

As declarações do BigQuery DELETE requerem uma cláusula WHERE .

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

MERGE declaração

A declaração MERGE pode combinar operações INSERT, UPDATE e DELETE numa única declaração upsert e executar as operações. A operação MERGE tem de corresponder, no máximo, a uma linha de origem para cada linha de destino.

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,

...

Nota: tem de indicar todas as colunas que precisam de ser atualizadas.

ALTER declaração

A tabela seguinte fornece detalhes sobre a conversão de declarações CREATE VIEW do Hive para o BigQuery:

Função Hive BigQuery
Rename table ALTER TABLE table_name RENAME TO new_table_name; Não suportado. Uma solução alternativa é usar uma tarefa de cópia com o nome que quer como tabela de destino e, em seguida, eliminar a antiga.

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, ... )

A serialização e a desserialização são geridas pelo serviço BigQuery e não são configuráveis pelo utilizador.

Para saber como permitir que o BigQuery leia dados de ficheiros CSV, JSON, AVRO, PARQUET ou ORC, consulte o artigo Criar tabelas externas do Cloud Storage.

Suporta formatos de exportação CSV, JSON, AVRO e PARQUET. Para mais informações, consulte Formatos de exportação e tipos de compressão.

Table storage properties ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)] INTO num_buckets BUCKETS; Não suportado para as declarações 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", ...] );

O equilíbrio do armazenamento para consultas de desempenho é gerido pelo serviço BigQuery e não é configurável.
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;

Para mais informações, consulte a declaração 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, ...)

Não suportado. As partições adicionais são adicionadas conforme necessário quando são carregados dados com novos valores nas colunas de partição.

Para mais informações, consulte o artigo Gerir tabelas particionadas.

Rename partition ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec; Não suportado.
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;

Não suportado.
Recover partition MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS]; Não suportado.
Drop partition ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...] [IGNORE PROTECTION] [PURGE]; Suportado através dos seguintes métodos:
  • bq rm 'mydataset.table_name$partition_id'
  • DELETE from table_name$partition_id WHERE 1=1

  • Para mais informações, consulte o artigo Elimine uma partição.

(Un)Archive partition ALTER TABLE table_name ARCHIVE PARTITION partition_spec; ALTER TABLE table_name UNARCHIVE PARTITION partition_spec; Não suportado.
Table and partition file format ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format; Não suportado.
Table and partition location ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location"; Não suportado.
Table and partition touch ALTER TABLE table_name TOUCH [PARTITION partition_spec]; Não suportado.
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;

Não suportado.
Table and partition compact ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] COMPACT 'compaction_type'[AND WAIT]

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

Não suportado.
Table and artition concatenate ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE; Não suportado.
Table and partition columns ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] UPDATE COLUMNS; Não suportado para as declarações 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]; Não suportado.

Sintaxe DDL

Esta secção aborda as diferenças na sintaxe da linguagem de definição de dados (LDD) entre o Hive e o BigQuery.

CREATE TABLE e DROP TABLE extratos

A tabela seguinte fornece detalhes sobre a conversão de declarações CREATE TABLE do Hive para o BigQuery:

Tipo Hive BigQuery
Tabelas geridas create table table_name (

id int,

dtDontQuery string,

name string

)

CREATE TABLE `myproject`.mydataset.table_name (

id INT64,

dtDontQuery STRING,

name STRING

)

Tabelas particionadas 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

Quando fizer a partição por data, descomente o seguinte:

PARTITION BY dt

OPTIONS(

description="Table Description",

Quando fizer a partição por data, descomente o seguinte. Recomendamos que use require_partition quando a tabela estiver particionada.

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:

A forma LIKE de CREATE TABLE permite-lhe copiar exatamente uma definição de tabela existente.

CREATE TABLE empty_key_value_store

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

Não suportado.
Tabelas ordenadas em contentores (agrupadas na terminologia do 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

)'

Para mais informações, consulte o artigo Crie e use tabelas agrupadas.

Tabelas com assimetria (tabelas em que uma ou mais colunas têm valores com assimetria) 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];

Não suportado.
Tabelas temporárias CREATE TEMPORARY TABLE list_bucket_multiple (

col1 STRING,

col2 int,

col3 STRING);

Pode fazê-lo usando o tempo de expiração da seguinte forma:

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")]

)

Tabelas de transações CREATE TRANSACTIONAL TABLE transactional_table_test(key string, value string) PARTITIONED BY(ds string) STORED AS ORC; Todas as modificações de tabelas no BigQuery estão em conformidade com ACID (atomicidade, consistência, isolamento e durabilidade).
Eliminar tabela DROP TABLE [IF EXISTS] table_name [PURGE]; {DROP TABLE | DROP TABLE IF EXISTS}

table_name

Truncar tabela TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:

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

Não suportado. Estão disponíveis as seguintes soluções:

  • Elimine e crie novamente a tabela com o mesmo esquema.
  • Defina a disposição de escrita da tabela como WRITE_TRUNCATE se a operação de truncagem for um exemplo de utilização comum para a tabela especificada.
  • Use a declaração CREATE OR REPLACE TABLE.
  • Use a declaração DELETE from table_name WHERE 1=1.

Nota: também é possível truncar partições específicas. Para mais informações, consulte o artigo Elimine uma partição.

CREATE EXTERNAL TABLE e DROP EXTERNAL TABLE extratos

Para ver o suporte de tabelas externas no BigQuery, consulte o artigo Introdução a origens de dados externas.

CREATE VIEW e DROP VIEW extratos

A tabela seguinte fornece detalhes sobre a conversão de declarações CREATE VIEW do Hive para o 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 e DROP FUNCTION extratos

A tabela seguinte fornece detalhes sobre a conversão de procedimentos armazenados do Hive para o 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; Não suportado.
CREATE FUNCTION [db_name.]function_name AS class_name

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

Suportado para projetos na lista de autorizações como uma funcionalidade alfa.

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; Não suportado.

CREATE MACRO e DROP MACRO extratos

A tabela seguinte fornece detalhes sobre a conversão de declarações SQL processuais usadas na criação de macros do Hive para o BigQuery com declaração e atribuição de variáveis:

Hive BigQuery
CREATE TEMPORARY MACRO macro_name([col_name col_type, ...]) expression; Não suportado. Em alguns casos, pode substituir esta função por uma UDF.
DROP TEMPORARY MACRO [IF EXISTS] macro_name; Não suportado.

Códigos e mensagens de erro

Os códigos de erro do Hive e os códigos de erro do BigQuery são diferentes. Se a lógica da sua aplicação estiver a detetar erros, elimine a origem do erro, porque o BigQuery não devolve os mesmos códigos de erro.

No BigQuery, é comum usar as vistas INFORMATION_SCHEMA ou o registo de auditoria para examinar os erros.

Garantias de consistência e isolamento de transações

O Hive e o BigQuery suportam transações com semântica ACID. As transações estão ativadas por predefinição no Hive 3.

Semântica ACID

O Hive suporta o isolamento de instantâneo. Quando executa uma consulta, esta recebe uma imagem consistente da base de dados, que usa até ao final da execução. O Hive oferece semântica ACID completa ao nível da linha, o que permite que uma aplicação adicione linhas quando outra aplicação lê a partir da mesma partição sem interferir entre si.

O BigQuery oferece controlo de concorrência otimista (o primeiro a confirmar ganha) com isolamento de instantâneos, em que uma consulta lê os últimos dados confirmados antes de começar. Esta abordagem garante o mesmo nível de consistência para cada linha e mutação, e entre linhas na mesma declaração DML, evitando bloqueios. Para várias atualizações de DML à mesma tabela, o BigQuery muda para o controlo de simultaneidade pessimista. As tarefas de carregamento podem ser executadas de forma independente e anexar tabelas. No entanto, o BigQuery não fornece um limite de transação explícito nem uma sessão.

Transações

O Hive não suporta transações com várias declarações. Não suporta as declarações BEGIN, COMMIT e ROLLBACK. No Hive, todas as operações de linguagem são confirmadas automaticamente.

O BigQuery suporta transações com várias declarações numa única consulta ou em várias consultas quando usa sessões. Uma transação com várias declarações permite-lhe realizar operações de mutação, como inserir ou eliminar linhas de uma ou mais tabelas e confirmar ou reverter as alterações. Para mais informações, consulte o artigo Transações com vários extratos.