La récupération des résultats de la requête à partir de Snowflake est devenue beaucoup plus rapide avec Apache Arrow

La récupération des résultats de la requête à partir de Snowflake est devenue beaucoup plus rapide avec Apache Arrow


Nous avons fait notre premier pas vers l’adoption d’Apache Arrow avec la sortie de nos derniers clients JDBC et Python. La récupération des ensembles de résultats sur ces clients exploite désormais le format en colonnes Arrow pour éviter les surcharge précédemment associée à la sérialisation et à la désérialisation des structures de données Snowflake qui sont également au format colonne.

Cela signifie que vous pouvez récupérer les ensembles de résultats beaucoup plus rapidement tout en préservant les ressources mémoire et CPU. Si vous travaillez avec Pandas DataFrames, les performances sont encore meilleures avec l’introduction de nos nouvelles API Python, qui téléchargent les ensembles de résultats directement dans un Pandas DataFrame. Les tests internes montrent une amélioration jusqu’à 5 fois pour la récupération des ensembles de résultats sur ces clients, et jusqu’à 10 fois si vous téléchargez directement dans un Pandas DataFrame à l’aide des nouvelles API client Python.

Repères de performance

Les graphiques suivants montrent les résultats de certains de nos benchmarks internes comparant les versions de pilote client qui utilisent le nouveau format Arrow aux versions précédentes qui ne l’utilisaient pas :

Figure 1. Benchmark des performances de récupération JDBC pour la version 3.11.0 du client JDBC par rapport à la version 3.9.x

TPCH 2

Figure 2. Benchmark des performances de récupération Python pour la version 2.1.1 du client Python par rapport à la version 2.0.x

TPCH 1

Figure 3. Analyse comparative des performances de récupération de Pandas pour l’API pd.read_sql par rapport à la nouvelle API Snowflake Pandas fetch_pandas_all

TPCH 3

Premiers pas avec le client JDBC

Téléchargez et installez le dernier client Snowflake JDBC (version 3.11.0 ou supérieure) à partir du dépôt publicsiteury et laissez le reste à Snowflake. (Remarque : la version la plus récente n’est pas toujours à la fin de la liste. Les versions sont répertoriées par ordre alphabétique et non numérique. Par exemple, 3.10.x vient après 3.1.x, pas après 3.9.x.)

Vous devez utiliser JDBC version 3.11.0 ou supérieure pour profiter de cette fonctionnalité. Consultez notre Journal des modifications du client pour plus de détails.

Premiers pas avec le client Python

Téléchargez la dernière version du client Snowflake Python (version 2.2.0 ou supérieure).

Pour profiter des nouvelles API Python pour Pandas, vous devrez procéder comme suit :

  1. Assurez-vous que vous avez satisfait aux exigences suivantes :
    • Connecteur flocon de neige 2.2.0 (ou supérieur) pour Python, qui prend en charge le format de données Arrow utilisé par Pandas
    • Python 3.5, 3.6 ou 3.7
    • Pandas 0.25.2 (ou supérieur) ; les versions antérieures peuvent fonctionner mais n’ont pas été testées
    • pip 19.0 (ou supérieur)
  2. Installez la version compatible Pandas du connecteur Snowflake pour Python :
pip install snowflake-connector-python[pandas]

3. Utilisez les nouvelles API :

Exemple:

ctx = snowflake.connector.connect(
          host=host,
          user=user,
          password=password,
          account=account,
          warehouse=warehouse,
          database=database,
          schema=schema,
          protocol="https",
          port=port)
# Create a cursor object.
cur = ctx.cursor()
# Execute a statement that will generate a result set.
sql = "select * from t"
cur.execute(sql)
# Fetch the result set from the cursor and deliver it as the Pandas DataFrame.
df = cur.fetch_pandas_all()
# ...

Exemple:

ctx = snowflake.connector.connect(
          host=host,
          user=user,
          password=password,
          account=account,
          warehouse=warehouse,
          database=database,
          schema=schema,
          protocol="https",
          port=port)
 
# Create a cursor object.
cur = ctx.cursor()
 
# Execute a statement that will generate a result set.
sql = "select * from t"
cur.execute(sql)
 
# Fetch the result set from the cursor and deliver it as the Pandas DataFrame.
for df in cur.fetch_pandas_batches():
    my_dataframe_processing_function(df)
 
# ...

Reportez-vous à ce qui suit page pour plus de détails.

Prochaines étapes

Nous sommes ravis de franchir cette première étape et travaillerons à la mise en œuvre d’Apache Arrow avec nos clients restants (ODBC, Golang, etc.) au cours des prochains mois.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.