Progettazione del sistema: Importazioni CSV molto grandi ogni mese

7

Abbiamo una webapp che si affiderà a CSV di grandi dimensioni da fornitori esterni ogni mese. Quando dico grande, stiamo guardando circa 6 GB in modo da qualche milione di righe. Probabilmente, 2-5 CSV. Questa webapp consentirà inoltre agli utenti di inserire, correggere e segnalare / cancellare i dati. Il numero di colonne e la pulizia dei dati non sono garantiti dal punto di vista del fornitore. Inoltre, i dati potrebbero sovrapporsi (non possiamo mostrare dati sovrapposti nella nostra webapp).

Ho pensato a diversi modi per avvicinarti a questo:

  1. Carica questi CSV in una tabella per CSV che corrisponde alle intestazioni di colonna e quindi creare "viste" di ciò di cui abbiamo bisogno.

Questa soluzione sembra essere la più facile da implementare e gestire perché possiamo importare il CSV ogni mese nelle tabelle CSV e le cose funzionano. Sembra il meno efficiente e avrebbe i maggiori problemi con l'integrità dei dati. Inoltre, il punto di vista sarebbe Hella Complex.

  1. Carica questi CSV nel nostro schema ogni mese e crea la nostra webapp al di fuori del nostro schema.

Questa soluzione sembra essere più difficile da implementare e mantenere perché quando l'importazione arriva ogni mese, dovrai eseguire l'importazione e questo potrebbe rompere i tuoi dati esistenti. Sarebbe il meglio che la tua webapp sia il tuo schema e puoi semplicemente "mappare" su di essa. Inoltre, i CSV conterranno dati che invalideranno i dati più vecchi, quindi sarà difficile aggiornarli. Se dovessi seguire questa strada, faresti l'importazione in Java / C # o SQL? Sembra che Java / C # abbia senso in modo che possiamo elaborare le nostre regole aziendali ma è più lento ...

  1. Carica CSV in una tabella per CSV ed esegui solo query SQL per la webapp per creare modelli che soddisfino ciò di cui ha bisogno la webapp.

Questa soluzione ha lo stesso problema della soluzione di visualizzazione, tranne per il fatto che le tue query SQL sono di tipo Hella e tu hai il problema di gestirle. Se il fornitore esterno modifica lo schema, potrebbe interrompere le query SQL, anche se dovresti cambiare semplicemente il CSV prima di importarlo in modo che corrisponda all'importatore.

Quindi abbiamo queste domande:

  1. Se un utente aggiorna una riga popolata dal CSV, diciamo che stiamo andando con il n. 2, che è quello a cui mi sto appoggiando, in che modo possiamo mantenere quell'aggiornamento quando arrivano i CSV?

    1. In che modo possiamo eseguire il rollback di un'importazione CSV? E se pensassimo che l'importazione CSV è valida per 1 mese e ora abbiamo un sacco di dati generati dagli utenti per quel CSV?

Sembra che non ci sia una soluzione banale e in entrambi i casi devo "prenderlo". Mi sto perdendo qualcosa? Qualcuno può trovare o pensare a una soluzione banale?

    
posta user2370642 04.03.2018 - 22:19
fonte

3 risposte

7

"CSV" non è la parola giusta per ciò che ti consegna. È il formato che ti consegna e con garanzie molto deboli. La maggior parte delle persone fa riferimento a un file CSV da 6 GB con dati inaffidabili e mancanti semplicemente come "i dati" e ritengo che sia più accurato qui. Hai un fornitore che ti mette a disposizione alcuni dati e sei responsabile di servirlo in qualche modo ai tuoi clienti.

Load these CSVs into our own schema each month and build our webapp off of our own schema.

Questo sembra il migliore Stai applicando la logica aziendale ai dati forniti per mantenerne l'integrità e le prestazioni. Il tuo fornitore ti offre garanzie molto deboli e offri ai tuoi clienti forti garanzie. Il formato che ti danno è una lunga stringa. In qualsiasi intervista tecnologica, se chiedono di creare un accesso persistente a una stringa lunga, la risposta è di pre-elaborarla, che è ciò che questa tua proposta è.

Dovresti dare per scontato che i tuoi utenti chiederanno ulteriori funzionalità su come interfacciare i dati. Forse vogliono un pulsante di annullamento o un registro di controllo, che richiedono entrambi di avere i propri dati (meta) proprietari.

Confrontalo con un caso in cui mettono a disposizione i dati in un formato pulito o funzionale, ad es. un database. Quindi dovresti prendere la stessa decisione sul possesso dei dati o utilizzare il loro formato, solo ora il loro formato ha garanzie molto più forti.

Then we have these questions:

Queste sono domande buone e difficili, e come ho detto sembra che la tua azienda stia nel business di risolverli per i tuoi utenti, e sì, questi casi d'uso sicuramente incoraggiano l'uso del tuo schema.

In cima alla mia testa, questo sembra un problema di controllo della versione, quindi ricerca qualcosa come "versione controllo di grandi quantità di dati". Un hit di Google: link

    
risposta data 04.03.2018 - 22:22
fonte
3

