Bases de dados e tabelas
Uma base de dados Azure Databricks é uma coleção de tabelas. Uma tabela Azure Databricks é uma recolha de dados estruturados. Pode cache, filtrar e executar quaisquer operações suportadas pelo Apache Spark DataFrames nas tabelas Azure Databricks. Você pode consultar tabelas com APIs spark e Spark SQL.
Existem dois tipos de tabelas: global e local. Uma tabela global está disponível em todos os clusters. A Azure Databricks regista tabelas globais quer para a metásta de Azure Databricks Hive quer para uma metásta externa da Hive. Para mais detalhes sobre o suporte da Hive, consulte a compatibilidade da Apache Hive. Uma mesa local não é acessível a partir de outros clusters e não está registada na metásta de Colmeia. Isto também é conhecido como uma visão temporária.
Pode criar uma tabela utilizando o UI de tabela ou programáticamente. Uma tabela pode ser povoada a partir de ficheiros em DBFS ou dados armazenados em qualquer uma das fontes de dadossuportadas .
Requisitos
Para visualizar e criar bases de dados e tabelas, tem de ter um cluster de corrida.
Ver bases de dados e tabelas
Clique lateral. A Azure Databricks seleciona um cluster de corrida ao qual tem acesso. A pasta Bases de Dados apresenta a lista de bases de dados com a
default
base de dados selecionada. A pasta Tabelas apresenta a lista de tabelas na default
base de dados.
Pode alterar o cluster a partir do menu Bases de Dados, criar UI de tabela,ou ver uI tabela. Por exemplo, a partir do menu Bases de Dados:
Clique no ícone
no topo da pasta Bases de Dados.
Selecione um cluster.
Criar uma base de dados
Para criar uma base de dados em SQL:
CREATE DATABASE <database-name> ...
Para mais opções, consulte
- Databricks Runtime 7.x: CREATE DATABASE
- Databricks Runtime 5.5 LTS e 6.x: Criar Base de Dados
Criar uma tabela
Pode criar uma tabela utilizando a UI ou programaticamente.
Criar uma tabela usando a UI
Nota
Quando se cria uma tabela usando a UI, não se pode
- Faça o upload de um ficheiro se estiver a utilizar um cluster de Alta Concurrency. Em vez disso, utilize o Databricks File System (DBFS) para carregar os seus dados em Azure Databricks.
- Atualize a mesa. Em vez disso, crie uma tabela programáticamente.
Quando se cria uma tabela utilizando a UI, cria-se uma tabela global.
Clique
na barra lateral. As pastas de bases de dados e tabelas são apresentadas.
Na pasta Bases de Dados, selecione uma base de dados.
Acima da pasta tabelas, clique em Adicionar Dados.
Escolha uma fonte de dados e siga os passos para configurar a tabela.
A opção Ficheiro de Upload está ativada por predefinição. Se um administrador do Azure Databricks tiver desativado esta funcionalidade,não terá a opção de carregar ficheiros, mas poderá criar tabelas utilizando ficheiros noutra fonte de dados.
Ficheiro de upload
Arraste ficheiros para a dropzone do Ficheiro ou clique na dropzone para navegar e escolher ficheiros. Após o upload, um caminho aparece para cada ficheiro. O caminho será algo como
/FileStore/tables/<filename>-<random-number>.<file-type>
e você usa este caminho em um caderno para ler dados.Clique em Criar Tabela com UI.
No Cluster drop-down, escolha um cluster.
DBFS
- Selecione um ficheiro.
- Clique em Criar Tabela com UI.
- No Cluster drop-down, escolha um cluster.
Clique na Tabela de Pré-visualização para ver a tabela.
No campo Nome de Tabela, substitua opcionalmente o nome de tabela predefinido. Um nome de mesa pode conter apenas caracteres alfanuméricos minúsculos e sublinha e deve começar com uma letra minúscula ou sublinhar.
No campo Criar na Base de Dados, substituir opcionalmente a
default
base de dados selecionada.No campo 'Tipo de Ficheiro', substitua opcionalmente o tipo de ficheiro inferido.
Se o tipo de ficheiro for CSV:
- No campo Delimiter da Coluna, selecione se deve anular olimiter indiado.
- Indicar se deve usar a primeira linha como títulos de coluna.
- Indique se deve inferir o esquema.
Se o tipo de ficheiro for JSON, indique se o ficheiro é multi-line.
Clique em Criar Tabela.
Criar uma mesa em um caderno
No II de nova tabela, pode utilizar os cadernos quickstart fornecidos pela Azure Databricks para se ligar a qualquer fonte de dados.
- DBFS: Clique em Criar Tabela no Caderno.
- Outras Fontes de Dados: No drop-down do Conector, selecione um tipo de fonte de dados. Em seguida, clique em Criar Tabela no Caderno.
Criar uma tabela programática
Esta secção descreve como criar tabelas globais e locais programáticas.
Criar uma tabela global
Para criar uma tabela global em SQL:
CREATE TABLE <table-name> ...
Para mais opções, consulte 'Criar Tabela'.
Para criar uma tabela global a partir de um DataFrame em Python ou Scala:
dataFrame.write.saveAsTable("<table-name>")
Criar uma mesa local
Para criar uma tabela local a partir de um DataFrame em Python ou Scala:
dataFrame.createOrReplaceTempView("<table-name>")
Aqui está um exemplo que cria uma tabela local chamada diamonds
a partir de um ficheiro no Databricks File System (DBFS):
dataFrame = "/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv"
spark.read.format("csv").option("header","true")\
.option("inferSchema", "true").load(dataFrame)\
.createOrReplaceTempView("diamonds")
Aceda a uma mesa
Pode ver detalhes da tabela, ler, atualizar e apagar uma tabela.
Ver detalhes da tabela
A visualização dos detalhes da tabela mostra o esquema da tabela e os dados da amostra.
Clique
na barra lateral.
Na pasta Bases de Dados, clique numa base de dados.
Na pasta Tabelas, clique no nome da tabela.
No cluster drop-down, selecione opcionalmente outro cluster para fazer a pré-visualização da tabela.
Nota
Para visualizar a pré-visualização da tabela, uma consulta Spark SQL corre no cluster selecionado no cluster drop-down. Se o cluster já tiver uma carga de trabalho a funcionar, a pré-visualização da tabela pode demorar mais tempo a ser carregada.
Consulta de uma mesa
Estes exemplos mostram-lhe como consultar e exibir uma tabela chamada diamonds
.
SQL
SELECT * FROM diamonds
Python
diamonds = spark.sql("select * from diamonds")
display(diamonds.select("*"))
diamonds = spark.table("diamonds")
display(diamonds.select("*"))
R
diamonds <- sql(sqlContext, "select * from diamonds")
display(diamonds)
diamonds <- table(sqlContext, "diamonds")
display(diamonds)
Scala
val diamonds = spark.sql("select * from diamonds")
display(diamonds.select("*"))
val diamonds = spark.table("diamonds")
display(diamonds.select("*"))
Atualizar tabelas
O esquema da mesa é imutável. No entanto, pode atualizar os dados da tabela alterando os ficheiros subjacentes.
Por exemplo, para as tabelas criadas a partir de um diretório de armazenamento, adicionar ou remover ficheiros nesse diretório altera o conteúdo da tabela.
Depois de atualizar os ficheiros subjacentes a uma tabela, refresque a tabela utilizando o seguinte comando:
REFRESH TABLE <table-name>
Isto garante que, ao aceder à tabela, o Spark SQL leia os ficheiros corretos mesmo que os ficheiros subjacentes mudem.
Apagar uma mesa
Eliminar uma tabela usando o UI
- Clique
na barra lateral.
- Clique no
ao lado do nome da tabela e selecione Delete.
Excluir uma tabela programática
DROP TABLE <table-name>
Mesas geridas e não geridas
Todas as tabelas Spark SQL têm informações de metadados que armazenam o esquema e os dados em si.
Uma tabela gerida é uma tabela Spark SQL para a qual a Spark gere os dados e os metadados. No caso da tabela gerida, a Databricks armazena os metadados e dados em DBFS na sua conta. Uma vez que o Spark SQL gere as tabelas, fazer um DROP TABLE example_data
elimina tanto os metadados como os dados.
Algumas formas comuns de criar uma tabela gerida são:
SQL
CREATE TABLE <example-table>(id STRING, value STRING)
Python
dataframe.write.saveAsTable("<example-table>")
Outra opção é permitir que o Spark SQL gere os metadados, enquanto controla a localização dos dados. Referimo-nos a isto como uma mesa nãogerida.
O Spark SQL gere os metadados relevantes, por isso, quando DROP TABLE <example-table>
executa, a Spark remove apenas os metadados e não os dados em si. Os dados ainda estão presentes no caminho que forneceu.
Pode criar uma tabela não gerida com os seus dados em fontes de dados como Cassandra, jdBC, e assim por diante. Consulte fontes de dados para obter mais informações sobre as fontes de dados suportadas por Databricks. Algumas formas comuns de criar uma mesa nãogerida são:
SQL
CREATE TABLE <example-table>(id STRING, value STRING) USING org.apache.spark.sql.parquet OPTIONS (PATH "<your-storage-path>")
Python
dataframe.write.option('path', "<your-storage-path>").saveAsTable("<example-table>")
Substitua o conteúdo da tabela
Existem duas abordagens principais para substituir o conteúdo da tabela: simples e recomendado.
Forma simples de substituir o conteúdo da tabela
A forma mais simples de substituir o conteúdo da tabela é eliminar os metadados e dados da tabela e criar outra tabela.
Tabela gerida
DROP TABLE IF EXISTS <example-table> // deletes the metadata and data
CREATE TABLE <example-table> AS SELECT ...
Mesa não gerido
DROP TABLE IF EXISTS <example-table> // deletes the metadata
dbutils.fs.rm("<your-storage-path>", true) // deletes the data
CREATE TABLE <example-table> using org.apache.spark.sql.parquet OPTIONS (path "<your-storage-path>") AS SELECT ...
Uma alternativa é:
Crie a tabela utilizando o SQL DDL:
CREATE TABLE <table-name> (id long, date string) USING PARQUET LOCATION "<storage-location>"
Armazenar novos dados em
<storage-location>
.Execute
refresh table <table-name>
.
Forma recomendada de substituir o conteúdo da tabela
Para evitar potenciais problemas de consistência, a melhor abordagem para substituir o conteúdo da mesa é substituir a tabela.
Python
dataframe.write.mode("overwrite").saveAsTable("<example-table>") // Managed Overwrite
dataframe.write.mode("overwrite").option("path","<your-storage-path>").saveAsTable("<example-table>") // Unmanaged Overwrite
SQL
Use a insert overwrite
palavra-chave. Este método aplica-se às tabelas geridas e não geridas. Por exemplo, para uma tabela nãogerida:
CREATE TABLE <example-table>(id STRING, value STRING) USING org.apache.spark.sql.parquet OPTIONS (PATH "<your-storage-path>")
INSERT OVERWRITE TABLE <example-table> SELECT ...
Scala
dataframe.write.mode(SaveMode.Overwrite).saveAsTable("<example-table>") // Managed Overwrite
dataframe.write.mode(SaveMode.Overwrite).option("path", "<your-storage-path>").saveAsTable("<example-table>") // Unmanaged Overwrite
Mesas divididas
O Spark SQL é capaz de gerar divisórias dinamicamente ao nível de armazenamento de ficheiros para fornecer colunas de partição para as tabelas.
Criar uma mesa dividida
Estes exemplos de dados de partição que escreve. Spark SQL descobre as divisórias e regista-as na metásta da Colmeia.
// Create managed table as select
dataframe.write.mode(SaveMode.Overwrite).partitionBy("id").saveAsTable("<example-table>")
// Create unmanaged/external table as select
dataframe.write.mode(SaveMode.Overwrite).option("path", "<file-path>").saveAsTable("<example-table>")
No entanto, se criar uma tabela dividida a partir dos dados existentes, o Spark SQL não descobre automaticamente as divisórias e regista-as na metastore da Hive. Neste caso, SELECT * FROM <example-table>
não devolve resultados. Para registar as divisórias, corra o seguinte para gerar as divisórias: MSCK REPAIR TABLE "<example-table>"
.
// Save data to external files
dataframe.write.mode(SaveMode.Overwrite).partitionBy("id").parquet("<file-path>")
// Create unmanaged/external table
spark.sql("CREATE TABLE <example-table>(id STRING, value STRING) USING parquet PARTITIONED BY(id) LOCATION "<file-path>"")
spark.sql("MSCK REPAIR TABLE "<example-table>"")
Poda de partição
Quando a tabela é digitalizada, a Spark empurra os predicados do filtro que envolvem as partitionBy
teclas. Nesse caso, a Spark evita ler dados que não satisfazem esses predicados. Por exemplo, suponha que tem uma mesa <example-data>
que é dividida por <date>
. Uma consulta como SELECT max(id) FROM <example-data> WHERE date = '2010-10-10'
lê-se apenas os ficheiros de dados que contêm tuples cujo date
valor corresponde ao especificado na consulta.
Controlo de acesso a tabelas
O controlo do acesso à mesa permite que administradores e utilizadores dêem acesso fino a outros utilizadores. Consulte os privilégios do objeto Data para mais detalhes.