diff --git a/articles/api-management/api-management-sample-flexible-throttling.md b/articles/api-management/api-management-sample-flexible-throttling.md index e04c268fd77..82e1437048d 100644 --- a/articles/api-management/api-management-sample-flexible-throttling.md +++ b/articles/api-management/api-management-sample-flexible-throttling.md @@ -12,7 +12,7 @@ ms.devlang: dotnet ms.topic: article ms.tgt_pltfrm: na ms.workload: na -ms.date: 10/25/2016 +ms.date: 12/15/2016 ms.author: darrmi translationtype: Human Translation ms.sourcegitcommit: 2ea002938d69ad34aff421fa0eb753e449724a8f @@ -32,23 +32,27 @@ Les nouvelles stratégies [rate-limit-by-key](https://msdn.microsoft.com/library ## Limitation par adresse IP Les stratégies suivantes limitent l’adresse IP d’un client à 10 appels par minute, avec un total d’un million d’appels et 10 000 Ko de bande passante par mois. - +```xml + - + +``` Si tous les clients sur Internet utilisent une adresse IP unique, cela peut être un moyen efficace de limiter l'utilisation par utilisateur. Toutefois, il est probable que plusieurs utilisateurs partagent une même adresse IP publique parce qu’ils accèdent à Internet via un périphérique NAT. En dépit de cela, le `IpAddress` peut être la meilleure option pour les API qui autorisent l’accès non authentifié. ## Limitation par identité d'utilisateur Si un utilisateur final est authentifié, une clé de limitation de la clé peut être générée en fonction d’informations qui identifient cet utilisateur de façon unique. - +```xml + +``` Dans cet exemple, nous extrayons l'en-tête d'autorisation, pour la convertir en objet `JWT` et utiliser le sujet du jeton pour identifier l'utilisateur et l'utiliser comme la clé de limitation du débit. Si l'identité de l'utilisateur est stockée dans le `JWT` comme une des autres revendications, la valeur peut être utilisée à la place. @@ -58,9 +62,11 @@ Bien que les nouvelles stratégies de limitation offrent davantage de contrôle ## Limitation par client Lorsque la clé de limitation est définie en utilisant une [expression de stratégie](https://msdn.microsoft.com/library/azure/dn910913.aspx), le fournisseur d'API est celui qui choisit comment définir la limitation. Toutefois, un développeur peut souhaiter contrôler la limitation de débit de leurs propres clients. Cela peut être possible si le fournisseur de l'API introduit un en-tête personnalisé afin de permettre à l'application client du développeur de communiquer la clé à l'API. - +```xml + +``` Cela permet à l'application client du développeur de laisser le choix de la création de la clé de limitation de la fréquence. Avec un peu d'ingéniosité, un développeur client peut créer ses propres niveaux de fréquence en allouant des jeux de clés aux utilisateurs et grâce à la rotation de l'utilisation de la clé. diff --git a/articles/api-management/api-management-sample-send-request.md b/articles/api-management/api-management-sample-send-request.md index 2130666fd82..c9df32143b4 100644 --- a/articles/api-management/api-management-sample-send-request.md +++ b/articles/api-management/api-management-sample-send-request.md @@ -12,7 +12,7 @@ ms.devlang: dotnet ms.topic: article ms.tgt_pltfrm: na ms.workload: na -ms.date: 10/25/2016 +ms.date: 12/15/2016 ms.author: darrmi translationtype: Human Translation ms.sourcegitcommit: 2ea002938d69ad34aff421fa0eb753e449724a8f @@ -31,28 +31,30 @@ L’interaction externe la plus simple est peut-être le style « fire and forg ### Alerte avec Slack L’exemple suivant montre comment envoyer un message à une salle de conversation Slack si le code d’état de la réponse HTTP est supérieur ou égal à 500. Une erreur incluse dans la plage 500 indique un problème avec notre API principale que le client de notre API ne peut pas résoudre lui-même. Elle nécessite généralement une intervention de notre part. - - - - https://hooks.slack.com/services/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 - POST - @{ - return new JObject( - new JProperty("username","APIM Alert"), - new JProperty("icon_emoji", ":ghost:"), - new JProperty("text", String.Format("{0} {1}\nHost: {2}\n{3} {4}\n User: {5}", - context.Request.Method, - context.Request.Url.Path + context.Request.Url.QueryString, - context.Request.Url.Host, - context.Response.StatusCode, - context.Response.StatusReason, - context.User.Email - )) - ).ToString(); - } - - - +```xml + + + + https://hooks.slack.com/services/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 + POST + @{ + return new JObject( + new JProperty("username","APIM Alert"), + new JProperty("icon_emoji", ":ghost:"), + new JProperty("text", String.Format("{0} {1}\nHost: {2}\n{3} {4}\n User: {5}", + context.Request.Method, + context.Request.Url.Path + context.Request.Url.QueryString, + context.Request.Url.Host, + context.Response.StatusCode, + context.Response.StatusReason, + context.User.Email + )) + ).ToString(); + } + + + +``` Slack inclut la notion de Webhook entrant. Quand vous configurez un Webhook entrant, Slack génère une URL spéciale qui vous permet de faire une requête POST simple et de transmettre un message dans le canal Slack. Le corps JSON que nous créons se base sur un format défini par Slack. @@ -73,22 +75,26 @@ Par le passé, il n’existait aucun moyen normalisé de vérifier un jeton de r ### Extraction du jeton La première étape consiste à extraire le jeton de l’en-tête d’autorisation. La valeur d’en-tête doit être mise en forme à l’aide du modèle d’autorisation `Bearer` , d’un seul espace, puis du jeton d’autorisation conformément à la norme [RFC 6750](http://tools.ietf.org/html/rfc6750#section-2.1). Malheureusement, il existe des cas où le modèle d’autorisation est omis. Pour en tenir compte lors de l’analyse, nous fractionnons la valeur d’en-tête sur un espace et sélectionnons la dernière chaîne dans le tableau de chaînes retourné. Une solution de contournement est ainsi trouvée pour les en-têtes d’autorisation mal formés. - +```xml + +``` ### Requête de validation Une fois que nous avons le jeton d’autorisation, nous pouvons faire la requête pour valider le jeton. La norme RFC 7662 appelle ce processus « introspection » et vous oblige à appliquer une commande `POST` de formulaire HTML à la ressource d’introspection. Le formulaire HTML doit contenir au moins une paire clé/valeur avec la clé `token`. Cette requête adressée au serveur d’autorisation doit également être authentifiée pour veiller à ce qu’aucun client malveillant ne puisse obtenir des jetons valides. - - https://microsoft-apiappec990ad4c76641c6aea22f566efc5a4e.azurewebsites.net/introspection - POST - - basic dXNlcm5hbWU6cGFzc3dvcmQ= - - - application/x-www-form-urlencoded - - @($"token={(string)context.Variables["token"]}") - +```xml + + https://microsoft-apiappec990ad4c76641c6aea22f566efc5a4e.azurewebsites.net/introspection + POST + + basic dXNlcm5hbWU6cGFzc3dvcmQ= + + + application/x-www-form-urlencoded + + @($"token={(string)context.Variables["token"]}") + +``` ### Vérification de la réponse L’attribut `response-variable-name` est utilisé pour accéder à la réponse retournée. Le nom défini dans cette propriété peut être utilisé comme clé dans le dictionnaire `context.Variables` pour accéder à l’objet `IResponse`. @@ -98,53 +104,57 @@ L’attribut `response-variable-name` est utilisé pour accéder à la réponse ### Signalement d’un échec Nous utilisons une stratégie `` pour détecter si le jeton n’est pas valide et le cas échéant, retourner une réponse 401. - - ()["active"] == false)"> - - - - Bearer error="invalid_token" - - - - +```xml + + ()["active"] == false)"> + + + + Bearer error="invalid_token" + + + + +``` Conformément à la norme [RFC 6750](https://tools.ietf.org/html/rfc6750#section-3) qui décrit comment les jetons `bearer` doivent être utilisés, nous retournons également un en-tête `WWW-Authenticate` avec la réponse 401. L’élément WWW-Authenticate a pour but d’informer un client sur la manière de créer une requête dûment autorisée. En raison de la grande variété d’approches possibles avec l’infrastructure OAuth2, il est difficile de communiquer toutes les informations nécessaires. Heureusement, tous les efforts sont déployés pour aider les [clients à découvrir comment autoriser correctement les requêtes adressées à un serveur de ressources](http://tools.ietf.org/html/draft-jones-oauth-discovery-00). ### Solution finale En rassemblant tous les éléments, nous obtenons la stratégie suivante : - - - - - - - https://microsoft-apiappec990ad4c76641c6aea22f566efc5a4e.azurewebsites.net/introspection - POST - - basic dXNlcm5hbWU6cGFzc3dvcmQ= - - - application/x-www-form-urlencoded - - @($"token={(string)context.Variables["token"]}") - - - - - ()["active"] == false)"> - - - - - Bearer error="invalid_token" - - - - - - +```xml + + + + + + + https://microsoft-apiappec990ad4c76641c6aea22f566efc5a4e.azurewebsites.net/introspection + POST + + basic dXNlcm5hbWU6cGFzc3dvcmQ= + + + application/x-www-form-urlencoded + + @($"token={(string)context.Variables["token"]}") + + + + + ()["active"] == false)"> + + + + + Bearer error="invalid_token" + + + + + + +``` Il ne s’agit que d’un des nombreux exemples d’utilisation de la stratégie `send-request` pour intégrer des services externes utiles dans le processus des requêtes et réponses transitant par le service de gestion des API. @@ -166,11 +176,65 @@ Une fois l’opération `dashboard` créée, nous pouvons configurer une straté La première étape consiste à extraire les paramètres de requête à partir de la requête entrante, de sorte à pouvoir les transférer vers notre serveur principal. Dans cet exemple, notre tableau de bord affiche des informations selon une période ; il comporte donc un paramètre `fromDate` et `toDate`. Nous pouvons utiliser la stratégie `set-variable` pour extraire les informations de l’URL de la requête. - - +```xml + + +``` Une fois que nous avons ces informations, nous pouvons faire des requêtes auprès de tous les systèmes principaux. Chaque requête construit une nouvelle URL avec les informations de paramètre, puis appelle son serveur respectif et enregistre la réponse dans une variable de contexte. +```xml + + @($"https://accounting.acme.com/salesdata?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" + GET + + + + @($"https://inventory.acme.com/materiallevels?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" + GET + + + +@($"https://production.acme.com/throughput?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" + GET + + + +@($"https://production.acme.com/throughput?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" + GET + +``` + +Ces requêtes s’exécutent en séquence, ce qui n’est pas idéal. Dans une prochaine version, nous introduirons une nouvelle stratégie nommée `wait` qui permettra à toutes ces requêtes de s’exécuter en parallèle. + +### Réponse +Pour construire la réponse composite, nous pouvons utiliser la stratégie [return-response](https://msdn.microsoft.com/library/azure/dn894085.aspx#ReturnResponse) . L’élément `set-body` peut utiliser une expression pour construire un nouveau `JObject` avec toutes les représentations de composant incorporées en tant que propriétés. + +```xml + + + + application/json + + + @(new JObject(new JProperty("revenuedata",((IResponse)context.Variables["revenuedata"]).Body.As()), + new JProperty("materialdata",((IResponse)context.Variables["materialdata"]).Body.As()), + new JProperty("throughputdata",((IResponse)context.Variables["throughputdata"]).Body.As()), + new JProperty("accidentdata",((IResponse)context.Variables["accidentdata"]).Body.As()) + ).ToString()) + + +``` + +La stratégie complète se présente comme suit : + +```xml + + + + + + @($"https://accounting.acme.com/salesdata?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" GET @@ -191,11 +255,6 @@ Une fois que nous avons ces informations, nous pouvons faire des requêtes aupr GET -Ces requêtes s’exécutent en séquence, ce qui n’est pas idéal. Dans une prochaine version, nous introduirons une nouvelle stratégie nommée `wait` qui permettra à toutes ces requêtes de s’exécuter en parallèle. - -### Réponse -Pour construire la réponse composite, nous pouvons utiliser la stratégie [return-response](https://msdn.microsoft.com/library/azure/dn894085.aspx#ReturnResponse) . L’élément `set-body` peut utiliser une expression pour construire un nouveau `JObject` avec toutes les représentations de composant incorporées en tant que propriétés. - @@ -209,56 +268,15 @@ Pour construire la réponse composite, nous pouvons utiliser la stratégie [retu ).ToString()) - -La stratégie complète se présente comme suit : - - - - - - - - - @($"https://accounting.acme.com/salesdata?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" - GET - - - - @($"https://inventory.acme.com/materiallevels?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" - GET - - - - @($"https://production.acme.com/throughput?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" - GET - - - - @($"https://production.acme.com/throughput?from={(string)context.Variables["fromDate"]}&to={(string)context.Variables["fromDate"]}")" - GET - - - - - - application/json - - - @(new JObject(new JProperty("revenuedata",((IResponse)context.Variables["revenuedata"]).Body.As()), - new JProperty("materialdata",((IResponse)context.Variables["materialdata"]).Body.As()), - new JProperty("throughputdata",((IResponse)context.Variables["throughputdata"]).Body.As()), - new JProperty("accidentdata",((IResponse)context.Variables["accidentdata"]).Body.As()) - ).ToString()) - - - - - - - - - - + + + + + + + + +``` Pendant la configuration de l’opération d’espace réservé, nous pouvons configurer la ressource de tableau de bord de sorte à la mettre en cache pendant au moins une heure, car nous sommes conscients que la nature des données signifie que même si elle est en retard d’une heure, elle sera quand même suffisamment efficace pour transmettre des informations utiles aux utilisateurs. diff --git a/articles/api-management/automation-manage-api-management.md b/articles/api-management/automation-manage-api-management.md index 0b2825434eb..e7bf2883935 100644 --- a/articles/api-management/automation-manage-api-management.md +++ b/articles/api-management/automation-manage-api-management.md @@ -12,7 +12,7 @@ ms.workload: mobile ms.tgt_pltfrm: na ms.devlang: na ms.topic: article -ms.date: 10/25/2016 +ms.date: 12/15/2016 ms.author: csand translationtype: Human Translation ms.sourcegitcommit: 219dcbfdca145bedb570eb9ef747ee00cc0342eb diff --git a/articles/cloud-services/cloud-services-startup-tasks.md b/articles/cloud-services/cloud-services-startup-tasks.md index 258d446c89c..df74c1b010f 100644 --- a/articles/cloud-services/cloud-services-startup-tasks.md +++ b/articles/cloud-services/cloud-services-startup-tasks.md @@ -12,7 +12,7 @@ ms.workload: tbd ms.tgt_pltfrm: na ms.devlang: na ms.topic: article -ms.date: 09/06/2016 +ms.date: 12/14/2016 ms.author: adegeo translationtype: Human Translation ms.sourcegitcommit: 2ea002938d69ad34aff421fa0eb753e449724a8f diff --git a/articles/data-factory/data-factory-amazon-redshift-connector.md b/articles/data-factory/data-factory-amazon-redshift-connector.md index 12e50c18859..12f9506c67d 100644 --- a/articles/data-factory/data-factory-amazon-redshift-connector.md +++ b/articles/data-factory/data-factory-amazon-redshift-connector.md @@ -49,164 +49,168 @@ L’exemple copie toutes les heures les données de résultat d’une requête d **Service lié Amazon Redshift** +```json +{ + "name": "AmazonRedshiftLinkedService", + "properties": { - "name": "AmazonRedshiftLinkedService", - "properties": + "type": "AmazonRedshift", + "typeProperties": { - "type": "AmazonRedshift", - "typeProperties": - { - "server": "< The IP address or host name of the Amazon Redshift server >", - "port": , - "database": "", - "username": "", - "password": "" - } + "server": "< The IP address or host name of the Amazon Redshift server >", + "port": , + "database": "", + "username": "", + "password": "" } } - +} +``` **Service lié Azure Storage** - { - "name": "AzureStorageLinkedService", - "properties": { - "type": "AzureStorage", - "typeProperties": { - "connectionString": "DefaultEndpointsProtocol=https;AccountName=;AccountKey=" - } - } +```json +{ + "name": "AzureStorageLinkedService", + "properties": { + "type": "AzureStorage", + "typeProperties": { + "connectionString": "DefaultEndpointsProtocol=https;AccountName=;AccountKey=" } - + } +} +``` **Jeu de données d’entrée Amazon Redshift** La définition de **« external » : true** informe le service Data Factory qu’il s’agit d’un jeu de données qui est externe à Data Factory et non produit par une activité dans Data Factory. Définissez cette propriété sur true sur un jeu de données d’entrée qui n’est pas produit par une activité dans le pipeline. - { - "name": "AmazonRedshiftInputDataset", - "properties": { - "type": "RelationalTable", - "linkedServiceName": "AmazonRedshiftLinkedService", - "typeProperties": { - "tableName": "" - }, - "availability": { - "frequency": "Hour", - "interval": 1 - }, - "external": true - } +```json +{ + "name": "AmazonRedshiftInputDataset", + "properties": { + "type": "RelationalTable", + "linkedServiceName": "AmazonRedshiftLinkedService", + "typeProperties": { + "tableName": "
" + }, + "availability": { + "frequency": "Hour", + "interval": 1 + }, + "external": true } - +} +``` **Jeu de données de sortie Azure Blob** Les données sont écrites dans un nouvel objet blob toutes les heures (fréquence : heure, intervalle : 1). Le chemin d’accès du dossier pour l’objet blob est évalué dynamiquement en fonction de l’heure de début du segment en cours de traitement. Le chemin d’accès du dossier utilise l’année, le mois, le jour et l’heure de l’heure de début. - { - "name": "AzureBlobOutputDataSet", - "properties": { - "type": "AzureBlob", - "linkedServiceName": "AzureStorageLinkedService", - "typeProperties": { - "folderPath": "mycontainer/fromamazonredshift/yearno={Year}/monthno={Month}/dayno={Day}/hourno={Hour}", - "format": { - "type": "TextFormat", - "rowDelimiter": "\n", - "columnDelimiter": "\t" +```json +{ + "name": "AzureBlobOutputDataSet", + "properties": { + "type": "AzureBlob", + "linkedServiceName": "AzureStorageLinkedService", + "typeProperties": { + "folderPath": "mycontainer/fromamazonredshift/yearno={Year}/monthno={Month}/dayno={Day}/hourno={Hour}", + "format": { + "type": "TextFormat", + "rowDelimiter": "\n", + "columnDelimiter": "\t" + }, + "partitionedBy": [ + { + "name": "Year", + "value": { + "type": "DateTime", + "date": "SliceStart", + "format": "yyyy" + } }, - "partitionedBy": [ - { - "name": "Year", - "value": { - "type": "DateTime", - "date": "SliceStart", - "format": "yyyy" - } - }, - { - "name": "Month", - "value": { - "type": "DateTime", - "date": "SliceStart", - "format": "MM" - } - }, - { - "name": "Day", - "value": { - "type": "DateTime", - "date": "SliceStart", - "format": "dd" - } - }, - { - "name": "Hour", - "value": { - "type": "DateTime", - "date": "SliceStart", - "format": "HH" - } + { + "name": "Month", + "value": { + "type": "DateTime", + "date": "SliceStart", + "format": "MM" } - ] - }, - "availability": { - "frequency": "Hour", - "interval": 1 - } + }, + { + "name": "Day", + "value": { + "type": "DateTime", + "date": "SliceStart", + "format": "dd" + } + }, + { + "name": "Hour", + "value": { + "type": "DateTime", + "date": "SliceStart", + "format": "HH" + } + } + ] + }, + "availability": { + "frequency": "Hour", + "interval": 1 } } - - +} +``` **Pipeline avec activité de copie** Le pipeline contient une activité de copie qui est configurée pour utiliser les jeux de données d'entrée et de sortie, et qui est planifiée pour s'exécuter toutes les heures. Dans la définition du pipeline JSON, le type **source** est défini sur **RelationalSource** et le type **sink** est défini sur **BlobSink**. La requête SQL spécifiée pour la propriété **query** sélectionne les données de la dernière heure à copier. - { - "name": "CopyAmazonRedshiftToBlob", - "properties": { - "description": "pipeline for copy activity", - "activities": [ - { - "type": "Copy", - "typeProperties": { - "source": { - "type": "RelationalSource", - "query": "$$Text.Format('select * from MyTable where timestamp >= \\'{0:yyyy-MM-ddTHH:mm:ss}\\' AND timestamp < \\'{1:yyyy-MM-ddTHH:mm:ss}\\'', WindowStart, WindowEnd)" - }, - "sink": { - "type": "BlobSink", - "writeBatchSize": 0, - "writeBatchTimeout": "00:00:00" - } - }, - "inputs": [ - { - "name": "AmazonRedshiftInputDataset" - } - ], - "outputs": [ - { - "name": "AzureBlobOutputDataSet" - } - ], - "policy": { - "timeout": "01:00:00", - "concurrency": 1 - }, - "scheduler": { - "frequency": "Hour", - "interval": 1 +```json +{ + "name": "CopyAmazonRedshiftToBlob", + "properties": { + "description": "pipeline for copy activity", + "activities": [ + { + "type": "Copy", + "typeProperties": { + "source": { + "type": "RelationalSource", + "query": "$$Text.Format('select * from MyTable where timestamp >= \\'{0:yyyy-MM-ddTHH:mm:ss}\\' AND timestamp < \\'{1:yyyy-MM-ddTHH:mm:ss}\\'', WindowStart, WindowEnd)" }, - "name": "AmazonRedshiftToBlob" - } - ], - "start": "2014-06-01T18:00:00Z", - "end": "2014-06-01T19:00:00Z" - } + "sink": { + "type": "BlobSink", + "writeBatchSize": 0, + "writeBatchTimeout": "00:00:00" + } + }, + "inputs": [ + { + "name": "AmazonRedshiftInputDataset" + } + ], + "outputs": [ + { + "name": "AzureBlobOutputDataSet" + } + ], + "policy": { + "timeout": "01:00:00", + "concurrency": 1 + }, + "scheduler": { + "frequency": "Hour", + "interval": 1 + }, + "name": "AmazonRedshiftToBlob" + } + ], + "start": "2014-06-01T18:00:00Z", + "end": "2014-06-01T19:00:00Z" } - +} +``` ## Propriétés du service lié diff --git a/articles/data-factory/data-factory-load-sql-data-warehouse.md b/articles/data-factory/data-factory-load-sql-data-warehouse.md index e1f979a58fd..d28701fd544 100644 --- a/articles/data-factory/data-factory-load-sql-data-warehouse.md +++ b/articles/data-factory/data-factory-load-sql-data-warehouse.md @@ -12,7 +12,7 @@ ms.workload: data-services ms.tgt_pltfrm: na ms.devlang: na ms.topic: article -ms.date: 10/28/2016 +ms.date: 12/16/2016 ms.author: jingwang translationtype: Human Translation ms.sourcegitcommit: 219dcbfdca145bedb570eb9ef747ee00cc0342eb @@ -78,32 +78,33 @@ Cet article fournit des instructions détaillées pour déplacer les données da Pour obtenir le meilleur débit possible, la copie doit être effectuée à l’aide d’un utilisateur SQL Data Warehouse appartenant à la classe de ressources `xlargerc`. Découvrez comment procéder en consultant [Exemple de modification d’une classe de ressources utilisateur](../sql-data-warehouse/sql-data-warehouse-develop-concurrency.md#change-a-user-resource-class-example). * Créez le schéma de la table de destination dans la base de données Azure SQL Data Warehouse en exécutant l’instruction DDL suivante : - - CREATE TABLE [dbo].[lineitem] - ( - [L_ORDERKEY] [bigint] NOT NULL, - [L_PARTKEY] [bigint] NOT NULL, - [L_SUPPKEY] [bigint] NOT NULL, - [L_LINENUMBER] [int] NOT NULL, - [L_QUANTITY] [decimal](15, 2) NULL, - [L_EXTENDEDPRICE] [decimal](15, 2) NULL, - [L_DISCOUNT] [decimal](15, 2) NULL, - [L_TAX] [decimal](15, 2) NULL, - [L_RETURNFLAG] [char](1) NULL, - [L_LINESTATUS] [char](1) NULL, - [L_SHIPDATE] [date] NULL, - [L_COMMITDATE] [date] NULL, - [L_RECEIPTDATE] [date] NULL, - [L_SHIPINSTRUCT] [char](25) NULL, - [L_SHIPMODE] [char](10) NULL, - [L_COMMENT] [varchar](44) NULL - ) - WITH - ( - DISTRIBUTION = ROUND_ROBIN, - CLUSTERED COLUMNSTORE INDEX - ) + ```SQL + CREATE TABLE [dbo].[lineitem] + ( + [L_ORDERKEY] [bigint] NOT NULL, + [L_PARTKEY] [bigint] NOT NULL, + [L_SUPPKEY] [bigint] NOT NULL, + [L_LINENUMBER] [int] NOT NULL, + [L_QUANTITY] [decimal](15, 2) NULL, + [L_EXTENDEDPRICE] [decimal](15, 2) NULL, + [L_DISCOUNT] [decimal](15, 2) NULL, + [L_TAX] [decimal](15, 2) NULL, + [L_RETURNFLAG] [char](1) NULL, + [L_LINESTATUS] [char](1) NULL, + [L_SHIPDATE] [date] NULL, + [L_COMMITDATE] [date] NULL, + [L_RECEIPTDATE] [date] NULL, + [L_SHIPINSTRUCT] [char](25) NULL, + [L_SHIPMODE] [char](10) NULL, + [L_COMMENT] [varchar](44) NULL + ) + WITH + ( + DISTRIBUTION = ROUND_ROBIN, + CLUSTERED COLUMNSTORE INDEX + ) + ``` Une fois les étapes requises terminées, nous sommes désormais prêts à configurer l’activité de copie à l’aide de l’Assistant Copie. ## Lancer l’Assistant Copie @@ -139,67 +140,66 @@ Dans la page **Propriétés** : 2. Sélectionnez l’option **Exécuter une fois**. 3. Cliquez sur **Next**. -![Assistant Copie - Page Propriétés](media/data-factory-load-sql-data-warehouse/copy-wizard-properties-page.png) + ![Assistant Copie - Page Propriétés](media/data-factory-load-sql-data-warehouse/copy-wizard-properties-page.png) ## Étape 2 : Configurer la source Cette section décrit les étapes pour configurer la source : Azure Blob contenant les fichiers d’éléments de ligne TPC-H 1 To. -Sélectionnez **Stockage Blob Azure** comme magasin de données et cliquez sur **Suivant**. +1. Sélectionnez **Stockage Blob Azure** comme magasin de données et cliquez sur **Suivant**. -![Assistant Copie - Page Sélectionner la source](media/data-factory-load-sql-data-warehouse/select-source-connection.png) + ![Assistant Copie - Page Sélectionner la source](media/data-factory-load-sql-data-warehouse/select-source-connection.png) -Renseignez les informations de connexion pour le compte Stockage Blob Azure, puis cliquez sur **Suivant**. +2. Renseignez les informations de connexion pour le compte Stockage Blob Azure, puis cliquez sur **Suivant**. -![Assistant Copie - Informations de connexion à la source](media/data-factory-load-sql-data-warehouse/source-connection-info.png) + ![Assistant Copie - Informations de connexion à la source](media/data-factory-load-sql-data-warehouse/source-connection-info.png) -Choisissez le **dossier** contenant les fichiers d’éléments de ligne TPC-H et cliquez sur **Suivant**. +3. Choisissez le **dossier** contenant les fichiers d’éléments de ligne TPC-H et cliquez sur **Suivant**. -![Assistant Copie - Sélectionner le dossier d’entrée](media/data-factory-load-sql-data-warehouse/select-input-folder.png) + ![Assistant Copie - Sélectionner le dossier d’entrée](media/data-factory-load-sql-data-warehouse/select-input-folder.png) -Lorsque vous cliquez sur **Suivant**, les paramètres de format de fichier sont détectés automatiquement. Vérifiez que le délimiteur de colonne est « | » au lieu de la virgule par défaut « , ». Cliquez sur **Suivant** une fois que vous avez affiché un aperçu des données. +4. Lorsque vous cliquez sur **Suivant**, les paramètres de format de fichier sont détectés automatiquement. Vérifiez que le délimiteur de colonne est « | » au lieu de la virgule par défaut « , ». Cliquez sur **Suivant** une fois que vous avez affiché un aperçu des données. -![Assistant Copie - Paramètres de format de fichier](media/data-factory-load-sql-data-warehouse/file-format-settings.png) + ![Assistant Copie - Paramètres de format de fichier](media/data-factory-load-sql-data-warehouse/file-format-settings.png) ## Étape 3 : Configurer la destination Cette section vous montre comment configurer la destination : la table `lineitem` dans la base de données Azure SQL Data Warehouse. -Choisissez **Azure SQL Data Warehouse** comme magasin de destination et cliquez sur **Suivant**. +1. Choisissez **Azure SQL Data Warehouse** comme magasin de destination et cliquez sur **Suivant**. -![Assistant Copie - Sélectionner le magasin de données de destination](media/data-factory-load-sql-data-warehouse/select-destination-data-store.png) + ![Assistant Copie - Sélectionner le magasin de données de destination](media/data-factory-load-sql-data-warehouse/select-destination-data-store.png) -Renseignez les informations de connexion pour Azure SQL Data Warehouse. Veillez à spécifier l’utilisateur qui est membre du rôle `xlargerc` (voir les **conditions préalables** pour obtenir des instructions détaillées), puis cliquez sur **Suivant**. +2. Renseignez les informations de connexion pour Azure SQL Data Warehouse. Veillez à spécifier l’utilisateur qui est membre du rôle `xlargerc` (voir les **conditions préalables** pour obtenir des instructions détaillées), puis cliquez sur **Suivant**. -![Assistant Copie - Informations de connexion à la destination](media/data-factory-load-sql-data-warehouse/destination-connection-info.png) + ![Assistant Copie - Informations de connexion à la destination](media/data-factory-load-sql-data-warehouse/destination-connection-info.png) -Choisissez la table de destination et cliquez sur **Suivant**. +3. Choisissez la table de destination et cliquez sur **Suivant**. -![Assistant Copie - Page Mappage de table](media/data-factory-load-sql-data-warehouse/table-mapping-page.png) + ![Assistant Copie - Page Mappage de table](media/data-factory-load-sql-data-warehouse/table-mapping-page.png) -Acceptez les paramètres par défaut pour le mappage de colonne et cliquez sur **Suivant**. +4. Acceptez les paramètres par défaut pour le mappage de colonne et cliquez sur **Suivant**. -![Assistant Copie - Page Mappage de schéma](media/data-factory-load-sql-data-warehouse/schema-mapping.png) + ![Assistant Copie - Page Mappage de schéma](media/data-factory-load-sql-data-warehouse/schema-mapping.png) ## Étape 4 : Paramètres de performance + La case **Autoriser Polybase** est cochée par défaut. Cliquez sur **Next**. ![Assistant Copie - Page Mappage de schéma](media/data-factory-load-sql-data-warehouse/performance-settings-page.png) ## Étape 5 : Déployer et surveiller les résultats du chargement -Cliquez sur le bouton **Terminer** pour déployer. - -![Assistant Copie - Page Résumé](media/data-factory-load-sql-data-warehouse/summary-page.png) +1. Cliquez sur le bouton **Terminer** pour déployer. -Une fois le déploiement terminé, cliquez sur `Click here to monitor copy pipeline` pour surveiller la progression de l’exécution de la copie. + ![Assistant Copie - Page Résumé](media/data-factory-load-sql-data-warehouse/summary-page.png) -Sélectionner le pipeline de copie que vous avez créé dans la liste **Fenêtres d’activité**. +2. Une fois le déploiement terminé, cliquez sur `Click here to monitor copy pipeline` pour surveiller la progression de l’exécution de la copie. Sélectionner le pipeline de copie que vous avez créé dans la liste **Fenêtres d’activité**. -![Assistant Copie - Page Résumé](media/data-factory-load-sql-data-warehouse/select-pipeline-monitor-manage-app.png) + ![Assistant Copie - Page Résumé](media/data-factory-load-sql-data-warehouse/select-pipeline-monitor-manage-app.png) -Vous pouvez afficher les détails de l’exécution de la copie dans **l’Explorateur de fenêtres d’activité** dans le panneau de droite, notamment le volume de données lu à partir de la source et écrit dans la destination, la durée et le débit moyen de l’exécution. + Vous pouvez afficher les détails de l’exécution de la copie dans **l’Explorateur de fenêtres d’activité** dans le panneau de droite, notamment le volume de données lu à partir de la source et écrit dans la destination, la durée et le débit moyen de l’exécution. -Comme vous pouvez le voir dans la capture d’écran suivante, la copie de 1 To à partir du Stockage Blob Azure vers SQL Data Warehouse a pris 14 minutes, avec un débit de 1,22 Gbits/s ! + Comme vous pouvez le voir dans la capture d’écran suivante, la copie de 1 To à partir du Stockage Blob Azure vers SQL Data Warehouse a pris 14 minutes, avec un débit de 1,22 Gbits/s ! -![Assistant Copie - Boîte de dialogue Succès](media/data-factory-load-sql-data-warehouse/succeeded-info.png) + ![Assistant Copie - Boîte de dialogue Succès](media/data-factory-load-sql-data-warehouse/succeeded-info.png) ## Meilleures pratiques Voici quelques meilleures pratiques pour l’exécution de votre base de données Azure SQL Data Warehouse : diff --git a/articles/machine-learning/machine-learning-custom-r-modules.md b/articles/machine-learning/machine-learning-custom-r-modules.md index 8d918731fcf..3774063e00b 100644 --- a/articles/machine-learning/machine-learning-custom-r-modules.md +++ b/articles/machine-learning/machine-learning-custom-r-modules.md @@ -12,7 +12,7 @@ ms.devlang: na ms.topic: article ms.tgt_pltfrm: na ms.workload: tbd -ms.date: 08/19/2016 +ms.date: 12/09/2016 ms.author: bradsev;ankarlof translationtype: Human Translation ms.sourcegitcommit: 219dcbfdca145bedb570eb9ef747ee00cc0342eb diff --git a/articles/sql-database/sql-database-manage-application-rolling-upgrade.md b/articles/sql-database/sql-database-manage-application-rolling-upgrade.md index 19af1774639..b3acef51c3d 100644 --- a/articles/sql-database/sql-database-manage-application-rolling-upgrade.md +++ b/articles/sql-database/sql-database-manage-application-rolling-upgrade.md @@ -8,7 +8,7 @@ manager: jhubbard editor: monicar ms.assetid: 58f42859-1e37-463c-a3d8-a3ca2e867148 ms.service: sql-database -ms.custom: business continuity; app development +ms.custom: business continuity ms.devlang: NA ms.topic: article ms.tgt_pltfrm: NA diff --git a/includes/data-factory-azure-storage-linked-services.md b/includes/data-factory-azure-storage-linked-services.md index d885423408f..df8c11db65d 100644 --- a/includes/data-factory-azure-storage-linked-services.md +++ b/includes/data-factory-azure-storage-linked-services.md @@ -10,16 +10,17 @@ Pour plus d’informations sur l’affichage ou la copie de la clé de compte po **Exemple :** - { - "name": "StorageLinkedService", - "properties": { - "type": "AzureStorage", - "typeProperties": { - "connectionString": "DefaultEndpointsProtocol=https;AccountName=;AccountKey=" - } +```json +{ + "name": "StorageLinkedService", + "properties": { + "type": "AzureStorage", + "typeProperties": { + "connectionString": "DefaultEndpointsProtocol=https;AccountName=;AccountKey=" } } - +} +``` ## Service lié SAP Azure Storage Une signature d’accès partagé (SAP) fournit un accès délégué aux ressources de votre compte de stockage. Cela vous permet d’octroyer à un client des autorisations d’accès limité à des objets de votre compte de stockage pendant une période donnée et avec un ensemble défini d’autorisations, sans partager les clés d’accès de votre compte. La signature d'accès partagé est un URI qui englobe dans ses paramètres de requête toutes les informations nécessaires pour un accès authentifié à une ressource de stockage. Pour accéder aux ressources de stockage avec la signature d'accès partagé, il suffit au client de transmettre cette dernière à la méthode ou au constructeur approprié. Pour plus d’informations sur SAP, consultez [Signatures d’accès partagé : présentation du modèle SAP](../articles/storage/storage-dotnet-shared-access-signature-part-1.md) @@ -33,15 +34,17 @@ Le service lié Azure Storage SAS vous permet de lier un compte de stockage Azur **Exemple :** - { - "name": "StorageSasLinkedService", - "properties": { - "type": "AzureStorageSas", - "typeProperties": { - "sasUri": "?" - } +```json +{ + "name": "StorageSasLinkedService", + "properties": { + "type": "AzureStorageSas", + "typeProperties": { + "sasUri": "?" } } +} +``` Quand vous créez un **URI SAP**, prenez en compte les points suivants : diff --git a/includes/data-factory-column-mapping.md b/includes/data-factory-column-mapping.md index 29f6b867afa..da9e48f7272 100644 --- a/includes/data-factory-column-mapping.md +++ b/includes/data-factory-column-mapping.md @@ -18,134 +18,140 @@ Voici une liste de conditions d’erreur qui entraîneront la levée d’une exc > > -### Exemple 1 : mappage de colonnes depuis SQL Azure vers un objet blob Azure +### Exemple 1 : mappage de colonnes depuis SQL Azure vers un objet blob Azure Dans cet exemple, la table d’entrée possède une structure et pointe vers une table SQL comprise dans une base de données SQL Azure. - { - "name": "AzureSQLInput", - "properties": { - "structure": - [ - { "name": "userid"}, - { "name": "name"}, - { "name": "group"} - ], - "type": "AzureSqlTable", - "linkedServiceName": "AzureSqlLinkedService", - "typeProperties": { - "tableName": "MyTable" - }, - "availability": { - "frequency": "Hour", - "interval": 1 - }, - "external": true, - "policy": { - "externalData": { - "retryInterval": "00:01:00", - "retryTimeout": "00:10:00", - "maximumRetry": 3 - } +```json +{ + "name": "AzureSQLInput", + "properties": { + "structure": + [ + { "name": "userid"}, + { "name": "name"}, + { "name": "group"} + ], + "type": "AzureSqlTable", + "linkedServiceName": "AzureSqlLinkedService", + "typeProperties": { + "tableName": "MyTable" + }, + "availability": { + "frequency": "Hour", + "interval": 1 + }, + "external": true, + "policy": { + "externalData": { + "retryInterval": "00:01:00", + "retryTimeout": "00:10:00", + "maximumRetry": 3 } } } +} +``` Dans cet exemple, la table de sortie possède une structure et pointe vers un objet blob compris dans un stockage d’objets blob Azure. +```json +{ + "name": "AzureBlobOutput", + "properties": { - "name": "AzureBlobOutput", - "properties": - { - "structure": - [ - { "name": "myuserid"}, - { "name": "myname" }, - { "name": "mygroup"} - ], - "type": "AzureBlob", - "linkedServiceName": "StorageLinkedService", - "typeProperties": { - "folderPath": "mycontainer/myfolder", - "fileName":"myfile.csv", - "format": - { - "type": "TextFormat", - "columnDelimiter": "," - } - }, - "availability": + "structure": + [ + { "name": "myuserid"}, + { "name": "myname" }, + { "name": "mygroup"} + ], + "type": "AzureBlob", + "linkedServiceName": "StorageLinkedService", + "typeProperties": { + "folderPath": "mycontainer/myfolder", + "fileName":"myfile.csv", + "format": { - "frequency": "Hour", - "interval": 1 + "type": "TextFormat", + "columnDelimiter": "," } + }, + "availability": + { + "frequency": "Hour", + "interval": 1 } } +} +``` Le code JSON de cette activité est fourni ci-dessous. Colonnes de la source mappées sur les colonnes du récepteur (**columnMappings**) en utilisant la propriété **Translator**. - { - "name": "CopyActivity", - "description": "description", - "type": "Copy", - "inputs": [ { "name": "AzureSQLInput" } ], - "outputs": [ { "name": "AzureBlobOutput" } ], - "typeProperties": { - "source": - { - "type": "SqlSource" - }, - "sink": - { - "type": "BlobSink" - }, - "translator": - { - "type": "TabularTranslator", - "ColumnMappings": "UserId: MyUserId, Group: MyGroup, Name: MyName" - } +```json +{ + "name": "CopyActivity", + "description": "description", + "type": "Copy", + "inputs": [ { "name": "AzureSQLInput" } ], + "outputs": [ { "name": "AzureBlobOutput" } ], + "typeProperties": { + "source": + { + "type": "SqlSource" }, - "scheduler": { - "frequency": "Hour", - "interval": 1 - } - } - + "sink": + { + "type": "BlobSink" + }, + "translator": + { + "type": "TabularTranslator", + "ColumnMappings": "UserId: MyUserId, Group: MyGroup, Name: MyName" + } + }, + "scheduler": { + "frequency": "Hour", + "interval": 1 + } +} +``` **Flux du mappage de colonnes :** ![Flux du mappage de colonnes](./media/data-factory-data-stores-with-rectangular-tables/column-mapping-flow.png) -### Exemple 2 : mappage de colonnes à l’aide d’une requête SQL depuis SQL Azure vers un objet blob Azure +### Exemple 2 : mappage de colonnes à l’aide d’une requête SQL depuis SQL Azure vers un objet blob Azure Dans cet exemple, une requête SQL est utilisée pour extraire des données de SQL Azure au lieu de simplement spécifier le nom de la table et le nom des colonnes dans la section « structure ». +```json +{ + "name": "CopyActivity", + "description": "description", + "type": "CopyActivity", + "inputs": [ { "name": " AzureSQLInput" } ], + "outputs": [ { "name": " AzureBlobOutput" } ], + "typeProperties": { - "name": "CopyActivity", - "description": "description", - "type": "CopyActivity", - "inputs": [ { "name": " AzureSQLInput" } ], - "outputs": [ { "name": " AzureBlobOutput" } ], - "typeProperties": + "source": { - "source": - { - "type": "SqlSource", - "SqlReaderQuery": "$$Text.Format('SELECT * FROM MyTable WHERE StartDateTime = \\'{0:yyyyMMdd-HH}\\'', WindowStart)" - }, - "sink": - { - "type": "BlobSink" - }, - "Translator": - { - "type": "TabularTranslator", - "ColumnMappings": "UserId: MyUserId, Group: MyGroup,Name: MyName" - } + "type": "SqlSource", + "SqlReaderQuery": "$$Text.Format('SELECT * FROM MyTable WHERE StartDateTime = \\'{0:yyyyMMdd-HH}\\'', WindowStart)" }, - "scheduler": { - "frequency": "Hour", - "interval": 1 - } - } - + "sink": + { + "type": "BlobSink" + }, + "Translator": + { + "type": "TabularTranslator", + "ColumnMappings": "UserId: MyUserId, Group: MyGroup,Name: MyName" + } + }, + "scheduler": { + "frequency": "Hour", + "interval": 1 + } +} +``` Dans ce cas, les résultats de la requête sont d’abord mappés vers les colonnes spécifiées dans la « structure » de la source. Ensuite, les colonnes de la « structure » de la source sont mappées vers les colonnes de la « structure » du récepteur avec les règles spécifiées dans columnMappings. Supposons que la requête retourne cinq colonnes, c’est-à-dire deux colonnes de plus que celles spécifiées dans la « structure » de la source. **Flux du mappage de colonnes** diff --git a/includes/data-factory-compression.md b/includes/data-factory-compression.md index d1ee1556f83..8d4355d7e17 100644 --- a/includes/data-factory-compression.md +++ b/includes/data-factory-compression.md @@ -8,25 +8,27 @@ Le traitement de jeux de données de grande taille peut provoquer des goulots d Pour spécifier la compression pour un jeu de données, utilisez la propriété **compression** du jeu de données JSON, comme dans l'exemple suivant : - { - "name": "AzureBlobDataSet", - "properties": { - "availability": { - "frequency": "Day", - "interval": 1 - }, - "type": "AzureBlob", - "linkedServiceName": "StorageLinkedService", - "typeProperties": { - "fileName": "pagecounts.csv.gz", - "folderPath": "compression/file/", - "compression": { - "type": "GZip", - "level": "Optimal" - } - } - } - } +```json +{ + "name": "AzureBlobDataSet", + "properties": { + "availability": { + "frequency": "Day", + "interval": 1 + }, + "type": "AzureBlob", + "linkedServiceName": "StorageLinkedService", + "typeProperties": { + "fileName": "pagecounts.csv.gz", + "folderPath": "compression/file/", + "compression": { + "type": "GZip", + "level": "Optimal" + } + } + } +} +``` La section **compression** a deux propriétés : diff --git a/includes/data-factory-file-format.md b/includes/data-factory-file-format.md index 6974c166481..d427e833a23 100644 --- a/includes/data-factory-file-format.md +++ b/includes/data-factory-file-format.md @@ -25,27 +25,30 @@ Si le format est défini sur **TextFormat**, vous pouvez spécifier les proprié #### Exemple pour TextFormat L'exemple suivant illustre certaines des propriétés de format pour TextFormat. - "typeProperties": +```json +"typeProperties": +{ + "folderPath": "mycontainer/myfolder", + "fileName": "myblobname", + "format": { - "folderPath": "mycontainer/myfolder", - "fileName": "myblobname" - "format": - { - "type": "TextFormat", - "columnDelimiter": ",", - "rowDelimiter": ";", - "quoteChar": "\"", - "NullValue": "NaN" - "firstRowAsHeader": true, - "skipLineCount": 0, - "treatEmptyAsNull": true - } - }, + "type": "TextFormat", + "columnDelimiter": ",", + "rowDelimiter": ";", + "quoteChar": "\"", + "NullValue": "NaN", + "firstRowAsHeader": true, + "skipLineCount": 0, + "treatEmptyAsNull": true + } +}, +``` Pour utiliser escapeChar à la place de quoteChar, remplacez la ligne contenant quoteChar par l’escapeChar suivant : - "escapeChar": "$", - +```json +"escapeChar": "$", +``` ### Scénarios d’utilisation de firstRowAsHeader et skipLineCount @@ -56,10 +59,12 @@ Pour utiliser escapeChar à la place de quoteChar, remplacez la ligne contenant ### Définition d'AvroFormat Si le format est défini sur AvroFormat, il est inutile de spécifier des propriétés dans la section Format de la section typeProperties. Exemple : - "format": - { - "type": "AvroFormat", - } +```json +"format": +{ + "type": "AvroFormat", +} +``` Pour utiliser le format Avro dans une table Hive, vous pouvez faire référence au [didacticiel Apache Hive](https://cwiki.apache.org/confluence/display/Hive/AvroSerDe). @@ -83,25 +88,61 @@ Chaque fichier contient un objet unique, ou plusieurs objets concaténés/délim **objet unique** - { - "time": "2015-04-29T07:12:20.9100000Z", - "callingimsi": "466920403025604", - "callingnum1": "678948008", - "callingnum2": "567834760", - "switch1": "China", - "switch2": "Germany" - } +```json +{ + "time": "2015-04-29T07:12:20.9100000Z", + "callingimsi": "466920403025604", + "callingnum1": "678948008", + "callingnum2": "567834760", + "switch1": "China", + "switch2": "Germany" +} +``` **JSON délimité par des lignes** +```json {"time":"2015-04-29T07:12:20.9100000Z","callingimsi":"466920403025604","callingnum1":"678948008","callingnum2":"567834760","switch1":"China","switch2":"Germany"} {"time":"2015-04-29T07:13:21.0220000Z","callingimsi":"466922202613463","callingnum1":"123436380","callingnum2":"789037573","switch1":"US","switch2":"UK"} {"time":"2015-04-29T07:13:21.4370000Z","callingimsi":"466923101048691","callingnum1":"678901578","callingnum2":"345626404","switch1":"Germany","switch2":"UK"} {"time":"2015-04-29T07:13:22.0960000Z","callingimsi":"466922202613463","callingnum1":"789037573","callingnum2":"789044691","switch1":"UK","switch2":"Australia"} {"time":"2015-04-29T07:13:22.0960000Z","callingimsi":"466922202613463","callingnum1":"123436380","callingnum2":"789044691","switch1":"US","switch2":"Australia"} +``` **JSON concaténé** +```json +{ + "time": "2015-04-29T07:12:20.9100000Z", + "callingimsi": "466920403025604", + "callingnum1": "678948008", + "callingnum2": "567834760", + "switch1": "China", + "switch2": "Germany" +} +{ + "time": "2015-04-29T07:13:21.0220000Z", + "callingimsi": "466922202613463", + "callingnum1": "123436380", + "callingnum2": "789037573", + "switch1": "US", + "switch2": "UK" +} +{ + "time": "2015-04-29T07:13:21.4370000Z", + "callingimsi": "466923101048691", + "callingnum1": "678901578", + "callingnum2": "345626404", + "switch1": "Germany", + "switch2": "UK" +} +``` + +#### Modèle de fichier arrayOfObjects +Chaque fichier contient un tableau d’objets. + +```json +[ { "time": "2015-04-29T07:12:20.9100000Z", "callingimsi": "466920403025604", @@ -109,7 +150,7 @@ Chaque fichier contient un objet unique, ou plusieurs objets concaténés/délim "callingnum2": "567834760", "switch1": "China", "switch2": "Germany" - } + }, { "time": "2015-04-29T07:13:21.0220000Z", "callingimsi": "466922202613463", @@ -117,7 +158,7 @@ Chaque fichier contient un objet unique, ou plusieurs objets concaténés/délim "callingnum2": "789037573", "switch1": "US", "switch2": "UK" - } + }, { "time": "2015-04-29T07:13:21.4370000Z", "callingimsi": "466923101048691", @@ -125,83 +166,54 @@ Chaque fichier contient un objet unique, ou plusieurs objets concaténés/délim "callingnum2": "345626404", "switch1": "Germany", "switch2": "UK" + }, + { + "time": "2015-04-29T07:13:22.0960000Z", + "callingimsi": "466922202613463", + "callingnum1": "789037573", + "callingnum2": "789044691", + "switch1": "UK", + "switch2": "Australia" + }, + { + "time": "2015-04-29T07:13:22.0960000Z", + "callingimsi": "466922202613463", + "callingnum1": "123436380", + "callingnum2": "789044691", + "switch1": "US", + "switch2": "Australia" + }, + { + "time": "2015-04-29T07:13:24.2120000Z", + "callingimsi": "466922201102759", + "callingnum1": "345698602", + "callingnum2": "789097900", + "switch1": "UK", + "switch2": "Australia" + }, + { + "time": "2015-04-29T07:13:25.6320000Z", + "callingimsi": "466923300236137", + "callingnum1": "567850552", + "callingnum2": "789086133", + "switch1": "China", + "switch2": "Germany" } - - -#### Modèle de fichier arrayOfObjects -Chaque fichier contient un tableau d’objets. - - [ - { - "time": "2015-04-29T07:12:20.9100000Z", - "callingimsi": "466920403025604", - "callingnum1": "678948008", - "callingnum2": "567834760", - "switch1": "China", - "switch2": "Germany" - }, - { - "time": "2015-04-29T07:13:21.0220000Z", - "callingimsi": "466922202613463", - "callingnum1": "123436380", - "callingnum2": "789037573", - "switch1": "US", - "switch2": "UK" - }, - { - "time": "2015-04-29T07:13:21.4370000Z", - "callingimsi": "466923101048691", - "callingnum1": "678901578", - "callingnum2": "345626404", - "switch1": "Germany", - "switch2": "UK" - }, - { - "time": "2015-04-29T07:13:22.0960000Z", - "callingimsi": "466922202613463", - "callingnum1": "789037573", - "callingnum2": "789044691", - "switch1": "UK", - "switch2": "Australia" - }, - { - "time": "2015-04-29T07:13:22.0960000Z", - "callingimsi": "466922202613463", - "callingnum1": "123436380", - "callingnum2": "789044691", - "switch1": "US", - "switch2": "Australia" - }, - { - "time": "2015-04-29T07:13:24.2120000Z", - "callingimsi": "466922201102759", - "callingnum1": "345698602", - "callingnum2": "789097900", - "switch1": "UK", - "switch2": "Australia" - }, - { - "time": "2015-04-29T07:13:25.6320000Z", - "callingimsi": "466923300236137", - "callingnum1": "567850552", - "callingnum2": "789086133", - "switch1": "China", - "switch2": "Germany" - } - ] - +] +``` ### Exemple pour JsonFormat Prenons un fichier JSON avec le contenu suivant : - { - "Id": 1, - "Name": { - "First": "John", - "Last": "Doe" - }, - "Tags": ["Data Factory”, "Azure"] - } - +```json +{ + "Id": 1, + "Name": { + "First": "John", + "Last": "Doe" + }, + "Tags": ["Data Factory”, "Azure"] +} +``` Vous voulez copier ce contenu dans un tableau SQL Azure dans le format suivant : | ID | Name.First | Name.Middle | Name.Last | Tags | @@ -210,27 +222,28 @@ Vous voulez copier ce contenu dans un tableau SQL Azure dans le format suivant : Le jeu de données d’entrée ayant le type JsonFormat est défini comme suit : (définition partielle présentant uniquement les éléments pertinents) - "properties": { - "structure": [ - {"name": "Id", "type": "Int"}, - {"name": "Name.First", "type": "String"}, - {"name": "Name.Middle", "type": "String"}, - {"name": "Name.Last", "type": "String"}, - {"name": "Tags", "type": "string"} - ], - "typeProperties": +```json +"properties": { + "structure": [ + {"name": "Id", "type": "Int"}, + {"name": "Name.First", "type": "String"}, + {"name": "Name.Middle", "type": "String"}, + {"name": "Name.Last", "type": "String"}, + {"name": "Tags", "type": "string"} + ], + "typeProperties": + { + "folderPath": "mycontainer/myfolder", + "format": { - "folderPath": "mycontainer/myfolder", - "format": - { - "type": "JsonFormat", - "filePattern": "setOfObjects", - "encodingName": "UTF-8", - "nestingSeparator": "." - } + "type": "JsonFormat", + "filePattern": "setOfObjects", + "encodingName": "UTF-8", + "nestingSeparator": "." } } - +} +``` Si la structure n’est pas définie, l’activité de copie aplatit la structure par défaut et copie tout le contenu. #### Structure JSON prise en charge @@ -245,10 +258,12 @@ Notez les points suivants : ### Spécification d’OrcFormat Si le format est défini sur OrcFormat, il est inutile de spécifier des propriétés dans la section Format de la section typeProperties. Exemple : - "format": - { - "type": "OrcFormat" - } +```json +"format": +{ + "type": "OrcFormat" +} +``` > [!IMPORTANT] > Si vous ne copiez pas les fichiers ORC **tels quels** entre les magasins de données locaux et cloud, vous devez installer JRE 8 (Java Runtime Environment) sur votre machine de passerelle. La passerelle 64 bits requiert un environnement JRE 64 bits et que la passerelle 32 bits nécessite un environnement JRE 32 bits. Ces deux versions sont disponibles [ici](http://go.microsoft.com/fwlink/?LinkId=808605). Sélectionnez la bonne version. @@ -263,11 +278,12 @@ Notez les points suivants : ### Spécification de ParquetFormat Si le format est défini sur ParquetFormat, il est inutile de spécifier des propriétés dans la section Format de la section typeProperties. Exemple : - "format": - { - "type": "ParquetFormat" - } - +```json +"format": +{ + "type": "ParquetFormat" +} +``` > [!IMPORTANT] > Si vous ne copiez pas les fichiers Parquet **tels quels** entre les magasins de données locaux et cloud, vous devez installer JRE 8 (Java Runtime Environment) sur votre machine de passerelle. La passerelle 64 bits requiert un environnement JRE 64 bits et que la passerelle 32 bits nécessite un environnement JRE 32 bits. Ces deux versions sont disponibles [ici](http://go.microsoft.com/fwlink/?LinkId=808605). Sélectionnez la bonne version. > diff --git a/includes/data-factory-file-share-dataset.md b/includes/data-factory-file-share-dataset.md index ec33bfaf8ab..342154171f4 100644 --- a/includes/data-factory-file-share-dataset.md +++ b/includes/data-factory-file-share-dataset.md @@ -24,25 +24,29 @@ Comme mentionné dans la section précédente, vous pouvez spécifier un folderP Consultez les articles [Jeux de données dans Azure Data Factory](../articles/data-factory/data-factory-create-datasets.md), [Planification et exécution avec Data Factory](../articles/data-factory/data-factory-scheduling-and-execution.md) et [Pipelines et activités dans Azure Data Factory](../articles/data-factory/data-factory-create-pipelines.md) pour en savoir plus sur les jeux de données de série chronologique, la planification et les segments. #### Exemple 1 : - "folderPath": "wikidatagateway/wikisampledataout/{Slice}", - "partitionedBy": - [ - { "name": "Slice", "value": { "type": "DateTime", "date": "SliceStart", "format": "yyyyMMddHH" } }, - ], +```json +"folderPath": "wikidatagateway/wikisampledataout/{Slice}", +"partitionedBy": +[ + { "name": "Slice", "value": { "type": "DateTime", "date": "SliceStart", "format": "yyyyMMddHH" } }, +], +``` Dans cet exemple, {Slice} est remplacé par la valeur de la variable système Data Factory SliceStart au format (AAAAMMJJHH) spécifié. SliceStart fait référence à l'heure de début du segment. folderPath est différent pour chaque segment. Par exemple : wikidatagateway/wikisampledataout/2014100103 ou wikidatagateway/wikisampledataout/2014100104. #### Exemple 2 : - "folderPath": "wikidatagateway/wikisampledataout/{Year}/{Month}/{Day}", - "fileName": "{Hour}.csv", - "partitionedBy": - [ - { "name": "Year", "value": { "type": "DateTime", "date": "SliceStart", "format": "yyyy" } }, - { "name": "Month", "value": { "type": "DateTime", "date": "SliceStart", "format": "MM" } }, - { "name": "Day", "value": { "type": "DateTime", "date": "SliceStart", "format": "dd" } }, - { "name": "Hour", "value": { "type": "DateTime", "date": "SliceStart", "format": "hh" } } - ], +```json +"folderPath": "wikidatagateway/wikisampledataout/{Year}/{Month}/{Day}", +"fileName": "{Hour}.csv", +"partitionedBy": + [ + { "name": "Year", "value": { "type": "DateTime", "date": "SliceStart", "format": "yyyy" } }, + { "name": "Month", "value": { "type": "DateTime", "date": "SliceStart", "format": "MM" } }, + { "name": "Day", "value": { "type": "DateTime", "date": "SliceStart", "format": "dd" } }, + { "name": "Hour", "value": { "type": "DateTime", "date": "SliceStart", "format": "hh" } } +], +``` Dans cet exemple, l'année, le mois, le jour et l'heure de SliceStart sont extraits dans des variables distinctes qui sont utilisées par les propriétés folderPath et fileName. diff --git a/includes/data-factory-sql-invoke-stored-procedure.md b/includes/data-factory-sql-invoke-stored-procedure.md index 35c1b3cddf2..2d85da0919c 100644 --- a/includes/data-factory-sql-invoke-stored-procedure.md +++ b/includes/data-factory-sql-invoke-stored-procedure.md @@ -9,54 +9,60 @@ Vous pouvez appeler la procédure stockée de votre choix. L’exemple suivant m Dans cet exemple, le type est défini sur SqlServerTable. Affectez-lui la valeur AzureSqlTable pour l’utiliser avec une base de données SQL Azure. - { - "name": "SqlOutput", - "properties": { - "type": "SqlServerTable", - "linkedServiceName": "SqlLinkedService", - "typeProperties": { - "tableName": "Marketing" - }, - "availability": { - "frequency": "Hour", - "interval": 1 - } - } +```json +{ + "name": "SqlOutput", + "properties": { + "type": "SqlServerTable", + "linkedServiceName": "SqlLinkedService", + "typeProperties": { + "tableName": "Marketing" + }, + "availability": { + "frequency": "Hour", + "interval": 1 } + } +} +``` Définissez la section SqlSink dans l’activité de copie JSON comme suit. Pour appeler une procédure stockée lors de l’insertion des données, les deux propriétés SqlWriterStoredProcedureName et SqlWriterTableType sont requises. - "sink": - { - "type": "SqlSink", - "SqlWriterTableType": "MarketingType", - "SqlWriterStoredProcedureName": "spOverwriteMarketing", - "storedProcedureParameters": +```json +"sink": +{ + "type": "SqlSink", + "SqlWriterTableType": "MarketingType", + "SqlWriterStoredProcedureName": "spOverwriteMarketing", + "storedProcedureParameters": + { + "stringData": { - "stringData": - { - "value": "str1" - } + "value": "str1" } - } + } +} +``` Dans votre base de données, définissez la procédure stockée portant le même nom que SqlWriterStoredProcedureName. Elle gère les données d'entrée à partir de la source que vous avez spécifiée et les insère dans la table de sortie. Notez que le nom du paramètre de la procédure stockée doit être le même que le tableName défini dans le fichier de Table JSON. - CREATE PROCEDURE spOverwriteMarketing @Marketing [dbo].[MarketingType] READONLY, @stringData varchar(256) - AS - BEGIN - DELETE FROM [dbo].[Marketing] where ProfileID = @stringData - INSERT [dbo].[Marketing](ProfileID, State) - SELECT * FROM @Marketing - END - +```sql +CREATE PROCEDURE spOverwriteMarketing @Marketing [dbo].[MarketingType] READONLY, @stringData varchar(256) +AS +BEGIN + DELETE FROM [dbo].[Marketing] where ProfileID = @stringData + INSERT [dbo].[Marketing](ProfileID, State) + SELECT * FROM @Marketing +END +``` Dans votre base de données, définissez le type de table portant le même nom que SqlWriterTableType. Notez que le schéma du type de table doit être identique au schéma retourné par vos données d'entrée. - CREATE TYPE [dbo].[MarketingType] AS TABLE( - [ProfileID] [varchar](256) NOT NULL, - [State] [varchar](256) NOT NULL - ) - +```sql +CREATE TYPE [dbo].[MarketingType] AS TABLE( + [ProfileID] [varchar](256) NOT NULL, + [State] [varchar](256) NOT NULL +) +``` La fonction de procédure stockée tire parti des [paramètres Table-Valued](https://msdn.microsoft.com/library/bb675163.aspx). diff --git a/includes/data-factory-structure-for-rectangualr-datasets.md b/includes/data-factory-structure-for-rectangualr-datasets.md index 1e36abed218..52e6685ef71 100644 --- a/includes/data-factory-structure-for-rectangualr-datasets.md +++ b/includes/data-factory-structure-for-rectangualr-datasets.md @@ -12,12 +12,14 @@ Chaque colonne contient les propriétés suivantes : L’exemple suivant présente la section JSON structure d’une table qui comporte trois colonnes : userid, name et lastlogindate. - "structure": - [ - { "name": "userid"}, - { "name": "name"}, - { "name": "lastlogindate"} - ], +```json +"structure": +[ + { "name": "userid"}, + { "name": "name"}, + { "name": "lastlogindate"} +], +``` Suivez les recommandations suivantes pour savoir quand inclure les informations de « structure » et pour connaître les éléments à inclure dans la section **structure** . diff --git a/includes/data-factory-type-repeatability-for-relational-sources.md b/includes/data-factory-type-repeatability-for-relational-sources.md index 0405697489f..5d25cea70fe 100644 --- a/includes/data-factory-type-repeatability-for-relational-sources.md +++ b/includes/data-factory-type-repeatability-for-relational-sources.md @@ -12,20 +12,23 @@ Une tranche peut être réexécutée automatiquement dans Azure Data Factory en En général, vous pouvez lire uniquement les données des magasins relationnels qui correspondent à cette tranche. Pour cela, vous pouvez utiliser les variables WindowStart et WindowEnd disponibles dans Azure Data Factory. Pour plus d’informations sur les variables et les fonctions dans Azure Data Factory, lisez l’article intitulé [Planification et exécution](../articles/data-factory/data-factory-scheduling-and-execution.md) . Exemple : - "source": { - "type": "SqlSource", - "sqlReaderQuery": "$$Text.Format('select * from MyTable where timestampcolumn >= \\'{0:yyyy-MM-dd HH:mm\\' AND timestampcolumn < \\'{1:yyyy-MM-dd HH:mm\\'', WindowStart, WindowEnd)" - }, - +```json +"source": { +"type": "SqlSource", +"sqlReaderQuery": "$$Text.Format('select * from MyTable where timestampcolumn >= \\'{0:yyyy-MM-dd HH:mm\\' AND timestampcolumn < \\'{1:yyyy-MM-dd HH:mm\\'', WindowStart, WindowEnd)" +}, +``` Cette requête lit les données de « MyTable » comprises dans la plage de durée de la tranche. La réexécution de cette tranche garantit toujours un tel comportement. Dans d’autres cas, vous pourriez souhaiter lire l’intégralité de la table (par exemple, dans le cas d’un déplacement unique). Vous devrez alors définir sqlReaderQuery comme suit : - "source": { - "type": "SqlSource", - "sqlReaderQuery": "select * from MyTable" - }, - +```json +"source": +{ + "type": "SqlSource", + "sqlReaderQuery": "select * from MyTable" +}, +```