Questo dipende in larga misura dai requisiti, ciò che "inserisci, correggi e contrassegna / cancella i dati" significa esattamente, e i tuoi ulteriori requisiti per la preelaborazione e la postelaborazione. La modifica è eseguita su una base per riga? Ogni riga per intero o ci sono blocchi in quella riga che non devono essere elaborati? Completamente manuale o ci sono anche alcuni passaggi di pulizia / pre-elaborazione automatici? Come viene rilevata la "sovrapposizione"? Ci deve essere qualche criterio per rilevare l'identità di una riga.

Inoltre, non hai specificato cosa verrà dopo nel tuo flusso di dati. Immagino che correggere i dati non sia fine a se stesso, quindi c'è anche da considerare cosa succede dopo che il montaggio è stato fatto: c'è un obbligo di riscrivere i dati nuovamente nei file CSV, usando il formato originale? Sarà archiviato / archiviato da qualche parte? O i dati saranno elaborati in un modo completamente diverso?

Quindi, una volta soddisfatti questi requisiti generali, dovresti creare un modello / schema dati che supporti esattamente i passaggi di modifica ed elaborazione necessari, non meno, non più . Questo potrebbe essere in qualche modo il tuo approccio # 2, ma

  • dato che hai accennato a confondere i dati di diversi mesi come un problema, integrarli non è un requisito, quindi tieni i dati separati al mese. Avere una tabella master Datapool con una chiave primaria "date" o "month", forse il nome del file CSV come attributo univoco e creare le altre tabelle come tabelle di dettaglio della tabella master

  • modella solo la parte dei dati che gli utenti e i processi devono realmente visualizzare e modificare; i dati rimanenti possono essere mantenuti, ad esempio, in una colonna di stringhe. Non investire tempo nella modellazione dei dettagli quando non sai (ancora) se ne avrai mai bisogno.

  • assicurati di poter supportare tutti i passaggi successivi. Conoscere questi requisiti dovrebbe aiutarti a decidere quali dati devono essere conservati e quali possono essere ignorati.

Durante la creazione del modello di dati, tieni presente che i dati probabilmente non sono della qualità che ti piace averlo. Ad esempio, potrebbe non essere possibile avere tutti i vincoli "univoci" sul posto per ogni attributo che dovrebbe essere unico dopo la modifica.

    
risposta data 05.03.2018 - 14:06
fonte
1

Una soluzione che abbiamo adottato è stata la creazione di mapping. Lo strumento catturerebbe le prime n righe di dati saltando tutto ciò che sembrava hotplan in modo che la persona che gestiva l'importazione sarebbe in grado di vedere un campionamento dei dati e le intestazioni delle righe per controllare la mappatura. / p>

Lo schema "CSV" era guidato dalla riga di intestazione se disponibile e dal numero di colonne. Abbiamo avuto modo di mappare i dati dallo schema CSV allo schema dell'applicazione. Abbiamo incontrato un paio di cose di cui avevamo bisogno per una gestione speciale:

  • Valori predefiniti per le colonne richieste (abbiamo avuto casi in cui i dati erano noti, ma non forniti poiché era lo stesso per tutti i record)
  • Riconoscimento del formato della data personalizzato (nota: quando i campioni della data includono 1/2/2018 e 1/3/2018 può essere difficile individuare quale sia il mese e qual è il giorno)

Ce ne sono ancora di più, ma mi mancano due anni per lavorare su quel progetto.

Questa mappatura è stata archiviata nel database in modo da poterla consultare in base alla firma dell'intestazione per i futuri dump di dati. Ha aiutato molto con la gestione della formattazione dei dati.

L'elaborazione consisteva nella lettura dei dati e nella scrittura nel database in blocchi. Ciò significava leggere 100 righe circa, prepararle in una raccolta in modo da eliminare il rumore un po 'più facilmente e quindi scriverle in quel blocco. Accelera l'importazione dei dati durante la scrittura nel database senza bisogno di avere tutto in memoria in una volta.

Tutti gli errori sono stati scritti in un CSV contenuto nel record del database che ha fatto riferimento al file in modo da poter capire cosa c'era di sbagliato nella nostra mappatura (cioè il mese e il giorno sono stati invertiti, o la colonna richiesta è stata riempita scarsamente). Il CSV aveva il numero di riga, l'errore specifico, i dati che hanno causato il problema e la colonna di destinazione prevista.

Il problema più difficile per te è il rilevamento di dati duplicati. Se hai query efficienti o cerchi l'archivio dati della tua applicazione, hai un paio di opzioni:

  • Scrivi l'input non elaborato in un'area preparata, quindi post-elaborazione come passaggio separato
  • Esegui una query sul database mentre prosegui.

Il compromesso è che in termini di preparazione dei dati in uno schema conosciuto, la prima opzione è quella di ingerire i dati molto più rapidamente. Consentendo di triage la mappatura prima che sia effettivamente pronta per il consumo. La seconda opzione avrà i tuoi dati pronti in un unico passaggio, ma può richiedere fino a 10 volte il tempo di elaborazione.

    
risposta data 05.03.2018 - 15:19
fonte

Leggi altre domande sui tag