In CSV nicht mehr vorhandene SKU finden

Hallo,

wir bekommen von einem Drittanbieter eine CSV mit Produktdaten. Diese erzeugt über die Shopify-REST-API neue Produkte.
Nun kann es vorkommen, dass SKU aus der CSV entfernt werden. Aktuell prüfen wir das mit einem Mapper:

<#list meta.spreadsheet@SpreadsheetCSVReader_1.getRows() as row>
  <#if row.get("Variant SKU")?trim == variant_sku!?trim>${row.get("Variant SKU")?trim}</#if>
</#list>

Soweit, so gut.

Allerdings habe ich das Gefühl, dass dies nicht sehr performant ist, da sich die Laufzeit verdoppelt hat. (Unabhängig davon wurde die CSV erweitert, so dass wir nun bei der vierfachen Laufzeit sind) Außerdem sind wir beim letzten Run auf folgenden Fehler gestoßen:

Error reading file: dbs_feed_file_03.09.2022_0320.csv (Root Causes: NoSuchFileException: /[…]/dbs_feed_file_03.09.2022_0320.csv): <#list meta.spreadsheet@SpreadsheetCSVReader_1.getRows() as row>

Ich vermute die Laufzeit von > 6h als Ursache.

Gib es einen schnelleren Weg, alte SKU zu finden? Am besten ohne neue Datastores und/oder Datenbankzeilen zu benötigen.

Vielen Dank.

Gruß David

Da liegst du richtig.

Kannst du noch mal beschreiben, welche Daten du hier mit welchen vergleichst und wo die herkommen?
In der list-Anweisung erkennt man einen CSVReader (der vermutlich die CSV-Datei des Lieferanten ist.
Und welche Daten bekommt der Mapper?

Um es vorweg zu nehmen.
Die übliche Art ist das hier: Flow: Wie finde ich Datensätze, die gestern importiert wurden, aber heute nicht mehr mit mitkommen? (Delta)

Dazu merkt man sich alle Artikel des Lieferanten im Datastore, um dann zu erkennen (per Querverweis) wenn etwas nicht mehr geschickt wird.

Irgendwo muss man sich merken, was „beim letzten mal“ kam.
Denkbar wäre alternativ auch, dass du dir die CSV-Datei vom letzten mal auf einem FTP merkst.
Statt einer sehr unperformanten list-Anweisung würden wir eher zu einem KeyValueSpreadsheet raten (das kann man sich wie ein Querverweis, aber für beliebige Spreadsheets vorstellen). Das ist technisch gesehen eine HashMap, die exorbitant schneller ist im Vergleich zu einer list-Anweisung pro Zeile. Damit kannst du quasi pro Zeile herausfinden, ob die ID in der KeyValueSpreadsheet-Map ist oder nicht (im Sinne von existiert / existiert nicht mehr)
Das KeyvalueSpreadsheet ist auf 300kB limitiert. Wenn du das quasi nur mit kleinen ID-Spalten machst, solltest du damit mehrere tausend Zeilen hinbekommen.

Wieviele Zeilen hat denn das Spreadsheet ca., um das es hier geht?

Hallo,

Genau, SpreadsheetCSVReader_1 liest die Drittanbieter-CSV mit Produktdaten ein. Der Mapper ist ein gefiltertes SearchDatastore.

Das hatte ich auch schon gefunden, leider ist unser Flow so aufgebaut, dass die CSV-Daten eingelesen werden, dann an Shopify gehen und danach die Varianten-Daten in den Datastore (separater Flow) geschrieben werden.

Soweit ich sehen kann, steht das schon in einem Datastore. Möglicherweise sind meine Kenntnisse über SpreadsheetDatastoreWriter noch unzureichend.

Rund 15000.

Gruß David

Hallo @SWMH-david-conlabz,

wenn du schreibst, dass es schon einen Datastore gibt in dem die ganzen Produkte stehen, irgend ein Eintrag muss auch die SKU sein, kannst du folgendes tun:

Als Zwischenschritt kannst du einen SearchDatastore machen, mit den ganzen Artikeln + SKU.

Danach verwendest du einen SpreadsheetAppend mit dem SearchDatastore und der CSV Datei.

Als nächstes nimmst du einen Mapper mit dem Input des SpreadsheetAppend und gruppierst anhand der SKU.

In einer Hilfsspalte verwendest du die Aggregatfunktion „Zeilen zählen“. Wenn nun der Wert ‚1‘ ausgegeben wird, sollte das eine gelöschte SKU sein, da diese nur noch im Datastore vorhanden ist.

Anschließend kannst du ja noch nach dem Wert filtern.

Ist es das was du gesucht hast?

Viele Grüße
Lukas

Hallo Lukas,

habe die Anpassung vorgenommen und konnte die Laufzeit der Stepgruppe von >3h auf <10m reduzieren. Das passt erstmal so. Vielen Dank.

Gruß David

1 „Gefällt mir“