Dataset Updates
Bestaande Datasets Bijwerken
Werk bestaande datasets bij met nieuwe gegevens uit CSV-bestanden, ZIP-pakketten of binaire bestanden. Updates behouden de dataset-ID en bijbehorende configuraties.
Dataset Bijwerken vanaf CSV
PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/csv
Vervangt de gegevens in een bestaande dataset door nieuwe gegevens uit een CSV-bestand. Het systeem detecteert automatisch de kolomtoewijzingen uit de datasetconfiguratie.
Padparameters
| Parameter | Type | Verplicht | Beschrijving |
|---|---|---|---|
tenantId |
GUID | Ja | De tenant-identificatie |
projectId |
GUID | Ja | De projectidentificatie |
datasetId |
GUID | Ja | De dataset-identificatie die bijgewerkt moet worden |
Request (multipart/form-data)
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
file |
file | Ja | CSV-bestand met nieuwe gegevens (max 1GB) |
cultureInfo |
string | Nee | Cultuur voor parsing (standaard: "en-US") |
Response (200 OK)
{
"datasetId": "550e8400-e29b-41d4-a716-446655440000",
"caseCount": 5500,
"eventCount": 165000,
"invalidValueCount": 0,
"skippedRowsCount": 0,
"errors": [],
"rowIssues": [],
"statusCode": 200
}
Foutresponses
Bad Request (400):
dataset with id '{datasetId}' not found
can't update '{datasetName}' because it's not an original dataset
Dataset Bijwerken vanaf ZIP-pakket
PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/package
Vervangt de gegevens in een bestaande dataset door nieuwe gegevens uit een ZIP-pakket.
Request (multipart/form-data)
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
file |
file | Ja | ZIP-pakketbestand met nieuwe data (max 1GB) |
cultureInfo |
string | Nee | Cultuur voor parsing (standaard: "en-US") |
Response (200 OK)
Zelfde structuur als CSV-update response.
Foutresponse (422 Unprocessable Entity)
{
"errors": ["Invalid package structure"],
"rowIssues": [
{
"rowIndex": 15,
"columnName": "Timestamp",
"errorType": "ParseError",
"outcome": "Skipped",
"message": "Unable to parse date value"
}
],
"statusCode": 422
}
Dataset Bijwerken vanaf Binary
PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/binary
Vervangt de gegevens in een bestaande dataset door nieuwe gegevens uit een binaire bestand.
Request (multipart/form-data)
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
file |
file | Ja | Binair bestand met nieuwe gegevens (max 1GB) |
Response (200 OK)
Zelfde structuur als CSV-update response.
Update Beperkingen
- Alleen Originele Datasets: Alleen originele datasets kunnen worden bijgewerkt. Datasets die zijn afgeleid van filters of andere transformaties kunnen niet direct worden bijgewerkt.
- Configuratie Behouden: Updates behouden de dataset-ID en alle bijbehorende configuraties (notebooks, blokken, enz.)
- Kolomconsistentie: De nieuwe data moet dezelfde kolomstructuur hebben als de originele dataset
Implementatie Voorbeelden
cURL - Update vanuit CSV
curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/550e8400-e29b-41d4-a716-446655440000/csv" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-F "file=@updated_event_log.csv" \
-F "cultureInfo=en-US"
cURL - Update vanuit ZIP-pakket
curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/550e8400-e29b-41d4-a716-446655440000/package" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-F "file=@updated_data_package.zip" \
-F "cultureInfo=en-US"
Python
import requests
TENANT_ID = '12345678-1234-1234-1234-123456789012'
PROJECT_ID = '87654321-4321-4321-4321-210987654321'
BASE_URL = 'https://your-mindzie-instance.com'
class DatasetUpdater:
def __init__(self, token):
self.headers = {'Authorization': f'Bearer {token}'}
def update_from_csv(self, dataset_id, file_path, culture='en-US'):
"""Update dataset from CSV file."""
url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/csv'
with open(file_path, 'rb') as f:
files = {'file': (file_path, f, 'text/csv')}
data = {'cultureInfo': culture}
response = requests.put(url, headers=self.headers, files=files, data=data)
if response.ok:
return response.json()
else:
raise Exception(f'Update failed: {response.text}')
def update_from_package(self, dataset_id, file_path, culture='en-US'):
"""Update dataset from ZIP package."""
url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/package'
with open(file_path, 'rb') as f:
files = {'file': (file_path, f, 'application/zip')}
data = {'cultureInfo': culture}
response = requests.put(url, headers=self.headers, files=files, data=data)
if response.ok:
return response.json()
elif response.status_code == 422:
result = response.json()
print(f"Validation errors: {result['errors']}")
for issue in result.get('rowIssues', []):
print(f" Row {issue['rowIndex']}: {issue['message']}")
raise Exception('Data validation failed')
else:
raise Exception(f'Update failed: {response.text}')
def update_from_binary(self, dataset_id, file_path):
"""Update dataset from binary file."""
url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/binary'
with open(file_path, 'rb') as f:
files = {'file': (file_path, f, 'application/octet-stream')}
response = requests.put(url, headers=self.headers, files=files)
if response.ok:
return response.json()
else:
raise Exception(f'Update failed: {response.text}')
# Gebruik
updater = DatasetUpdater('your-auth-token')
# Update vanuit CSV
result = updater.update_from_csv(
'550e8400-e29b-41d4-a716-446655440000',
'updated_event_log.csv'
)
print(f"Bijgewerkte dataset: {result['datasetId']}")
print(f"Nieuw aantal cases: {result['caseCount']}")
print(f"Nieuw aantal events: {result['eventCount']}")
# Controleer op problemen
if result['skippedRowsCount'] > 0:
print(f"Waarschuwing: {result['skippedRowsCount']} rijen zijn overgeslagen")
if result['invalidValueCount'] > 0:
print(f"Waarschuwing: {result['invalidValueCount']} ongeldige waarden gevonden")
JavaScript/Node.js
const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const PROJECT_ID = '87654321-4321-4321-4321-210987654321';
const BASE_URL = 'https://your-mindzie-instance.com';
class DatasetUpdater {
constructor(token) {
this.token = token;
}
async updateFromCsv(datasetId, file, culture = 'en-US') {
const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/${datasetId}/csv`;
const formData = new FormData();
formData.append('file', file);
formData.append('cultureInfo', culture);
const response = await fetch(url, {
method: 'PUT',
headers: { 'Authorization': `Bearer ${this.token}` },
body: formData
});
if (response.ok) {
return await response.json();
} else if (response.status === 422) {
const result = await response.json();
throw new Error(`Validatie mislukt: ${result.errors.join(', ')}`);
} else {
throw new Error(`Update mislukt: ${await response.text()}`);
}
}
async updateFromPackage(datasetId, file, culture = 'en-US') {
const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/${datasetId}/package`;
const formData = new FormData();
formData.append('file', file);
formData.append('cultureInfo', culture);
const response = await fetch(url, {
method: 'PUT',
headers: { 'Authorization': `Bearer ${this.token}` },
body: formData
});
if (response.ok) {
return await response.json();
} else {
const error = await response.json();
throw new Error(`Update mislukt: ${error.errors?.join(', ') || response.statusText}`);
}
}
}
// Gebruik (browser)
const updater = new DatasetUpdater('your-auth-token');
const fileInput = document.getElementById('updateFile');
fileInput.addEventListener('change', async (e) => {
const file = e.target.files[0];
const datasetId = '550e8400-e29b-41d4-a716-446655440000';
try {
const result = await updater.updateFromCsv(datasetId, file);
console.log(`Bijgewerkt: ${result.datasetId}`);
console.log(`Nieuwe cases: ${result.caseCount}`);
console.log(`Nieuwe events: ${result.eventCount}`);
if (result.skippedRowsCount > 0) {
console.warn(`Overslagen ${result.skippedRowsCount} rijen`);
}
} catch (error) {
console.error('Update mislukt:', error.message);
}
});
Response Velden
| Veld | Type | Beschrijving |
|---|---|---|
datasetId |
GUID | ID van de bijgewerkte dataset |
caseCount |
integer | Aantal unieke cases in de bijgewerkte gegevens |
eventCount |
integer | Totaal aantal events in de bijgewerkte gegevens |
invalidValueCount |
integer | Aantal aangetroffen ongeldige waarden |
skippedRowsCount |
integer | Aantal rijen overgeslagen vanwege fouten |
errors |
array | Lijst met foutmeldingen |
rowIssues |
array | Gedetailleerde informatie over problemen op rij-niveau |
statusCode |
integer | HTTP-statuscode |
Structuur van Rij-issue
{
"rowIndex": 15,
"columnName": "Timestamp",
"errorType": "ParseError",
"outcome": "Skipped",
"message": "Unable to parse date value '2024-13-45'"
}
| Veld | Beschrijving |
|---|---|
rowIndex |
Rij-nummer met het probleem |
columnName |
Kolom met de probleemwaarde |
errorType |
Type fout (ParseError, ValidationError, enz.) |
outcome |
Wat er gebeurde (Skipped, DefaultValue, enz.) |
message |
Menselijk leesbare foutbeschrijving |
Best Practices
- Maak Eerst Backup: Overweeg om de huidige data te exporteren voor updates
- Verifieer Structuur: Zorg dat de nieuwe data dezelfde kolomstructuur heeft
- Controleer Resultaten: Bekijk
rowIssuesenskippedRowsCountna updates - Test Eerst: Test updates eerst op een niet-productiedataset
- Culture-instellingen: Gebruik de correcte cultuur voor datum- en getalformaten