1
votes

INSÉRER les données de la trame de données Spark dans une table dans SQL Server

J'utilise Scala Notebook sur Databricks. J'ai besoin d'effectuer un INSERT de données à partir d'un dataframe vers une table dans le serveur SQL. Si les données existent déjà, pas besoin de modifier ou d'insérer - insérez uniquement des données qui n'existent pas.

J'ai essayé les méthodes spécifiées ici https://docs.databricks.com/spark/latest/data-sources/sql-databases.html#write-data-to-jdbc , cependant, ils ne répondent pas à mon cas d'utilisation. SaveMode.Append crée des entrées dupliquées des données, SaveMode.Overwrite remplace les données existantes (table), SaveMode.Ignore n'ajoute aucune nouvelle donnée si la table existe déjà.

df.write.mode (SaveMode.Overwrite) .jdbc (url = dbUrl, table = nom_table, dbConnectionProperties)

Comment puis-je faire une INSERT de nouvelles données uniquement dans la base de données?

Merci d'avance pour votre aide!


0 commentaires

3 Réponses :


0
votes

REMARQUE: - C'est une solution de contournement. Ce n'est pas une solution de preuve complète.

Il peut y avoir une solution de contournement pour ce problème. Vous devez conserver une clé à incrémentation automatique / clé primaire dans la table du serveur SQL. Et les données source doivent également avoir cette clé dans les données avant une insertion.

Les conditions suivantes peuvent survenir:

New Primary key == Old Primary key -> job will fail with constraints exception.
New Primary key != Old Primary key -> insert successfully.

L'échec de l'insertion dans la table peut être géré au niveau du programme.


1 commentaires

Pas vraiment une réponse.



1
votes

Supposons que votre dataframe actuelle est df1.

Vous devriez lire les données existantes dans la table SQL dans une autre dataframe (df2). Ensuite, utilisez soustract (ou soustractByKey): http: // spark.apache.org/docs/latest/api/python/pyspark.html?highlight=subtract

val dfFinal = df1.subtract(df2)

dfFinal contiendra les enregistrements restants à insérer.


2 commentaires

Merci! Cette approche nécessitera l'introduction d'une grande quantité de données (plus de 500 millions par travail) dans Databricks. Est-il recommandé de faire effectuer la vérification des doublons et INSERT dans spark plutôt qu'en SQL? Fournit-il généralement de meilleures performances d'après votre expérience? Je vais le tester, mais je me demande simplement si vous avez déjà expérimenté cela.


Ouais, ça peut être un problème. Idéalement, vous ne chargeriez pas les 500 m entiers. Au lieu de cela, sélectionnez les enregistrements des dernières 24 heures où vous pouvez avoir des doublons. Si cela n'est pas possible, une autre option consiste à charger df1 dans une table intermédiaire, puis à exécuter une instruction SQL pour charger les nouveaux enregistrements à l'aide d'une jointure.



0
votes

Pour éviter d’introduire l’ensemble complet pour effectuer une comparaison, vous pouvez placer un index unique sur la table SQL et utiliser l’option Ignorer les doublons.

Document MS: créer des index uniques

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

[ ; ]

<object> ::=
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }

<relational_index_option> ::=
{
  | IGNORE_DUP_KEY = { ON | OFF }
}


0 commentaires