"We are back" « oc.at

CSV -> MySQL import

Umlüx 04.04.2016 - 09:02 4410 25
Posts

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 9005
hallo leute, ich brauch eine idee...

ich hab hier eine monströse tab-delimited CSV datei (ohne tableheader) mit 2GB+. die wird jede nacht frisch von einem system erstellt (auf welches ich leider keinen weiteren einfluss habe) um sie auf einen FTP server eines geschäftspartners hochzuladen.

gleichzeitig gibt es nun die anforderung, diese CSV datei per webformular durchsuchbar zu machen. ich müsste sie also in eine vorhandene MySQL klopfen.

da webformular ist kein thema, mein problem ist eher eine elegante lösung, diese monsterdatei schnell und zuverlässig ins MySQL zu bekommen.

das ziel ist ein MySQL 5.5.47 auf Debian 8 und das file selbst liegt auf einem netzwerkshare. und das ist schon mit das problem -> absoluter linuxnoob :(

ich bin also dabei mir zu ergooglen wie ich:
1) den windows share im debian mounten kann (automatisch mit AD credentials)
2) ein script erstelle, welches mir die csv ins mysql importiert
3) ich dieses irgendwie per cron im debian planen kann?

und dazu bin ich für jeden vorschlag, beispiel, link etc... dankbar!

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25536
1) mount -t cifs //IP/Freigabe /mnt -o user=user,domain=domain - du brauchst dafür cifs-utils am Server installiert (apt-get update;apt-get install cifs-utils)
2) Buffered read der Datei mit der Skriptsprache deines Vertrauens. 2 GB wirst du nämlich nicht auf einmal einlesen können. Nachdem CSV erst für eine gewisse Datenstruktur interpretiert werden muss, wirst du hier händisch rangehen müssen.
3) Für cron und crontab gibt es zahlreiche Tutorials, wie zB: https://www.debian-administration.o...uling_with_cron

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 9005
danke!
aber die anforderungen haben sich auch gerade geändert... hmz

natürlich sollen nicht nur aktuelle datensätze, sondern auch vergangene durchsuchbar sein. genauer: bis zu 1 monat in der vergangenheit.
ich kann aber wohl kaum 30x2gb am mysql server ablegen.. auch, wenn sich die daten von tag zu tag kaum unterscheiden.

ich überlege mir gerade, direkt per php auf die archivierten CSV files selbst zuzugreifen.
allerdings wäre das vermutlich mehr als nur langsam...

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25536
Gibt es irgendwelche Unterscheidungsmerkmale in den Daten, um herauszufinden, was neu und alt ist? Mit einem Ausscheidungsverfahren, was in die Datenbank kommt und was nicht, könntest du die Redundanz nämlich effizient vermeiden.

Poste mal Beispieldaten!

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 9005
du meinst beim import schon?
nein so darf ich das nicht machen. es müsste das vollständige file so wie es exportiert wurde durchsuchbar sein.

am storage belegt das kaum platz, da die DataDomain selbst schon ein daten dedup fährt. mysql kann das aber meines wissens nicht? könnte mich auch irren..

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12140
Wenn das Eingabeformat passt, klingt das nach einem Job fuer http://www.postgresql.org/docs/curr...c/file-fdw.html

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25536
Nein, du bräuchtest einen Primary Key, Timestamp oder irgendetwas in dieser Richtung.

Selbst wenn jedes CSV einzeln durchsucht werden müsste, wäre es besser, die redundanten Einträge per Index-Tabelle festzuhalten, falls möglich. Kommt aber natürlich darauf an, wie groß die Datensätze sind und wieviele davon redundant sind.

Alternativ könntest du auch einen Index-Service a la Sphinx nehmen, um die Suche durchzuführen. Kommt natürlich auch darauf an, wieviele Suchanfragen du erwartest, wie schnell diese zurückliefern soll und wie belastend das für den Server sein darf. Genau dafür gibt es ja die Indizierung von Daten (+ Sortierung, Typsuche, ...).

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 9005
schwer zu sagen. es unterscheiden sich vermutlich nicht mehr als ein paar hundert..
von momentan ~2,5mio datensätzen in der datei. wird künftig vermutlich auch gegen das doppelte anwachsen.

zugriff ist eher.. sporadisch. für fehlersuchen und debugging.
und ich müsste mich vermutlich damit gar nicht auseinandersetzen, wenn excel die datei öffnen könnte.. ;)
es gäbe zwar txt tools die solche monster dateien öffen können, das ganze sollte aber auch von... eher speziellen mitarbeitern bedienbar sein.
plus könnte man in der mysql natürlich dann auch gleich diverse automationen zur datenqualität einbauen.

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
auch Excel 64bit versucht?

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12140
LibreOffice hat i. A. besseres CSV-Handling als MSFT Office.

Tosca

Here to stay
Avatar
Registered: Feb 2002
Location: 1030
Posts: 990
Ich hab zwar keine CSV Datei in dieser Größe, aber bisher hat mir Ron's Editor noch alles gefressen. Einen Versuch ist es vielleicht wert.

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 9005
so, danke für eure bisherigen vorschläge, aber ich hab jetzt ein beispielsfile hier.
und damit leider festgestellt ich werd auch mit csv tools nicht weiterkommen, da es kein csv ist! grrr..

die datenspalten sind nicht durch trennzeichen getrennt sondern nach cursorposition. mir wird also nichts anderes übrig bleiben, als die datei wie von mat schon vorgeschlagen durch die scriptsprache meines vertrauens (in meinem fall wohl php.. hahaha, das wird ein spaß) zu jagen.
hätte aber wieder den vorteil, dass ich ein paar grundlegende checks schon automatisch fahren könnte.

ich denke zeilenweise mit fopen auslesen sollte möglich sein, ungeachtet der dateigröße? das andere problem wird höchstens die maximum execution time werden...

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12140
CLI-PHP hat keine maximale Execution Time, da du nicht an das (zeitnahe) Retournieren einer Response gebunden bist. Ich wuerde trotzdem eine weniger beschissene Sprache verwenden - das CSV-Handling von Python finde ich persoenlich extrem angenehm (vgl. https://docs.python.org/3.5/library/csv.html)

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 9005
naja ich verwende php nicht weil ich es will, sondern weil "ich es halt kann".
aber du hast schon recht, ich sollt mir mal gescheite alternativen aneignen wenn mal zeit ist.

csv handling ist leider, wie gesagt, belanglos, da es keines ist. ich darf die zeilen schön mit substrings zerlegen wies aussieht.

Tosca

Here to stay
Avatar
Registered: Feb 2002
Location: 1030
Posts: 990
Wenn die Felder eine fixe breite haben oder Tab delimited sind, könnte es vll. einfacher gehen. Kannst du mal einen Ausschnitt posten und ggf. "zensieren" falls nötig?
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz