Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Schimbare bec far VW Touran 1T3

Ce parere aveti de viteza/ modul ...

Love Lies Bleeding - 2024

Cum sterg mails din Promotions
 Vanzare cumparare fara transfer b...

Receptie ciudata, in functie de t...

Donez medicamente renale ptr pisica

Ce componenta e asta si ce ziceti...
 Dupa 20 ani de facultate, am uita...

Mobile.de ofera imprumut de bani ...

problema test grila

Digi24 a disparut de pe TV Lg
 Drept de proprietate intelectuala...

Jante noi shitbox

Trinitas TV 4K

Dacia 1316 cu 6 usi ...
 

ETL one to many relationship from CSV to XML

* - - - - 1 votes
  • Please log in to reply
31 replies to this topic

#19
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Î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
  • Posts: 30,239
  • Î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.

Edited by dani.user, 02 March 2024 - 19:11.


#21
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Î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.

Edited by fabian23, 02 March 2024 - 19:26.


#22
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Î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.

Attached File  Untitled.png   77.53K   6 downloads

#23
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Î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.

Edited by fabian23, 03 March 2024 - 10:13.


#24
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Î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
  • Posts: 667
  • Î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.

Edited by cralin, 03 March 2024 - 14:20.


#26
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Î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.

Edited by fabian23, 03 March 2024 - 16:33.


#27
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Î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
  • Posts: 30,239
  • Înscris: 24.02.2007
Deci cam 20 kB/s viteza de procesare?

#29
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Î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.

Edited by cralin, 04 March 2024 - 01:20.


#30
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Î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



Edited by cralin, 04 March 2024 - 02:42.


#31
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Î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.

Edited by fabian23, 04 March 2024 - 17:50.


#32
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Î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


Edited by cralin, 04 March 2024 - 19:13.


Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

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