Nesta postagem, falaremos como realizar a exportação de uma tabela que esteja no BigQuery para um bucket do Cloud Storage utilizando o Dataproc.

O que é BigQuery?
É um data warehouse totalmente gerenciado que permite realizar análises em um grande conjunto de dados, no patamar de petabytes.
Suporta consultas no formato ANSI SQL e criação de modelos de Machine Learning (ML) em uma sintaxe semelhante ao SQL.
O que é Cloud Storage?
Fornece, a nÃvel mundial, um armazenamento de objetos altamente durável que escalona para exabytes de dados. É possÃvel acessar dados instantaneamente de qualquer classe de armazenamento, integrar o armazenamento aos seus aplicativos com uma API exclusiva unificada e otimizar o preço e desempenho de forma fácil.
O que é Dataproc?
É a plataforma de big data totalmente gerenciado, para processar grandes quantidades de dados com rapidez, de forma econômica e em grande escala. Usando ferramentas de código aberto como o Apache Spark, o Apache Hive, o Apache Hadoop e o Apache Pig combinadas à escalabilidade dinâmica do Compute Engine e ao armazenamento escalável do Cloud Storage, o Dataproc oferece à s equipes analÃticas os mecanismos e a elasticidade para executar análises na escala de petabytes por uma fração do custo dos clusters locais tradicional, além de ser facilmente incorporado a outros serviços do Google Cloud Platform (GCP).
Passo a Passo
1. O primeiro passo a fazer é o login em sua conta do GCP, para este tutorial você vai precisar de uma conta que possua um projeto.

2. Vá até o console do BigQuery e crie um novo conjunto de dados:
3. Insira um nome para o conjunto de dados e clique em criar:
4. Crie a tabela "clientes" a partir da query abaixo, vamos usar esses dados para fazer a exportação:
create table dataset_teste.clientes as
SELECT cliente_id, nome
FROM (
SELECT 1 AS cliente_id,'José' Nome UNION ALL
SELECT 2 AS cliente_id,'Maria' Nome UNION ALL
SELECT 3 AS cliente_id,'João' Nome UNION ALL
SELECT 4 AS cliente_id,'Pedro' Nome UNION ALL
SELECT 5 AS cliente_id,'Ana' Nome
) AS Clientes;
5. Vá até a barra superior e clique no Ãcone do Cloud Shell, igual a imagem abaixo.

6. Criaremos o bucket do Cloud Storage em que iremos exportar nossa tabela:
gsutil mb -l us-central1 gs://[PROJECT_ID]-tabelas
7. Agora temos que preparar as variáveis de ambiente que usaremos nos outros passos:
a) Para definir a variável de região usaremos o código abaixo:
export REGION=us-central1
b) Para definir a variável de Zona usaremos o código abaixo:
export ZONE=us-central1-a
8. Nesse passo vamos definir o projeto a ser usado dentro do cloud shell, no campo [PROJECT_ID], insira o id do seu projeto:
gcloud config set project [PROJECT_ID]
9. Nesse passo vamos definir a Zona a ser usada dentro do cloud shell com base na variável que definimos antes:
gcloud config set compute/zone $ZONE
10. Nesse passo vamos definir a Região a ser usada dentro do cloud shell com base na variável que definimos antes:
gcloud config set compute/region $REGION
11. Após isso vamos definir a variável PROJECT com o id do projeto:
export PROJECT=$(gcloud info --format='value(config.project)')
12. Com o código abaixo a api do dataproc será habilitada, caso já esteja pode desconsiderar:
gcloud services enable dataproc.googleapis.com sqladmin.googleapis.com
13. Caso não exista, crie um cluster do dataproc com o comando abaixo:
gcloud dataproc clusters create meu-cluster \
--image-version 1.3 \
--region $REGION \
--subnet default \
--master-machine-type n1-standard-1 \
--master-boot-disk-size 500 \
--num-workers 2 \
--worker-machine-type n1-standard-1 \
--worker-boot-disk-size 500
Observações:
A propriedade “subnet” faz referência a sub-rede que usaremos no cluster.
A propriedade “master-machine-type” permite selecionar o tipo de máquina a ser usado pelo master.
A propriedade “worker-machine-type” permite selecionar o tipo de máquina a ser usado pelos workes.
14. Neste passo vamos gerar um job que vai criar uma tabela no hive:
gcloud dataproc jobs submit hive \
--cluster meu-cluster \
--region $REGION \
--execute "CREATE TABLE clientes \
(cliente_id string, \
nome string)\
ROW FORMAT DELIMITED \
FIELDS TERMINATED BY ',' \
STORED AS INPUTFORMAT \
'org.apache.hadoop.mapred.TextInputFormat' \
OUTPUTFORMAT \
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'\
LOCATION 'gs://[PROJECT_ID]-tabelas/clientes/'"
Observações:
· A propriedade “submit” faz referência ao tipo de job que vamos executar, pode-se substituir o valor “hive” por “spark” ou “spark-sql” por exemplo.
· A propriedade “cluster” faz referência ao cluster que executaremos o job.
· A propriedade “region” faz referência a região em que o cluster está.
· A propriedade “execute” contêm o comando a ser executado, nesse caso a instrução de create.
15. Faça um select na tabela criada no passo anterior:
gcloud dataproc jobs submit hive \
--cluster meu-cluster \
--region $REGION \
--execute "select * from clientes"
16. Realize um SSH na sua máquina do cluster, crie um arquivo chamado: bigquery-to-storage.py com o código abaixo, execute o código:
#!/usr/bin/python
from pyspark.sql import SparkSession
import pyspark
spark = SparkSession \
.builder \
.master('yarn') \
.appName('bigquery-to-cloud-storage') \
.getOrCreate()
#Usa o intervalo do Cloud Storage para exportação de dados temporários do BigQuery usados pelo conector.
bucket = "[PROJECT_ID]-tabelas"
spark.conf.set('temporaryGcsBucket', bucket)
# Lê os dados do BigQuery.
words = spark.read.format('bigquery') \
.option('table', '[PROJECT_ID]:dataset_teste.clientes') \
.load()
words.createOrReplaceTempView('cli')
#Gera arquivo no Cloud Storage
clientes_tb = spark.sql('SELECT * FROM cli')
clientes_tb.write.parquet('gs://[PROJECT_ID]-tabelas/clientes/clientes.parquet')
17. Volte ao Cloud Shell e faça um select na tabela:
gcloud dataproc jobs submit hive \
--cluster meu-cluster \
--region $REGION \
--execute "select * from clientes"
Referências
- Exporting table data
https://cloud.google.com/bigquery/docs/exporting-data#console
- Use the BigQuery connector with Spark
https://cloud.google.com/dataproc/docs/tutorials/bigquery-connector-spark-example