Salt la conținut

SUBIECTE NOI
« 1 / 5 »
RSS
Ruse vs Rusesti

Le mai putem da pe brazda? tipsuri

Recomandari gips carton tavane. (...

ce fel de activitate intretinere ...
 Se poate imbunatati o poza sa se ...

Folosește cineva syncthing? ...

Închidere fereastra dupa deschidere.

Kit AC contine brate Unitatea ext...
 smart switch fara neutru

Ierbicid pentru parul porcului.

Smecher de talie grea

PH apa plata
 Recomandare Mocheta -pe suport pa...

ram upgrade asus rog strix

Alegere memorie USB

Manere clasice mobila sau push to...
 

ETL one to many relationship from CSV to XML

* - - - - 1 voturi
  • Vă rugăm să vă autentificați pentru a răspunde
31 răspunsuri în acest subiect

#19
fabian23

fabian23

    Active Member

  • Grup: Members
  • Mesaje: 1.609
  • Înscris: 06.03.2005

View Postcralin, on 02 martie 2024 - 14:16, said:

Pentru transformarea din CSV in XML, in afara ca trebuie sa extinzi etl.sh cu cite valori/coloane are o linie citita din csv si sa construiesti corect output-ul XML in rest nu cred ca se schimba nimic daca ai mai multe detalii despre o masina.

Legatura intre datele din cele doua csv-uri o faci pe baza valorii din primul field al fiecarei linii din cele doua fisiere si nu pe baza UUID-ului din reportedCaseId

Uite:

main.csv
1,John,RO,The complete address 1
2,David,AT,The complete address 2
3,Helen,DE,The complete address 3
222,Gigel,RO,The complete address 222


reportedCarsData.csv
1,Dacia,2021,Cancelled,2c4c231b-f612-4725-876d-8a32c674d2eb
3,Porche,2024,Completed,c3e59825-81d2-47bd-b385-d0f587c2c434
2,Mercedes,2020,Clearing,e65752276a19d7fabfab98f71514cb77
1,Audi,2023,Completed,8a63217e-d019-46b9-ae23-1e52c4e57ffe
2,Ford,2021,Execution,e6ac636eb7c1a8fc1c460d5ad4add487
222,Lastun,1960,In approval,e1c76251-1721-4454-b35c-6657e42b8552


Nu citisem cu atentie. Acum imi dau seama ce spui si cred ca asta-i cea mai buna solutie de design!

Posted Image

#20
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Mesaje: 30.262
  • Înscris: 24.02.2007

View Postcralin, on 02 martie 2024 - 18:34, said:

@dani.user,
Nu stii apriori cit de multe date ai si cel mai probabil ca o sa-ti crape excelul cind il pui sa-ti incarce un csv de citeva sute de MB si citeva milioane de linii in el.

Cine a zis ceva de Excel? Excel e in poza doar pentru a arata structura datelor din CSV intr-un mod mai usor.

Editat de dani.user, 02 martie 2024 - 19:11.


#21
fabian23

fabian23

    Active Member

  • Grup: Members
  • Mesaje: 1.609
  • Înscris: 06.03.2005

View Postdani.user, on 02 martie 2024 - 18:59, said:

Cine a zis ceva de Excel? Excel e in poza doar pentru a arata structura datelor din CSV intr-un mod mai usor.
Ce arati acolo, m-am gandit prima oara:

Id,Name,Country,Address,Model,Year
1,John,RO,address1,,
,,,,Dacia,2021
,,,,Ford,2023


Daca-i asa, problema este (cel putin asa vad) ca liniile au coloane goale. Iti complici viata, trebuie un algoritm pus la cale care sa nu le interpreteze ca errori si care sa stie de care group ele apartin. Plus ca sunt greu de citit daca le printezi in consola.

Editat de fabian23, 02 martie 2024 - 19:26.


#22
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Mesaje: 30.262
  • Înscris: 24.02.2007

View Postfabian23, on 02 martie 2024 - 19:15, said:

Iti complici viata, trebuie un algoritm pus la cale care sa nu le interpreteze ca errori si care sa stie de care group ele apartin.

E vorba de un singur if. Mai simplu si mult mai rapid decat cautarea in alt fisier.

Fișier atașat  Untitled.png   77,53K   6 download-uri

#23
fabian23

fabian23

    Active Member

  • Grup: Members
  • Mesaje: 1.609
  • Înscris: 06.03.2005

View Postdani.user, on 02 martie 2024 - 23:53, said:

E vorba de un singur if. Mai simplu si mult mai rapid decat cautarea in alt fisier.

Attachment Untitled.png
Nu este atat de simplu, desi mi-ar placea.

Pot/vor fi esantioane de date, neconsistente si ele trebuie raportate ca errori pentru reconcilieri/raportari ulterioare. Nu ma pot baza pe faptul ca daca prima coloana este empty atunci tot ce vine dupa trebuie pus pe nivelul 2 in raportare. Poti primi un csv cu o linie unde primul element lipseste (putin probabil ca-i id) dar trebuie tratat cazul. Apoi unele coloane sunt optionale, deci pot fi empty.

Ce a sugerat @cralin mi se pare mult mai clean: un file unde sunt cuprinsi cei raportati iar unul unde sunt cuprinse toate caseId-urile asociate lor.

Editat de fabian23, 03 martie 2024 - 10:13.


#24
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Mesaje: 30.262
  • Înscris: 24.02.2007

View Postfabian23, on 03 martie 2024 - 10:12, said:

Poti primi un csv cu o linie unde primul element lipseste (putin probabil ca-i id) dar trebuie tratat cazul.

De ce n-ar fi id? Nu tu definesti cum trebuie sa arate CSVul?

View Postfabian23, on 03 martie 2024 - 10:12, said:

Ce a sugerat @cralin mi se pare mult mai clean: un file unde sunt cuprinsi cei raportati iar unul unde sunt cuprinse toate caseId-urile asociate lor.

Si mult mai lent. Dar poate nu-i asta o problema.

#25
cralin

cralin

    Member

  • Grup: Members
  • Mesaje: 689
  • Înscris: 18.09.2020
Ambele functioneaza si ambele se bazaeaza pe niste presupuneri legate de cum poti sa primesti datele din DWH (ordonate sau neordonate), thread-uri/job-uri paralele sau nu si/sau daca mai trebuie sa faci in ETL si alte conversii/manipulari de date inainte sa le arunci in XML.

E clar ca scriptul in BASH e mai lent/ineficient decit codul scris cam in orice limbaj de programare.

Editat de cralin, 03 martie 2024 - 14:20.


#26
fabian23

fabian23

    Active Member

  • Grup: Members
  • Mesaje: 1.609
  • Înscris: 06.03.2005

View Postdani.user, on 03 martie 2024 - 13:11, said:

De ce n-ar fi id? Nu tu definesti cum trebuie sa arate CSVul?

Extractia nu-i facuta de mine si nu-i sub controlul meu. Eu cel mult pot da "contractul", adica cum astept datele de intrare.

View Postdani.user, on 03 martie 2024 - 13:11, said:

Si mult mai lent. Dar poate nu-i asta o problema.

Da, nu este o problema. ETL-ul poate fi mai lent atata timp cat ruleaza intr-un timp rezonabil: 1-2h.

Editat de fabian23, 03 martie 2024 - 16:33.


#27
cralin

cralin

    Member

  • Grup: Members
  • Mesaje: 689
  • Înscris: 18.09.2020
Cu un Intel® Core™ i5-3360M CPU @ 2.80GHz si cu un set de date mai reprezentativ, la codul ala din BASH ii trebuie cam 2.5 ore sa termine de generat XML-ul


$ wc -l *synthetic.csv
  250000 main_synthetic.csv
1374909 reportedCarsData_synthetic.csv

$ time ./etl.sh main_synthetic.csv reportedCarsData_synthetic.csv > result.xml
real 143m23.160s
user 113m33.760s
sys 80m48.694s



#28
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Mesaje: 30.262
  • Înscris: 24.02.2007
Deci cam 20 kB/s viteza de procesare?

#29
cralin

cralin

    Member

  • Grup: Members
  • Mesaje: 689
  • Înscris: 18.09.2020
Am generat 250000 de ID-uri in main_synthetic.csv si un numar aleator intre 1 si 10 masini pentru fiecare ID.

Sincer, nu am calculat citi KB/s face asta dar oricum XML-ul ala e mare fata de dimensiunea totala a CSV-urilor cu date raw.

Uite aici dimensiunea fisiereor:
ls -lh
total 232M
-rwxr-xr-x 1 cralin cralin 979 Mar 2 19:54 etl.sh
-rwxr-xr-x 1 cralin cralin 1003 Mar 3 21:16 etl_v2.sh
-rw-r--r-- 1 cralin cralin 139 Mar 1 21:23 main.csv
-rw-r--r-- 1 cralin cralin 15M Mar 3 19:04 main_synthetic.csv
-rw-r--r-- 1 cralin cralin 358 Mar 2 13:03 reportedCarsData.csv
-rw-r--r-- 1 cralin cralin 29M Mar 3 19:36 reportedCarsData_synthetic.csv
-rw-r--r-- 1 cralin cralin 189M Mar 3 22:02 result.xml


E clar ineficient sa pornesti de 250000 grep-ul (se vede ca 80 de minute sint consumate in "sys"). Nici nu ma asteptam sa fie rapid tocmai din cauza fork-ului pentru grep.

Si inca ceva, scriptul BASH a folosit doar un core din cele 4 cite le avea la dispozitie pe masina respectiva.

Probabil ca fara fork-uri de grep si cu mai multe thread-uri care sa foloseasca la maxim numarul de core-uri care sint disponibile poti sa-l faci sa termine mai repede.

Editat de cralin, 04 martie 2024 - 01:20.


#30
cralin

cralin

    Member

  • Grup: Members
  • Mesaje: 689
  • Înscris: 18.09.2020
Si cu ce a propus @dani.user (sper ca am inteles bine codul din screenshot)

etl_dani.user.sh:
#!/bin/bash
echo '<?xml version="1.0" encoding="UTF-8"?>'
echo '<dataBody xmlns="urn:ro:test:car:report:v1" xmlns:ns2="urn:ro:test:car:report:commontypes:v1" version="4.0">'
FIRST_ELEMENT=1
while IFS="," read -r _ID_ _NAME_ _COUNTRY_ _ADDRESS_ _CARDATA_MODEL_ _CARDATA_YEAR_
do
if [ -n "$_ID_" ]
	 then
	 if [ $FIRST_ELEMENT -ne 1 ]
		 then
		 echo '</report>'
	 fi
	 FIRST_ELEMENT=0
	 echo '<report Id="'$_ID_'">'
	 echo '<Name>'$_NAME_'</Name>'
	 echo '<Address>'
	 echo '<Country>'$_COUNTRY_'</Country>'
	 echo '<AddressFree>'$_ADDRESS_'</AddressFree>'
	 echo '</Address>'
	 else
	 echo '<reportedCar>'
		 echo '<model>'$_CARDATA_MODEL_'</model>'
		 echo '<year>'$_CARDATA_YEAR_'</year>'
		 #echo '<reportedCaseId type="'$_CARDATA_REPORTED_CASEID_TYPE_'">'$_CARDATA_REPORTED_CASEID_UUID_'</reportedCaseId>'
		 echo '</reportedCar>'
fi
done < $1
echo '</report>'
echo '</dataBody>'


Asa arata continutul fisierului dani.user__reportedCarsData_synthetic.csv
1,Name_1,Country_1,The complete address 1,,
,,,,Model_1,Year_1
,,,,Model_2,Year_2
,,,,Model_3,Year_3
,,,,Model_4,Year_4
,,,,Model_5,Year_5
,,,,Model_6,Year_6
,,,,Model_7,Year_7
2,Name_2,Country_2,The complete address 2,,
,,,,Model_1,Year_1
,,,,Model_2,Year_2
,,,,Model_3,Year_3
,,,,Model_4,Year_4
,,,,Model_5,Year_5
,,,,Model_6,Year_6
,,,,Model_7,Year_7
,,,,Model_8,Year_8
3,Name_3,Country_3,The complete address 3,,
,,,,Model_1,Year_1
,,,,Model_2,Year_2
,,,,Model_3,Year_3
,,,,Model_4,Year_4
,,,,Model_5,Year_5
,,,,Model_6,Year_6
4,Name_4,Country_4,The complete address 4,,
,,,,Model_1,Year_1
,,,,Model_2,Year_2
,,,,Model_3,Year_3
,,,,Model_4,Year_4



$ ls -lh *dani.user*.csv
-rw-r--r-- 1 cralin cralin 40M Mar 4 00:55 dani.user__reportedCarsData_synthetic.csv

$ wc -l dani.user__reportedCarsData_synthetic.csv
1623658 dani.user__reportedCarsData_synthetic.csv

$ time ./etl_dani.user.sh dani.user__reportedCarsData_synthetic.csv > result.xml
real 1m34.322s
user 1m9.695s
sys	 0m24.192s



Editat de cralin, 04 martie 2024 - 02:42.


#31
fabian23

fabian23

    Active Member

  • Grup: Members
  • Mesaje: 1.609
  • Înscris: 06.03.2005

View Postcralin, on 04 martie 2024 - 02:39, said:

$ ls -lh *dani.user*.csv
-rw-r--r-- 1 cralin cralin 40M Mar 4 00:55 dani.user__reportedCarsData_synthetic.csv

$ wc -l dani.user__reportedCarsData_synthetic.csv
1623658 dani.user__reportedCarsData_synthetic.csv

$ time ./etl_dani.user.sh dani.user__reportedCarsData_synthetic.csv > result.xml
real 1m34.322s
user 1m9.695s
sys	 0m24.192s



Imi place ca ai facut profiling.

Offtopic, cu ce ai generat datele dummy?

Multumesc.

Editat de fabian23, 04 martie 2024 - 17:50.


#32
cralin

cralin

    Member

  • Grup: Members
  • Mesaje: 689
  • Înscris: 18.09.2020

View Postfabian23, on 04 martie 2024 - 17:50, said:

Offtopic, cu ce ai generat datele dummy?



Cu BASH (sint sarac si nu imi permit altceva).
Posted Image

for i in $(seq 1 250000); do echo "${i},Name_${i},Country_$i,The complete address ${i},,"; for j in $(seq 1 $(echo $((1 + RANDOM % 10)))); do echo ",,,,Model_${j},Year_${j}"; done; done | tee dani.user__reportedCarsData.csv


Editat de cralin, 04 martie 2024 - 19:13.


Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

www.neurohope.ro

Utilizatori activi: 1

0 membri, 1 vizitatori, 0 utilizatori anonimi

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate