HashMergePreparser
Gruppe |
|
Funktion |
Der HashMergePreparser gleicht Datensätze einer CSV-Datei, oder Datenbank-Abfrage mit einer separaten Datenbank-Tabelle ab und prüft, ob Datensätze neu sind, oder sich seit dem letzten Lauf verändert haben. |
Konfigurationsdatei |
sample_HashMergePreparser.properties und evtl. sql_input_sample.properties (eingelesen mit Cron Job → Datei, falls mode=sql). |
Beschreibung
Der HashMergePreparser gleicht Datensätze einer CSV-Datei, oder Datenbank-Abfrage mit einer separaten Datenbank-Tabelle ab und prüft, ob Datensätze neu sind, oder sich seit dem letzten Lauf verändert haben. Dazu wird zu einem angegebenen Key eine Art Prüfsumme (Hashwert) über den ganzen Satz erzeugt und mit bestehenden Einträgen in der Tabelle verglichen. Existiert der Key noch nicht, wird der Satz als neu gekennzeichnet. Ist für den Key bereits ein Hashwert vorhanden, wird der Wert verglichen und so geprüft, ob sich im Satz etwas geändert hat. Falls ja, wird der Satz als geändert gekennzeichnet, falls nicht, wird der Satz nicht an das Mapping weiter gegeben und aus der Datei (bzw. dem Resultset des Selects) entfernt.
Parameter
Folgende Parameter stehen zur Konfiguration zur Verfügung.
Parameter |
Beschreibung |
debug |
(optional) Falls true, wird ein ausführliches Log geschrieben. Default: false |
delimiter |
(optional) gibt das Trennzeichen der CSV-Datei an. Default: , |
encoding |
(optional) gibt den Zeichensatz an, mit der die Datei gelesen und geschrieben wird. Default: utf8 |
excludeColumnsForHash |
(optional) Es können Spalten angegeben werden, die ignoriert werden bei der Erzeugung des Hashwerts (Index beginnend bei 0). Beispiel: excludeColumnsForHash=3,5,7 |
hashAlias |
Der Datenbank-Alias (wie in database.xml definiert) für die Hash-Tabelle. |
hasHeadLine |
(optional) Gibt an, ob CSV-Datei eine Kopfzeile hat. Default: true |
hashInsertStatement |
Das Insert-Statement, um neue Hashwerte hinzuzufügen. |
hashMethod |
(optional) gibt die Hash-Berechnungsmethode an (z. B. MD5, SHA1, etc). Default: MD5 |
hashSelectQuery |
Das SQL-Select Statement (siehe unten). |
hashSelectQueryBatchSize |
Anzahl der Sätze, die in ein Datenblatt geschrieben werden. |
hashUpdateStatement |
Das Update-Statement, um vorhandene Hashwerte zu ändern. |
idColumnIndex |
(wichtig für mode=csv, beginnend bei 0) gibt an, in welcher Spalte der CSV-Datei der Key steht. Bei mode=sql wird das Property sourceIdColumn in der Datei sql_input_sample.properties dafür verwendet. |
includeNew |
(optional) Falls true, werden neue Einträge an das Mapping übergeben. Default: true |
includeOriginal |
(optional) Falls true, werden auch Einträge an das Mapping übergeben, die sich nicht geändert haben. Default: true |
includeUpdated |
(optional) Falls true, werden geänderte Einträge an das Mapping übergeben. Default: true |
mode |
Mögliche Werte sind csv und sql (siehe unten). |
quote |
(optional) gibt das Quote-Zeichen an. Default: " |
splitHeaderToken |
(optional) Diese Trennzeile wird eingefügt, falls useFileSplitter den Wert true hat. Default: header! |
useFileSplitter |
(optional) Falls true, wird nach einer bestimmten Anzahl von Sätzen (Parameter hashSelectQueryBatchSize) eine Trennzeile (Parameter splitHeaderToken) eingefügt, um die Datei auf mehrere Datenblätter aufteilen zu können. Default: true |
writeHeadLine |
(optional) gibt an, ob die Überschrift (falls vorhanden) in die erzeugte Datei geschrieben wird. Default: true |
Beispiel
hashSelectQuery
Das SQL-Select-Statement, um die gespeicherten Hashwerte zu überprüfen.
Wichtiger Hinweis: Hierbei muss die Abfrage mit dem IN-Operator aufgebaut werden (siehe Beispiel-Datei unten).
CSV/SQL Mode
Gibt an, ob die Daten anhand einer SQL-Abfrage, oder als CSV-Datei eingelesen werden. Ist mode=csv, muss im Parameter idColumnIndex angegeben werden, welche Spalte den Schlüsselwert (Id/Key) enthält. Bei mode=sql wird das Property sourceIdColumn in der Datei sql_input_sample.properties dafür verwendet. Wird mode=sql verwendet, muss die dort ausgelesene Tabelle (hier shipmentstatus) natürlich schon vorhanden sein und gegebenenfalls auch mit Daten gefüllt sein.
Hinweis: Wird die zeitgesteuerte eigene Klasse DefaultFileSQLCron verwendet, muss mode=csv eingetragen werden.
sql_input_sample.properties
Diese Datei konfigurieren, wenn Datensätze aus einer bestehenden Datenbank auf Veränderungen geprüft werden sollen (mode=sql). In diesem Fall bitte bedenken, dass die Datei sql_input_sample.properties (zusätzlich zur Konfigurationsdatei sample_HashMergePreparser.properties) über Cron Job → Datei angegeben werden muss.
Ergebnis des Preparsers
Als Ergebnis werden den Eingangsdaten, also den Daten aus der CSV-Datei, oder dem SQL-Select (hier aus Tabelle shipmentstatus), zwei zusätzliche Spalten action (N=new,U=updated) und hash vorangestellt. Diese müssen in der Quellstruktur hinzugefügt werden. Über die Parameter includeNew=false und includeUpdated=false kann ein Voranstellen auch unterbunden werden.
Tabelle für Hashwerte erstellen
CREATE
TABLE
shipmentstatus_hashwert (
sendungsid
VARCHAR
(20)
NOT
NULL
,
hashvalue
VARCHAR
(100)
NOT
NULL
,
PRIMARY
KEY
(sendungsid)
)
COLLATE
=
'utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=
DEFAULT
Hinweis: Für MySQL.
Beispiele für die Konfigurationsdateien
###################################################
# hash calculation method like MD5, SHA1, etc.
# default: MD5
hashMethod=MD5
###################################################
###################################################
# identfies if head line should be written, if available
#
# default=true
writeHeadLine=true
###################################################
###################################################
#include N lines in output csv
includeNew=true
#include U lines in output csv
includeUpdated=true
#exclude O lines from output csv
includeOriginal=false
###################################################
###################################################
# io encoding
# default: utf8
encoding=utf8
###################################################
###################################################
# log debug messages
# default=false
debug=false
###################################################
###################################################
# fetch mode: csv|sql|auto
#
# csv mode:
# Input is a CSV File which will be parsed
# sql mode:
# Input is a Properties File with sql config
# auto mode:
# tries sql mode first, then csv mode
# required
mode=sql
###################################################
###################################################
# csv i/o configuration
#
# Delimiter character
# default=,
delimiter=,
#
# Quote character
# default="
# quote=
#
# useFileSplitter
# insert splitHeaderToken before each 100 lines (hashSelectQueryBatchSize)
# default=true
useFileSplitter=true
#
# splitHeaderToken
# default=header!
splitHeaderToken=header!
###################################################
###################################################
# Hash storage settings
###################################################
# Datawizard database alias
# required
hashAlias=test
#
###################################################
# SQL select query to fetch the stored hash
# value by given id
# required, has to return a single column
hashSelectQueryBatchSize=100
hashSelectQuery=SELECT sendungsid, hashvalue FROM shipmentstatus_hashwert WHERE sendungsid in ( @0:s@ )
###################################################
#
###################################################
# insert hash sql statement with 2 parameters
# not required
hashInsertStatement=INSERT INTO shipmentstatus_hashwert ( sendungsid, hashvalue ) VALUES ( @0:s@, @1:s@ )
###################################################
#
###################################################
# update hash sql statement with 2 parameters
# not required
hashUpdateStatement=UPDATE shipmentstatus_hashwert SET hashValue = @1:s@ WHERE sendungsid = @0:s@
###################################################
###################################################
# index of the id Column in csv mode
# required in csv input mode
idColumnIndex=1
###################################################
# identifies if csv source has a head line
# default=true
hasHeadLine=true
###################################################
###################################################
# sql mode configuration file
###################################################
###################################################
# Specifies the count of rows in memory
# while fetching data
# default=100
pageSize=100
###################################################
###################################################
# Datawizard database alias
# required
sourceAlias=test
###################################################
###################################################
# result id column name
sourceIdColumn=sendungsid
###################################################
###################################################
# the sql query to fetch input data
# required
sourceQuery=SELECT * FROM shipmentstatus
###################################################