2017-04-09 4 views
1

All -intérieur U-SQL crée un énorme Rejoignez grand fichier d'écriture

J'ai quelques questions à l'aide de tables et se joindre à ADLA de les charger dans SQL Azure DW.

Je suis bloqué sur l'un des processus de chargement et je ne sais pas comment résoudre ce problème. J'ai quelques informations d'achat qui quand je tire du système on-prem dans ADLS crée le dossier de sortie d'environ 25 Mo chacun et quand j'essaye de les joindre à employer "INNER JOIN" dans le travail d'ADLA il continue à courir pendant longtemps. En cours d'exécution, je vois que le fichier de sortie continue à plus de 5+ Go. Je pense que c'est trop pour un fichier de 25 Mo et je ne sais pas si je fais quelque chose de mal (capture d'écran jointe pour référence lors de l'exécution de VS). Le processus que je fais est - 1- charger les données de la base de données ADB sur le cloud ADLS en utilisant ADF 2- exécuter le travail ADLA pour extraire le fichier ADLS dans la table ADLA et partitionner en utilisant l'option ROUND ROBIN pour éviter les problèmes d'asymétrie Le travail ADLA créerait un fichier agrégé dans le pipeline ADF 4- ADF pour charger le fichier # 3 dans Azure SQL DW

Des pointeurs ou de l'aide pourraient être très utiles.

Merci, Shabbir

Voici le code (j'ai supprimé tous les noms de champs et de l'information client). J'espère que cela t'aides.

DECLARE @dir = "/{date:yyyy}/{date:MM}/{date:dd}/<FILE PATH>/"; 
DECLARE @in_1 string = <FILE #1>; 
DECLARE @in_2 string = <FILE #2>; 
DECLARE @out string = <OUTPUT FILE>; 

@file1 = 
    EXTRACT 
     <25 COL. WITH ALL NULLABLE> 
     date DateTime 
    FROM @in_1 
    USING Extractors.Text(delimiter : '|'); 

@file2 = 
    EXTRACT 
     <40 COL. WITH ALL NULLABLE> 
     date DateTime 
    FROM @in_2 
    USING Extractors.Text(delimiter : '|'); 

@output = 
    SELECT 
     <25 + 40 COL. FROM INPUT FILES> 
    FROM @file1 AS f1 
     INNER JOIN @file2 AS f2 
     ON f1.join1 == f2.join2; 

OUTPUT @purchase 
TO @out 
USING Outputters.Text(delimiter : '|'); 

Ceci est exécuté lancer un pipeline ADF et en utilisant des paramètres externes pour les chemins de date et de fichier.

enter image description here

+0

Veuillez poster le code U-SQL que vous utilisez. – wBob

+0

Bob, j'ai ajouté un extrait de code dans mes questions. Merci d'avance. –

+0

Si votre jointure entraîne une augmentation du volume de données, il est probable que vous ayez des valeurs en double dans vos colonnes de jointure.Si une valeur est présente 100 fois dans la table de gauche et 1000 fois dans la table de droite, cela conduira à 100 000 lignes dans la sortie (produit cartésien). Pourriez-vous vérifier cela, par exemple en chargeant vos données dans Power BI? –

Répondre

0

Il semble que vous n'utilisez des tables DLAA, mais simplement traiter des fichiers directement dans U-SQL. C'est bien, mais je voulais juste vérifier depuis que vous avez mentionné les tables. En outre, le code produit @purchase qui n'existe pas dans le script - je suppose que vous êtes en train de sortir le bon ensemble de lignes dans votre vrai script.

Quelques questions:

  • Avez-vous vérifié le format/contenu des fichiers d'entrée dans ADLS? Avez-vous fait une sortie de @ fichier1 et @ fichier2 pour vérifier qu'ils créent ce que vous attendez?
  • Comment savez-vous que le fichier de sortie atteint 5 Go? Du graphique du travail? Pouvez-vous joindre cela?
  • Utilisez-vous la colonne "date" pour quelque chose?
  • Votre colonne de jointure est-elle une colonne unique, et de quel type s'agit-il?
+0

Oui. Je n'utilise pas de tables ADLA pour le moment. Bien qu'ayant essayé cela aussi et obtenu les mêmes résultats. J'ai vérifié la sortie en exécutant des travaux d'extraction et ils affichent tous les contenus attendus Oui, son apparition dans le graphique du travail. Joindre une colonne dans le type de données int et sa relation principale entre deux tables J'ai joint la capture d'écran du graphique du travail dans la question. Vérifiez s'il vous plaît. –

0

Si f1.join1 == f2.join2 est comparaient en fait un (plus ou moins) clé unique par rapport à un autre (plus ou moins) clé unique, alors vous devriez obtenir un nombre raisonnable de lignes.

Mais beaucoup de gens implémentent CROSS JOIN s en utilisant cette même syntaxe. Par exemple, f1.join1 pourrait être 1 dans le tableau f1, et f2.join2 pourrait également être 1 dans le tableau f2. Ces valeurs de données entraîneraient la sortie CROSS JOIN des deux tables.