2017-01-08 2 views
1

J'utilise une coutume IOutputter pour écrire les résultats de mon script U-SQL aa base de données locale:Azure Données du lac Analytics IOutputter obtenir le nom du fichier de sortie

OUTPUT @dataset 
TO "/path/somefilename_{*}.file" 
USING new CustomOutputter() 

public class CustomOutputter: IOutputter 
{   
     public CustomOutputter() 
     { 
      myCustomDatabase.Open("databasefile.database"); 
     }  

     public override void Output(IRow input, IUnstructuredWriter output) 
     { 

     } 
} 

Est-il possible de remplacer « DatabaseFile. base de données "avec le chemin de fichier de sortie spécifié" /chemin/somefilename_{*}.file "?

Puisque je ne peux pas passer output.BaseStream à la base de données je ne peux pas trouver un moyen d'écrire correctement le nom de fichier correct.

MISE À JOUR Comment copier le fichier DB local au ADLA fourni outputstream:

 public override void Close() 
     { 
      using (var fs = File.Open("databasefile.database", FileMode.Open)) 
      { 
       byte[] buffer = new byte[65536]; 
       int read; 
       while ((read = fs.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        this.output.BaseStream.Write(buffer, 0, read); 
        this.output.BaseStream.Flush(); 
       } 
      } 
     } 

Répondre

1

Je ne suis pas sûr de ce que vous essayez d'atteindre.

  1. Outputters (et udos en général) ne peuvent pas laisser leurs conteneurs (VMs) lorsqu'il est exécuté dans ADLA (exécution locale n'a pas de limite à ce stade). Donc se connecter à une base de données en dehors du conteneur va être bloqué et je ne suis pas sûr de ce qu'il est utile d'écrire des données dans une base de données dans une VM/conteneur transitoire.

  2. Le modèle UDO a un modèle bien défini pour écrire dans des fichiers qui vivent dans les deux ADLS ou WASB en écrivant les données dans la rangée input (ensemble) dans le courant de la output. Vous pouvez écrire dans des fichiers locaux, mais encore une fois, ces fichiers cesseront d'exister après la fin de l'exécution du sommet.

Compte tenu de ces informations, pourriez-vous s'il vous plaît reformuler?

mise à jour basée sur la clarification des commentaires

vous avez deux options pour générer une base de données à partir d'un ensemble de lignes:

  1. vous utilisez ADF pour faire le transfert de données. C'est l'approche la plus couramment utilisée et probablement la plus facile.
  2. Si vous utilisez une coutume outputter, vous pouvez essayer ce qui suit:
    1. écrire l'ensemble de lignes de sortie dans la base de données qui est locale à votre sommet (vous devez déployer la base de données comme une ressource, de sorte que vous avez probablement besoin d'un petit Ensuite, lisez le fichier de base de données à partir du répertoire local vertex dans le flux de sortie afin de copier le fichier dans ADLS.
    2. Notez que vous avez besoin d'un traitement de fichier atomique sur le générateur de sortie pour éviter d'écrire de nombreux fichiers de base de données qui seront ensuite assemblés.
+0

Merci pour l'explication. Mon intention était de laisser ADLA créer un fichier de base de données, qui peut ensuite être consommé par d'autres services sans traitement supplémentaire. Donc, en raison de ces limitations de ADLA, il semble que je doive utiliser par ex. DF et une activité personnalisée pour convertir la sortie ADLA dans mon format de fichier de base de données, non? – coalmee

+1

En fait vous avez deux options: 1. vous utilisez ADF pour faire le mouvement de données. 2. Si vous utilisez un outputter personnalisé, vous pouvez essayer ce qui suit: écrire l'ensemble de lignes en sortie dans la base de données locale (vous devrez peut-être déployer la base de données en tant que ressource, vous aurez probablement besoin d'une petite version entrer dans la limite de taille de ressource) en utilisant l'interface de base de données, puis lire le fichier de base de données à partir du répertoire local vertex dans le flux de sortie de sorte que vous copiez le fichier dans ADLS. Notez que vous avez besoin du traitement de fichier atomique et déployez la base de données en tant que ressource sur le vertex. –

+0

Je préférerais la deuxième approche. J'ai déjà essayé de copier le fichier DB dans le flux de sortie. Mais il échoue avec une limite de taille de ligne de 4 Mo lors de l'écriture du fichier dans le flux de sortie. Voir aussi: http://stackoverflow.com/questions/41533328/azure-data-lake-analytics-ioutputter-e-runtime-user-rowtoobig – coalmee