Logpickr Sink
Présentation
Un connecteur sink est chargé de transférer des données depuis Kafka vers un autre système. Ici l'autre système correspond à L'API Logpickr.
Le principe du connecteur est de récupérer des données au format AVRO provenants d'un topic Kafka et de les écrire sur un fichier qui est ensuite envoyé à l'API Logpickr.
Le fichier CSV ayant un format adapté au Column Mapping du projet, les données reçues peuvent alors être analysées et présentées par l'outil Process Explorer 360.
Le connecteur peut aussi créer un Column Mapping pour le projet Logpickr, si ce dernier n'en a pas déjà un.
Le connecteur aggrège aussi les données selon des critères :
- Nombre d'éléments : Lorsque le nombre d'éléments (lignes) atteint un certain nombre, les données sont envoyées à l'API Logpickr.
- pattern de données : Une Regex déclenche l'envoi des données aggrégées vers l'API Logpickr lorsqu'un certain pattern des données est reconnu.
- Timeout : Après un certain temps depuis le dernier envoi, les données aggrégées sont envoyées (même si le nombre d'éléments n'est pas atteint).
- Retention : Cette valeur n'est pas définie par l'utilisateur dans les propriétés du connecteur. Cette valeur est liée à la configuration kafka retention.ms du topic concerné.
Propriétés du connecteur
Pour instancier le connecteur il suffit de remplir les propriétés suivantes :
connector.class = "com.logpickr.kafka.sink.main.domain.LogpickrAggregationSinkConnector",
tasks.max = "1",
topics = "logpickr_topic_example",
api.url = "api_url_example",
api.authUrl = "auth_url_example",
workGroupId = "w_id_example",
workGroupKey = "w_key_example",
projectId = "project_id_example",
csv.encoding = "UTF-8",
csv.separator = ",",
csv.quote = """,
csv.fieldsNumber = "9",
csv.header = "true",
csv.defaultTextValue = "null",
retentionTimeInDay = "100",
columnMapping.create = "true",
columnMapping.caseIdColumnIndex = "0",
columnMapping.activityColumnIndex = "1",
columnMapping.timeInformationList = "{2;dd/MM/yy HH:mm},{3;dd/MM/yy HH:mm}",
columnMapping.dimensionsInformationList = "[{"columnIndex": 4, "name": "Pays", "isCaseScope": true, "aggregation": "FIRST", "groupedTasksAggregation": "FIRST"},{"columnIndex": 5, "name": "Region", "isCaseScope": false, "groupedTasksAggregation": "FIRST"},{"columnIndex": 6, "name": "Ville", "isCaseScope": false, "groupedTasksAggregation": "LAST"}]",
columnMapping.metricsInformationList = "[{"columnIndex": 7, "name": "Prix", "unit": "Euros", "isCaseScope": true, "aggregation": "MIN", "groupedTasksAggregation": "AVG"},{"columnIndex": 8, "name": "NumeroDepartement", "isCaseScope": false, "groupedTasksAggregation": "FIRST"}]",
columnMapping.groupedTasksColumns = "[1, 2, 3]",
csv.endOfLine = "\\n",
csv.escape = "\",
csv.comment = "#",
kafkaLoggingEvents.isLogging = "true",
kafkaLoggingEvents.topic = "event_logging_topic_example",
threshold.elementNumber = "6",
threshold.valuePattern = ".*regex_example.*",
threshold.timeoutInSeconds = "3000",
bootstrap.servers = "broker:29092",
key.converter = "org.apache.kafka.connect.storage.StringConverter",
value.converter = "io.confluent.connect.avro.AvroConverter",
value.converter.schema.registry.url = "http://schema-registry:8081"
Attention : Penser à échapper le caractère backslash
Propriétés obligatoires :
Ici, les valeurs sont données à titre d'exemple bien que celles pour les propriétés suivantes ne doivent pas changer :
- connector.class (String)
- key.converter (String)
- value.converter (String)
Les autres propriétés peuvent être modifiées :
- tasks.max (Int) : Nombre de tâches que l'on souhaite créer pour le connecteur
- api.url (String) : L'url correspondant à l'API Logpickr et permettant d'y envoyer un fichier
- api.authUrl (String) : L'url à utiliser pour s'authentifier et récupérer le token de connexion
- workGroupId (String) : L'ID du workgroup
- workGroupKey (String) : La Key du workgroup
- projectId (String) : l'ID du projet Logpickr (doit suivre le format UUID)
- csv.encoding (String) : L'encodage du fichier (UTF-8/ASCII/ISO-8859-1)
- csv.separator (String) : Le caractère séparateur entre deux champs du fichier csv (1 seul caractère)
- csv.quote (String) : Le caractère de citation (1 seul caractère)
- csv.fieldsNumber (Int) : Le nombre de champs dans une ligne (doit être >= 3)
- csv.header (Boolean) : Permet de savoir si le fichier doit avoir un header ou non (true/false)
- csv.defaultTextValue (String) : Valeur à écrire dans le fichier si une colonne est manquante
-
retentionTimeInDay (Int) : Durée de vie d'un fichier archivé en jours (doit être > 0)
-
threshold.elementNumber (Int) : Nombre maximum d'éléments d'une aggregation (lorsque le nombre est atteint, l'aggrégation est envoyée à l'API Logpickr )
- threshold.valuePattern (String) : Facultative l'appel d'API lorsqu'une valeur correspond à une regex définie dans threshold.valuePattern (l'aggrégation est envoyée à l'API Logpickr même si threshold.elementNumber n'est pas atteint). Ce pattern doit être défini à la création du connecteur pour être pris en compte. Il porte sur la valeur complète d'un SinkRecord (si la valeur est au format JSON par exemple, le pattern devra prendre en compte les accolades '{' '}' du JSON, à adapter selon la structure des données)
- threshold.timeoutInSeconds (Int) : Si le temps depuis le dernier envoi dépasse threshold.timeoutInSeconds, l'aggregation courante (en construction) est envoyé à l'API Logpickr (même si threshold.elementNumber n'est pas atteint)
- bootstrap.servers (String) : List des Kafka brokers
- value.converter.schema.registry.url (String) : URL du schema registry kafka
Plus d'infos sur les regex ( threshold.valuePattern ) : https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285
Propriétés facultatives :
Les propriétés qui suivent ne sont à renseigner que si l'on souhaite créer le Column Mapping depuis le connecteur :
- columnMapping.create (Boolean) : Indique si l'on créer le Column Mapping depuis le connecteur (true/false), si true alors toutes les propriétés qui suivent doivent être renseignées, si false il n'est pas nécessaire de les renseigner
- columnMapping.caseIdColumnIndex (Int) : l'index de la colonne CaseId (doit être >= 0)
- columnMapping.activityColumnIndex (Int) : l'index de la colonne Activity (doit être >= 0)
- columnMapping.timeInformationList (String) : Informations sur les colonnes Time au format {columnIndex;dateFormat} séparés par une ',' si il y en a deux. Il doit y avoir au minimum les informations d'une colonne et au maximum celles de deux colonnes. Le columnIndex doit être un Int >= 0 et dateFormat doit être une chaine de caractère de taille minimum 1
- columnMapping.dimensionsInformationList (String) : Informations sur les colonnes Dimension. Les informations doivent être données par l'utilisateur avec un format JSON. Pour les paramètres, le columnIndex doit être un Int >= 0 et columnName doit être une chaine de caractère de taille minimum 1. IsCaseScope est un booléen obligatoire utile pour déterminer si pour un évenement, la valeur de la colonne est calculée en fonction d'une agrégation sur le cas complet. Pour la Dimension, les types d'agrégation suivants sont disponibles : "FIRST", "LAST", "DISTINCT", le type de l'agrégation choisie est défini avec le paramètre aggregation. Notez que si isCaseScope vaut true, vous devez donner un type d'agrégation, et que si il est false, vous avez le choix entre écrire ou non le paramètre aggregation. Quand la propriété columnMapping.groupedTasksColumns est définie, chaque dimension doit définir le paramètre groupedTasksAggregation (ce paramètre ne doit pas être défini si la propriété columnMapping.groupedTasksColumns n'est pas définie), les agrégations de tâches groupées suivantes sont valides : "FIRST", "LAST". Pour plus d'informations sur les tâches groupées, clickez ici.
- columnMapping.metricsInformationList (String) : Informations sur les colonnes Metric. Les informations doivent être données par l'utilisateur avec un format JSON. Le columnIndex doit être un Int >= 0, le columnName doit être une chaine de caractère de taille minimum 1. IsCaseScope est un booléen obligatoire utile pour déterminer si pour un évenement, la valeur de la colonne est calculée en fonction d'une agrégation sur le cas complet. Pour la Metric, les types d'agrégation suivants sont disponibles : "FIRST", "LAST", "MIN", "MAX", "SUM", "AVG", "MEDIAN", le type de l'agrégation choisie est défini avec le paramètre aggregation. Notez que si isCaseScope vaut true, vous devez donner un type d'agrégation, et que si il est false, vous avez le choix entre écrire ou non le paramètre aggregation. Quand la propriété columnMapping.groupedTasksColumns est définie, chaque metrique doit définir le paramètre groupedTasksAggregation (ce paramètre ne doit pas être défini si la propriété columnMapping.groupedTasksColumns n'est pas définie), les agrégations de tâches groupées suivantes sont valides : "FIRST", "LAST", "MIN", "MAX", "SUM", "AVG", "MEDIAN". Pour plus d'informations sur les tâches groupées, clickez ici. Enfin, Le paramètre unit doit être un String et est facultatif (il est possible de ne renseigner que le columnIndex, le columnName et le isCaseScope).
- columnMapping.groupedTasksColumns (String) : Informations sur les colonnes à utiliser pour regrouper des événements. Les informations doivent être données par l'utilisateur avec un format JSON. Si cette propriété n'est pas définie, les événements similaires ne sont pas groupés, mais si elle est définie, elle doit contenir au moins l'index d'une colonne de temps/dimension/metrique. Quand cette propriété est définie, toutes les dimensions (propriété columnMapping.dimensionsInformationList) et metriques (propriété columnMapping.metricsInformationList) doivent définir un groupedTasksAggregation. Pour plus d'informations sur les tâches groupées, clickez ici.
- csv.endOfLine (String) : Le caractère de fin de ligne (taille >= 1)
- csv.escape (String) : Le caractère d'échappement (1 seul caractère)
- csv.comment (String) : Le caractère de commentaire (1 seul caractère)
Pour le Column Mapping, tous les index des colonnes définies doivent être différents et le nombre de colonnes doit être égal à la valeur de la propriété obligatoire csv.fieldsNumber.
De plus, les caractères '{' '}' ';' et ',' pour le format des colonnes Time peuvent être modifiés dans le fichier com/logpickr/kafka/sink/main/Constants
SI csv.header est true, et que le connecteur doit créer un Column Mapping , les headers utiliseront les informations du Column Mapping . Sinon, si csv.header est true, mais que le connecteur ne crée pas deColumn Mapping, les headers correspondront à la succession des csv.fieldsNumber - 1 séparés par csv.separator
Les propriétés suivantes ne doivent être définies que si l'on souhaite logger les événements dans kafka :
- kafkaLoggingEvents.isLogging (Boolean) : Indique si le connecteur enregistre ou non ses événements (true/false), si true les événements seront tracés dans un topic kafka, si false (default ) ils ne le seront pas
- kafkaLoggingEvents.topic (String) : Nom du Kafka topic d'enregistrement des événements (taille >= 1)
Format AVRO
Pour que les données bufferisées ne soient pas trop grosses, le format AVRO est utilisé, et il est important de le conserver dans ksqlDB (à partir du moment où plusieurs événements sont agrégés ensembles). De ce fait, le connecteur s'attend à recevoir des données au format AVRO
Chaque record reçu d'un topic Kafka doit être de la forme suivante (vérifié à l'aide d'un schéma que l'on compare au record AVRO reçu) :
ARRAY<STRUCT<columnID INT, text VARCHAR, quote BOOLEAN>>
L' Array correspond à un événement (qui correspond à une ligne du fichier CSV), chaque STRUCT correspond à une colonne de l'événement (ex: caseId ou activité)
Un record Kafka correspond à un événement , et le connector aggrège plusieurs événements. Lorsqu'une limite est atteinte, les événements sont simultanément envoyés à l'API Logpickr
Chaque colonne est constitué de:
- son numéro de colonne (columnId),
- sa valeur (text)
- La valeur doit-elle être entourée des caractères de quote (quote)
Les données d'exemple provenant d'un Kafka topic (representées ici au format JSON) :
"{"DATAARRAY":
[{"QUOTE":true, "TEXT":"activity1", "COLUMNID":1},
{"QUOTE":false, "TEXT":"caseId1", "COLUMNID":0},
{"QUOTE":false, "TEXT":"endDate1", "COLUMNID":3}]
}"
seront envoyées par le biais d'un fichier CSV :
caseId1,"activity1",null,endDate1
en suivant les propriétés suivantes du connecteur :
- csv.separator = ,
- csv.quote = "
- csv.defaultTextValue = null
- csv.fieldsNumber = 4
Attention : Il est important de noter que les noms DATAARRAY, QUOTE, TEXT et COLUMNID doivent être conservés en ksqlDB afin de lire correctement les données AVRO
Toute valeur nulle pour un événement, une valeur d'un événement, ou un paramètre d'une valeur d'un événement, seront considérés comme une erreur et stopperont la tache de traitement du connecteur.
Tâches groupées
Lorsque l'on définit le Column Mapping (quand columnMapping.create vaut true), nous pouvons aussi définir de manière facultative, avec la propriété columnMapping.groupedTasksColumns, un ensemble de colonnes à utiliser pour regrouper ensemble des événements qui ont des valeurs identiques (dans les colonnes définies). Les événements sont groupés à l'intérieur de leur cas, et des agrégations doivent être définies pour les dimensions et les métriques.
L'idée de cette fonctionnalité est de regrouper plusieurs événements similaires en un seul événement.
Exemple de tâches groupées
Prennons les événements suivants à titre d'exemple :
CaseId | Activité | Début | Fin | Pays | Ville | Prix |
---|---|---|---|---|---|---|
1 | A | 10/10/10 08:38 | 11/10/10 08:38 | France | Paris | 10 |
1 | B | 10/10/10 09:40 | 11/10/10 09:40 | Allemagne | Berlin | 20 |
1 | A | 10/10/10 10:42 | 11/10/10 10:42 | France | Toulouse | 30 |
1 | C | 10/10/10 11:50 | 11/10/10 11:50 | Allemage | Munich | 10 |
1 | C | 10/10/10 12:50 | 11/10/10 12:50 | Allemagne | Hamburg | 20 |
2 | A | 10/10/10 08:20 | 11/10/10 08:20 | France | Rennes | 5 |
2 | B | 10/10/10 09:30 | 11/10/10 09:30 | Allemagne | Berlin | 10 |
2 | A | 10/10/10 10:40 | 11/10/10 10:40 | France | Bordeaux | 25 |
2 | A | 10/10/10 11:50 | 11/10/10 11:50 | USA | New York | 10 |
Et disons que les propriétés liées au column mapping du connecteur ressemblent à ça :
columnMapping.create = "true",
columnMapping.caseIdColumnIndex = "0",
columnMapping.activityColumnIndex = "1",
columnMapping.timeInformationList = "{2;dd/MM/yy HH:mm},{3;dd/MM/yy HH:mm}",
columnMapping.dimensionsInformationList = "[{"columnIndex": 4, "name": "Pays", "isCaseScope": false, "groupedTasksAggregation": "FIRST"},{"columnIndex": 5, "name": "Ville", "isCaseScope": false, "groupedTasksAggregation": "FIRST"}]",
columnMapping.metricsInformationList = "[{"columnIndex": 6, "name": "Prix", "unit": "Euros", "isCaseScope": true, "aggregation": "MIN", "groupedTasksAggregation": "AVG"}]",
columnMapping.groupedTasksColumns = "[1, 4]"
Ici les colonnes à utiliser pour le regroupement sont celles qui correspondent aux indexes 1 et 4, qui sont respectivement les colonnes Activité et Pays. Elles sont définies au travers de la propriété columnMapping.groupedTasksColumns
Quand columnMapping.groupedTasksColumns est défini, nous devons aussi définir l'argument groupedTasksAggregation pour chaque dimension/metrique. Avec cet exemple, voici les agrégations de tâches groupées définies pour les colonnes de dimension et metrique. * FIRST pour la colonne de dimension Pays * FIRST pour la colonne de dimension Ville * AVG pour la colonne de metrique Prix
Pour les colonnes de dimension les aggrégations de tâches groupées valides sont FIRST/LAST
Pour les colonnes de metrique, les aggrégations de tâches groupées valides sont FIRST/LAST/MIN/MAX/SUM/AVG/MEDIAN
Par conséquent, à l'intérieur d'un cas, tous les événements qui ont les mêmes valeurs pour les colonnes Activité et Pays seront regroupés ensemble, et les nouvelles valeurs pour les colonnes de dimension et de métrique sont calculées en fonction de l'argument groupedTasksAggregation associé à chaque colonne.
Si les colonnes de temps ne sont pas définies dans les colonnes à utiliser pour le regroupement (ici les colonnes d'index 2 et 3 ne sont pas définies dans la propriété columnMapping.groupedTasksColumns), nous n'avons pas à définir d'agrégation comme pour les dimensions ou métriques: * La date la plus petite parmi tous les événements d'un groupe sera utilisée comme la nouvelle date de début par le nouvel événement unique. * La date la plus grande parmi tous les événements d'un groupe sera utilisée comme la nouvelle date de fin par le nouvel événement unique.
Après la création du connecteur, un projet Mining qui a le column mapping défini au dessus va recevoir ces événements et va les regrouper de la façon suivante :
Pour le CaseId 1: * Les premier et troisième événements de ce cas ont les mêmes valeurs pour leurs colonnes Activité (A) et Pays (France). De ce fait, ils sont groupés ensemble pour ne faire qu'un seul événement de tâche A et de pays France. * Le second événement de ce cas n'est pas groupé. En effet, aucun autre événement de ce cas n'a de tâche nommée B et de pays nommé Allemagne. * Les quatrième et cinquième événements de ce cas ont les mêmes valeurs pour leurs colonnes Activité (C) et Pays (Allemagne). De ce fait, ils sont groupés ensemble pour ne faire qu'un seul événement de tâche C et de pays Allemagne.
Pour le CaseId 2: * Les premier et troisième événements de ce cas ont les mêmes valeurs pour leurs colonnes Activité (A) et Pays (France). De ce fait, ils sont groupés ensemble pour ne faire qu'un seul événement de tâche A et de pays France. * Le second événement de ce cas n'est pas groupé. En effet, aucun autre événement de ce cas n'a de tâche nommée B et de pays nommé Allemagne. * Le quatrième événement de ce cas n'est pas groupé. Il a la même Activité (A) que les premier et troisième événements du cas, mais son Pays (USA) est différent.
Après le regroupement des événements similaires, on obtient cette nouvelle liste d'événements :
CaseId | Activité | Début | Fin | Pays | Ville | Prix |
---|---|---|---|---|---|---|
1 | A | 10/10/10 08:38 | 11/10/10 10:42 | France | Paris | 20 |
1 | B | 10/10/10 09:40 | 11/10/10 09:40 | Allemagne | Berlin | 20 |
1 | C | 10/10/10 11:50 | 11/10/10 12:50 | Allemagne | Munich | 15 |
2 | A | 10/10/10 08:20 | 11/10/10 10:40 | France | Rennes | 15 |
2 | B | 10/10/10 09:30 | 11/10/10 09:30 | Allemagne | Berlin | 10 |
2 | A | 10/10/10 11:50 | 11/10/10 11:50 | USA | New York | 10 |
Pour le CaseId 1: * Le premier événement de ce cas dans la nouvelle liste d'événements a été créé par regroupement des premier et troisième événements de ce cas dans la liste initiale d'événements (celle avant regroupement). * CaseId valait 1 pour les deux événements qui ont été regroupés, donc la valeur reste à 1 pour le nouvel événement unique. * Activité valait A pour les deux événements qui ont été regroupés, donc la valeur reste à A pour le nouvel événement unique. * Début valait 10/10/10 08:38 pour le premier événement qui a été groupé, et 10/10/10 10:42 pour le second. La date la plus petite (10/10/10 08:38) est donc utilisée en tant que date de début pour le nouvel événement unique. * Fin valait 11/10/10 08:38 pour le premier événement qui a été groupé, et 11/10/10 10:42 pour le second. La date la plus grande (11/10/10 10:42) est donc utilisée en tant que date de fin pour le nouvel événement unique. * Pays valait France pour les deux événements qui ont été regroupés, donc la valeur reste à France pour le nouvel événement unique. * Ville valait Paris pour le premier événement qui a été groupé, et Toulouse pour le second. Dans le column mapping, FIRST a été définie en tant que groupedTasksAggregation pour cette dimension, par conséquent, comme Paris était la première valeur, c'est celle utilisée pour le nouvel événement unique. * Prix valait 10 pour le premier événement qui a été groupé, et 30 for le second. Dans le column mapping, AVG a été définie en tant que groupedTasksAggregation pour cette métrique, par conséquent, 20 est la valeur de cette métrique pour le nouvel événement unique (20 étant le résultat de la moyenne entre 10 et 30). * Le second événement de ce cas dans la nouvelle liste d'événements est identique au second événement de ce cas dans la liste initiale d'événements (celle avant regroupement), puisqu'il n'était pas possible de le regrouper avec d'autres événements. * Le troisième événement de ce cas dans la nouvelle liste d'événements a été créé par regroupement des quatrièmes et cinquième événements de ce cas dans la liste initiale d'événements (celle avant regroupement). * CaseId valait 1 pour les deux événements qui ont été regroupés, donc la valeur reste à 1 pour le nouvel événement unique. * Activité valait C pour les deux événements qui ont été regroupés, donc la valeur reste à C pour le nouvel événement unique. * Début valait 10/10/10 11:50 pour le premier événement qui a été groupé, et 10/10/10 12:50 pour le second. La date la plus petite (10/10/10 11:50) est donc utilisée en tant que date de début pour le nouvel événement unique. * Fin valait 11/10/10 11:50 pour le premier événement qui a été groupé, et 11/10/10 12:50 pour le second. La date la plus grande (11/10/10 12:50) est donc utilisée en tant que date de fin pour le nouvel événement unique. * Pays valait Allemagne pour les deux événements qui ont été regroupés, donc la valeur reste à Allemagne pour le nouvel événement unique. * Ville valait Munich pour le premier événement qui a été groupé, et Hamburg pour le second. Dans le column mapping, FIRST a été définie en tant que groupedTasksAggregation pour cette dimension, par conséquent, comme Munich était la première valeur, c'est celle utilisée pour le nouvel événement unique. * Prix valait 10 pour le premier événement qui a été groupé, et 20 for le second. Dans le column mapping, AVG a été définie en tant que groupedTasksAggregation pour cette métrique, par conséquent, 15 est la valeur de cette métrique pour le nouvel événement unique (15 étant le résultat de la moyenne entre 10 et 20).
Pour le CaseId 2: * Le premier événement de ce cas dans la nouvelle liste d'événements a été créé par regroupement des premier et troisième événements de ce cas dans la liste initiale d'événements (celle avant regroupement). * CaseId valait 2 pour les deux événements qui ont été regroupés, donc la valeur reste à 2 pour le nouvel événement unique. * Activité valait A pour les deux événements qui ont été regroupés, donc la valeur reste à A pour le nouvel événement unique. * Début valait 10/10/10 08:20 pour le premier événement qui a été groupé, et 10/10/10 10:40 pour le second. La date la plus petite (10/10/10 08:20) est donc utilisée en tant que date de début pour le nouvel événement unique. * Fin valait 11/10/10 08:20 pour le premier événement qui a été groupé, et 11/10/10 10:40 pour le second. La date la plus grande (11/10/10 10:40) est donc utilisée en tant que date de fin pour le nouvel événement unique. * Pays valait France pour les deux événements qui ont été regroupés, donc la valeur reste à France pour le nouvel événement unique. * Ville valait Rennes pour le premier événement qui a été groupé, et Bordeaux pour le second. Dans le column mapping, FIRST a été définie en tant que groupedTasksAggregation pour cette dimension, par conséquent, comme Rennes était la première valeur, c'est celle utilisée pour le nouvel événement unique. * Prix valait 5 pour le premier événement qui a été groupé, et 25 for le second. Dans le column mapping, AVG a été définie en tant que groupedTasksAggregation pour cette métrique, par conséquent, 15 est la valeur de cette métrique pour le nouvel événement unique (15 étant le résultat de la moyenne entre 5 et 25). * Le second événement de ce cas dans la nouvelle liste d'événements est identique au second événement de ce cas dans la liste initiale d'événements (celle avant regroupement), puisqu'il n'était pas possible de le regrouper avec d'autres événements. * Le troisième événement de ce cas dans la nouvelle liste d'événements est identique au quatrième événement de ce cas dans la liste initiale d'événements (celle avant regroupement), puisqu'il n'était pas possible de le regrouper avec d'autres événements.
Cette nouvelle liste d'événements est ensuite utilisée en tant que donnée dans le projet de Mining.
Remarque : Si pour la même liste initiale d'événements vous ne voulez pas regrouper les événements ensemble, le column mapping devrait être :
columnMapping.create = "true",
columnMapping.caseIdColumnIndex = "0",
columnMapping.activityColumnIndex = "1",
columnMapping.timeInformationList = "{2;dd/MM/yy HH:mm},{3;dd/MM/yy HH:mm}",
columnMapping.dimensionsInformationList = "[{"columnIndex": 4, "name": "Pays", "isCaseScope": false},{"columnIndex": 5, "name": "Ville", "isCaseScope": false}]",
columnMapping.metricsInformationList = "[{"columnIndex": 6, "name": "Prix", "unit": "Euros", "isCaseScope": true, "aggregation": "MIN"}]"
Remarques liées au Column Mapping pour les tâches groupées
- Une erreur apparaitra à la création du connecteur si la propriété columnMapping.groupedTasksColumns est définie mais ne contient pas au moins un index d'une colonne de temps, ou de dimension, ou de metrique.
- Une erreur apparaitra à la création du connecteur si la propriété columnMapping.groupedTasksColumns est définie mais pas l'argument groupedTasksAggregation de toutes les dimensions et/ou metriques.
-
Une erreur apparaitra à la création du connecteur si la propriété columnMapping.groupedTasksColumns n'est pas définie mais qu'au moins une dimension/metrique a défini son argument groupedTasksAggregation.
-
Si la propriété columnMapping.groupedTasksColumns est définie sans l'index de la colonne d'activité, le connecteur ajoutera automatiquement cet index à l'ensemble des indexes de colonnes à utiliser pour le regroupement des tâches.
- Si la propriété columnMapping.groupedTasksColumns est définie avec l'index de la colonne de caseId, le connecteur supprimera automatiquement cet index à l'ensemble des indexes de colonnes à utiliser pour le regroupement des tâches.