Temos o prazer de anunciar o lançamento da versão 1.10.0 do driver Python ADBC Flight SQL, que traz um recurso transformador para servidores Arrow Flight SQL como o GizmoSQL: ingestão em massa.
Essa versão permite ingerir dados de clientes diretamente no GizmoSQL com facilidade, criando tabelas, acrescentando dados a tabelas existentes ou substituindo-as, sempre preservando automaticamente os tipos dos dados Arrow de origem.
O que é ingestão em massa?
A ingestão em massa permite enviar grandes volumes de dados da aplicação cliente diretamente a um servidor Arrow Flight SQL. Com o novo método adbc_ingest, você pode:
- Criar novas tabelas a partir de dados Arrow com inferência automática de esquema
- Acrescentar dados a tabelas existentes
- Substituir tabelas existentes por novos dados
Os tipos da tabela de destino correspondem automaticamente ao RecordBatch ou à Table Arrow de origem, sem definição manual de esquema.
Combinando com a extensão ADBC Scanner do DuckDB
Esse recurso fica ainda mais poderoso em conjunto com a extensão ADBC Scanner do DuckDB. Você pode enviar dados do DuckDB, ou de outros servidores GizmoSQL, diretamente ao GizmoSQL com facilidade, movimentando dados por sua infraestrutura analítica.
Instalação
O driver ADBC Flight SQL está no PyPI. A forma mais fácil de instalá-lo é com a ferramenta dbc da Columnar:
dbc install flightsqlOu instale diretamente com pip:
pip install adbc-driver-flightsqlDependências Python
Para executar o exemplo abaixo, você precisará destas dependências:
adbc-driver-flightsql
duckdb==1.4.3
pyarrow==22.0.*
codetiming==1.4.0
python-dotenv==1.2.*Experimente
Disponibilizamos um servidor público GizmoSQL para você experimentar a ingestão em massa agora. Use estas credenciais:
GIZMOSQL_USERNAME=adbc-scanner
GIZMOSQL_PASSWORD="QueryDotFarmRules!123"Adicione-as a um arquivo .env no diretório do projeto, e o exemplo abaixo as carregará automaticamente.
Exemplo: carregando dados TPC-H no GizmoSQL
Este exemplo completo mostra como gerar dados de benchmark TPC-H no DuckDB e ingeri-los em massa no GizmoSQL:
1import os
2import time
3
4import duckdb
5from adbc_driver_manager import dbapi
6from codetiming import Timer
7from dotenv import load_dotenv
8
9# Timer logging setup
10TIMER_TEXT = "{name}: Elapsed time: {:.4f} seconds"
11
12
13def main():
14 load_dotenv()
15
16 with Timer(name="Overall program", text=TIMER_TEXT, initial_text=True):
17 # Generate 1GB of TPC-H data in DuckDB
18 with Timer(name=" Generate TPCH data (1GB)", text=TIMER_TEXT, initial_text=True):
19 duckdb_conn = duckdb.connect()
20 duckdb_conn.install_extension("tpch")
21 duckdb_conn.load_extension("tpch")
22 duckdb_conn.execute(query="CALL dbgen(sf=1.0)")
23
24 # Get Arrow reader for the lineitem table
25 with Timer(name=" Get RecordBatch reader", text=TIMER_TEXT, initial_text=True):
26 lineitem_arrow_reader = duckdb_conn.table("lineitem").fetch_arrow_reader(batch_size=10_000)
27
28 # Bulk ingest into GizmoSQL
29 with Timer(name=" Bulk ingest into GizmoSQL", text=TIMER_TEXT, initial_text=True):
30 with dbapi.connect(
31 driver="flightsql",
32 uri="grpc+tls://try-gizmosql-adbc.gizmodata.com:31337",
33 db_kwargs={
34 "username": os.environ["GIZMOSQL_USERNAME"],
35 "password": os.environ["GIZMOSQL_PASSWORD"]
36 },
37 autocommit=True
38 ).cursor() as cursor:
39 ingest_start = time.perf_counter()
40 rows_loaded = cursor.adbc_ingest(
41 table_name="bulk_ingest_lineitem",
42 data=lineitem_arrow_reader,
43 mode="replace"
44 )
45 ingest_seconds = time.perf_counter() - ingest_start
46
47 rows_per_sec = rows_loaded / ingest_seconds if ingest_seconds > 0 else float("inf")
48 print(f"Loaded rows: {rows_loaded:,}")
49 print(f"Ingest time: {ingest_seconds:.4f} s")
50 print(f"Rows/sec: {rows_per_sec:,.2f}")
51
52 # Verify the row count
53 cursor.execute("SELECT COUNT(*) FROM bulk_ingest_lineitem")
54 result = cursor.fetchone()[0]
55 print(f"Row count verification: {result:,}")
56
57
58if __name__ == "__main__":
59 main()Resultados de desempenho
Ao executar este exemplo contra o GizmoSQL, alcançamos uma alta taxa de transferência:
Timer Overall program started
Timer Generate TPCH data (1GB) started
Generate TPCH data (1GB): Elapsed time: 2.3585 seconds
Timer Get RecordBatch reader started
Get RecordBatch reader: Elapsed time: 0.0040 seconds
Timer Bulk ingest into GizmoSQL started
Loaded rows: 6,001,215
Ingest time: 33.9456 s
Rows/sec: 176,789.18
Row count verification: 6,001,215
Bulk ingest into GizmoSQL: Elapsed time: 35.9270 seconds
Overall program: Elapsed time: 38.2903 seconds- 6 milhões de linhas ingeridas em menos de 34 segundos
- Taxa de transferência de cerca de 177.000 linhas/segundo
- Inferência automática de esquema a partir dos dados Arrow
Agradecimentos
A GizmoData tem orgulho de ter contribuído para esta versão do Apache Arrow. Nosso pull request que implementa ingestão em massa no driver Flight SQL foi integrado e agora faz parte do Apache Arrow ADBC Release 22.
Agradecemos à equipe Columnar, que criou e ajuda a manter o ADBC, pela experiência e colaboração para levar a ingestão em massa ao driver Flight SQL.
Comece agora
Pronto para experimentar a ingestão em massa com GizmoSQL? Veja como começar:
- Instale o driver:
dbc install flightsql - Experimente o GizmoSQL ou consulte a documentação
- Explore o repositório do GizmoSQL no GitHub
Tem dúvidas ou quer saber mais? Entre em contato ou fale conosco pelo GitHub.