2017-08-18 3 views
1

J'essaie de générer une clause dynamique FROM dans U-SQL afin de pouvoir extraire des données de différents fichiers en fonction d'un résultat de requête précédent. C'est quelque chose comme ceci:Dynamic FROM dans l'instruction U-SQL

@filesToExtract = SELECT whatevergeneratesthepaths from @foo; <-- this query generates a rowset with all the file we want to extract like: [/path/file1.csv, /path/file2.csv] 
SELECT * FROM @filesToExtract; <-- here we want to extract the data from file1 and file2 

Je crains que ce genre de requêtes dynamiques ne sont pas encore prises en charge, mais quelqu'un peut-il aider à me montrant la façon d'y parvenir? Il semble que la seule approche possible consiste à générer un autre script U-SQL et à l'exécuter ensuite.

Merci d'avance.

Répondre

2

Il n'est pas complètement clair à partir de votre question si vous voulez que les noms de fichiers soient récupérés dynamiquement et transmis à une instruction EXTRACT, ou le nom de tables/rowsets et passés à une clause FROM de SELECT. Ou les deux.

En général, vous ne pouvez pas générer dynamiquement des noms source à partir de votre expression U-SQL. Vous pouvez déposer une demande de fonctionnalité ici http://aka.ms/adlfeedback pour les sources paramétrables dynamiquement ou statiquement. Cela dit, en fonction de vos besoins exacts, il peut y avoir des moyens d'atteindre vos objectifs sans la solution décrite ci-dessus. Par exemple, vous pouvez écrire votre code en tant que fonction table paramétrée, puis passer les différents ensembles de lignes avec des scripts différents, ou - si vous pouvez décider statiquement quel ensemble de lignes choisir - vous pouvez utiliser l'instruction IF.

Voici un exemple pseudo-code:

DECLARE EXTERNAL @someconditionparameter Boolean = true; 

IF (@someconditionparameter) THEN 
    @data = EXTRACT a int, b string FROM @fileset1 USING Extractors.Csv(); 
ELSE 
    @data = EXTRACT a int, b string FROM @file2 USING ...; 
END; 

@results = MyTableValuedFunction (@data); 
... 

Si vos fichiers sont schématisés différemment, vous pouvez être en mesure d'utiliser des ensembles de colonnes flexibles (actuellement en avant-première, voir les notes de version) dans la TVF pour gérer la variabilité du schéma de l'ensemble de lignes.

+0

Merci pour votre réponse rapide. Même si cela me semble une approche assez intéressante, j'ai peur que ce ne soit pas ce que je cherche. Pour clarifier, ce que je veux faire est de "choisir" quels fichiers je vais extraire en fonction d'une requête précédente. Disons que j'ai stocké dans la base de données les chemins de fichiers de certains fichiers dans le magasin de données lac, je voudrais charger un tas de fichiers qui répondent à certaines conditions (comme un état ou quelque chose). J'espère que ma question est plus claire maintenant, de toute façon je vais soulever une demande de fonctionnalité dans le lien uservoice que vous m'avez envoyé avant. Merci encore pour votre temps et vos efforts. Cordialement. – jsanchez

+0

@jsanchez Je ne suis toujours pas sûr. Est-ce que les chemins de fichiers ont un motif que vous pouvez spécifier un ensemble de fichiers? Les états font-ils partie du nom du chemin du fichier ou du contenu des fichiers? Ont-ils le même schéma ou des schémas différents? Si, par exemple, vous avez des fichiers qui correspondent à un modèle dans un chemin et que vous souhaitez uniquement lire les fichiers correspondant à un certain chemin que vous souhaitez paramétrer, vous pouvez utiliser des jeux de fichiers et interroger les colonnes virtuelles. Cela va pousser la sélection dans l'extracteur et lire seulement les fichiers qui correspondent aux requêtes. –