Εμφάνιση αναρτήσεων με ετικέτα SQL. Εμφάνιση όλων των αναρτήσεων
Εμφάνιση αναρτήσεων με ετικέτα SQL. Εμφάνιση όλων των αναρτήσεων

Τετάρτη, 24 Αυγούστου 2016

Κάνοντας ETL με το QlikView, ένα case study...

Κάθε εργαλείο φτιάχνεται με ένα συγκεκριμένο σκοπό άσχετο με το αν εμείς μπορεί να το χρησιμοποιούμε και κάπως αλλιώς για να καλύψουμε τις ανάγκες μας... Κατά την άποψή μου το QlikView δεν είναι ένα εργαλείο κατάλληλο για να φτιάξεις ETL processes, έλα όμως που πολλές φορές αναγκάζομαι για λόγους που δεν είναι της παρούσης, να το κάνω... Έχω σιχτιρίσει κάθε μια από αυτές, όντας SQL και Data Warehouse oriented, το να κάνω ETL μέσα από το script του QlikView δεν είναι το καλύτερό μου διότι πιστεύω ότι σε πολλές περιπτώσεις αναγκάζεσαι να ανακαλύψεις ξανά τον τροχό για θέματα που είναι από καιρό λυμένα για τα ETL tools και την SQL...

Το συγκεκριμένο case αφορά μια περίπτωση όπου έπρεπε να εντοπίσω ανά πελάτη ποια είναι τα καταστήματα με το μεγαλύτερο μέσο υπόλοιπο και αν είναι περισσότερο από ένα να διαλέξω αυτό στο οποίο έχει ανοιχθεί πιο πρόσφατα λογαριασμός... Με παίδεψε αρκετά καθώς το πρώτο πράγμα που θα έρθει στο μυαλό μου σε αυτές τις περιπτώσεις είναι μια SQL προσέγγιση με τη δημιουργία κάποιων temp tables όπου θα έχω πολλαπλά κλειδιά αν το χρειάζομαι κ.ο.κ., που όμως στην προκειμένη περίπτωση δεν μας κάνει... Κατέληξα σε μια ξεκάθαρα QlikView υλοποίηση η οποία δεν είναι η βέλτιστη καθώς παρουσιάζει αρκετό delay όταν οι όγκοι των δεδομένων αυξάνονται αλλά σε μικρούς και μεσαίους όγκους το performance είναι πολύ καλό...  Το δηλώνω από τώρα ότι δεν πρόκειται να μπω στη διαδικασία να δουλέψω παραπάνω πάνω στο script διότι αφενός δεν το χρειάζομαι πια καθώς έφτιαξα και δεύτερη λύση η οποία είναι πολύ μακροσκελέστερη αλλά με πολύ καλύτερο performance και αφετέρου διότι εξακολουθώ να πιστεύω ότι το QlikView δεν είναι φτιαγμένο για ETL, ο σωστός προγραμματιστής πρέπει να είναι τεμπέλης και να μην γράφει ποτέ περισσότερο κώδικα από όσο είναι απολύτως απαραίτητο... :)  

Σκέφτηκα να βάλω αυτό το script στο Gist διότι σκέφτηκα ότι μπορεί να είναι χρήσιμο για κάποιους καθώς γίνεται ένα πολύ ωραίο loop σε αυτόν τον κώδικα, και για να το θυμάμαι κι εγώ, ποτέ δεν ξέρεις πού θα χρησιμοποιηθεί τελικά...

Παρασκευή, 3 Ιουνίου 2016

R - Πρόσβαση σε μια βάση δεδομένων με το package RODBC ...

Μπορεί δουλεύοντας με την R να χρησιμοποιούμε σε πολύ μεγάλο βαθμό ως data sources διάφορα flat files και γενικότερα αδόμητη πληροφορία αλλά θα έρθει η στιγμή εκείνη που θα χρειαστεί να κάνουμε την R να "μιλήσει" με μια ή περισσότερες βάσεις δεδομένων... Υπάρχουν διάφορα packages που παρέχουν τη διεπαφή μεταξύ της R και μιας συγκεκριμένης βάσης δεδομένων όπως το RMySQL ή το ROracle, υπάρχει όμως ένα package το οποίο δεν database specific αλλά υποστηρίζει τη διεπαφή με όλες τις βάσεις δεδομένων, συμπεριλαμβανομένων του SQL Server και της DB2, αρκεί να υπάρχει ένα σχετικό ODBC connection...

Το package αυτό ονομάζεται RODBC και μπορείτε να το βρείτε και να το εγκαταστήσετε από το CRAN... Είναι πολύ απλό και straightforward στην χρήση του, τα βασικά functions του μπορείτε να τα δείτε κι εδώ... Όπως θα δείτε, δίνει δυνατότητες πλήρους manipulation της βάσης (insert, update, delete) κι όχι μόνο ανάγνωση των δεδομένων... Το χρησιμοποίησα στα πλαίσια ενός project που απαιτούσε την χρήση ενός μεγάλου όγκου δεδομένων τα οποία βρίσκονται σε μια DB2 στημένη πάνω σε ένα σύστημα AS/400 και λειτούργησε άψογα, με πολύ καλό performance... Το script που χρησιμοποίησα ήταν κάπως έτσι:


Για να εξηγήσω λίγο τι έχω κάνει, έχω περάσει τα credentials του χρήστη που χρησιμοποιώ για να συνδεθώ στη βάση σε ένα tab delimited αρχείο με συγκεκριμένη γραμμογράφηση και αφού τα διαβάσω τα περνάω σε variables που χρησιμοποιώ μετά στο connection string... Επίσης, δεν έχω περάσει το SQL query απευθείας στην function sqlQuery, προτίμησα λόγω του μεγέθους του που θα κατέστρεφε την εικόνα του κώδικα και θα τον έκανε πολύ δυσανάγνωστο, να το έχω σε ένα txt αρχείο το οποίο διαβάζω με την readLines και κατόπιν δημιουργώ το query σαν ένα μεγάλο string... Εδώ θα χρειαστεί λίγο προσοχή με τα spaces και τα line breaks στο πως θα περάσετε τον SQL κώδικα στο txt αρχείο, θυμηθείτε ότι δημιουργούμε ένα string που θα πρέπει να μπορεί να το κάνει parse η SQL...

Θυμηθείτε να κλείνετε πάντα το connection όταν τελειώνετε τη δουλειά σας, είναι σημαντικό για να μην προκαλέσετε καθυστερήσεις και προβλήματα στη βάση...

Ελπίζω να βρείτε χρήσιμο το RODBC, καλή δουλειά!

Παρασκευή, 20 Νοεμβρίου 2015

QlikView variable ως παράμετρος σε SQL query...

Το σημερινό tip είναι κάτι που έφτιαξα πριν περίπου 2 χρόνια, στην αρχή της ενασχόλησής μου με το QlikView, και προέκυψε από την ανάγκη να διαβάσω μια λίστα πελατών από ένα data source και μετά να περάσω αυτή την λίστα σαν παράμετρο σε ένα άλλο data source, μια βάση δεδομένων, για να συλλέξω όλη την πληροφορία που αφορούσε τους πελάτες αυτούς... Μετά από 2 χρόνια εντατικής δουλειάς και εμπειρίας ξέρω ότι υπάρχουν κι άλλοι τρόποι, να κάνεις την ίδια δουλειά, η συγκεκριμένη υλοποίηση όμως είναι ενδιαφέρουσα ως προς την χρήση των variables μέσα στο QlikView script σε συνδυασμό με SQL queries...

Έστω λοιπόν ότι το πρώτο data source είναι ένα Excel αρχείο στο οποίο περιέχονται κωδικοί πελατών τους οποίους θέλουμε να διαβάσουμε και να αναζητήσουμε σε ένα άλλο data source, μια βάση δεδομένων... Για να το καταφέρουμε αυτό θα δημιουργήσουμε μια μεταβλητή η οποία θα περιέχει σαν ένα μεγάλο string, όλους τους κωδικούς πελατών (χωρισμένους με κόμματα και κλεισμένους μέσα σε "αυτάκια") και θα την θέσουμε σαν παράμετρο του WHERE statement του query με το οποίοι θα διαβάσουμε τη βάση... 

Αυτό επιτυγχάνεται, όπως θα δείτε στο πρώτο script πιο κάτω, δημιουργώντας μια μεταβλητή (vNoOfRows) που θα περιέχει τον αριθμό των κωδικών πελατών που φορτώσαμε στο QlikView και τρέχοντας ένα for loop για κάθε ένα CustomerID που βρίσκει, μέχρι τον αριθμό του vNoOfRows ...Σε κάθε λούπα προσθέτουμε το CustomerID στην μεταβλητή vCus η οποία θα περιέχει στο τέλος όλη την λίστα των CustomerIDs χωρισμένων με κόμματα σε μορφή τέτοια ώστε να μπορέσουμε να την ενσωματώσουμε σε ένα SQL Query...



Από αυτό το σημείο και μετά τα πράγματα είναι πολύ απλά... Απλά τρέχουμε το query μας με παράμετρο την μεταβλητή vCus και φορτώνουμε στο QlikView τα στοιχεία μόνο εκείνων των πελατών που μας αφορούν...

Δευτέρα, 2 Νοεμβρίου 2015

Υπολογισμός ελληνικών εργάσιμων ημερών με SQL...

Πολλές φορές δουλεύοντας με δεδομένα θα χρειαστεί να τροποποιήσετε τον κώδικά σας, τον όποιο κώδικα γράφετε, αναλόγως με το αν τα δεδομένα σας αναφέρονται σε εργάσιμες ημέρες ή όχι... Αυτό μπορεί να είναι συχνά μπελάς αν συνυπολογίσεις ότι υπάρχουν κινητές γιορτές και αργίες, όπως το Πάσχα, οι οποίες διαφέρουν κιόλας αναλόγως αν αναφέρεσαι στο Πάσχα των Καθολικών ή των Ορθοδόξων...

Ένας εύκολος τρόπος να υπολογιστούν οι εργάσιμες μέρες του ελληνικού εορτολογίου είναι το παρακάτω T-SQL script το οποίο αφού τρέξετε σε κάποιο SQL Server instance, παράγει για το διάστημα το οποίο έχετε ορίσει, ένα table το οποίο περιέχει ανά ημερομηνία, τον μήνα και το έτος που ανήκει αυτή, την ονομασία της ημέρας, ένδειξη αν είναι εργάσιμη ή όχι και ένδειξη αν είναι η τελευταία εργάσιμη κάθε μήνα ή όχι.... Το script αυτό μπορείτε να το χρησιμοποιείτε είτε σε stored procedures ή common table expressions για πιο ad hoc χρήση, είτε one off υπολογίζοντας τις εργάσιμες μέρες για ένα μεγάλο χρονικό διάστημα και αποθηκεύοντας το table είτε στη βάση είτε σε κάποιο άλλο αρχείο για μελλοντική χρήση, όπως έχω κάνει εγώ... 

Η επιλογή δικής σας...

Δευτέρα, 26 Οκτωβρίου 2015

Data manipulation χρησιμοποιώντας SQL statements στην R - sqldf...

Το να μάθεις μια καινούργια γλώσσα προγραμματισμού ή ένα καινούργιο framework, σημαίνει κάποιες φορές ότι πρέπει να μάθεις να σκέφτεσαι με διαφορετικό τρόπο από αυτόν που έχεις συνηθίσει να σκέφτεσαι μέχρι τώρα... H απόφαση μου να μάθω R και να μπω στον κόσμο του statistical programming σήμαινε ότι έπρεπε να βγω από το comfort zone που βρισκόμουν τόσα χρόνια και να μάθω καινούργια κόλπα... Για εμένα και πολλούς άλλους που προερχόμαστε από ένα κόσμο γεμάτο databases και data warehouses το να γράψουμε ένα SQL script ή κάποια prodecure για να διαχειριστούμε τα δεδομένα μας είναι πολύ απλό, όταν όμως προσπαθείς να κάνεις κάτι τέτοιο μέσα από την R, τότε πρέπει να σκεφτείς και να πράξεις με διαφορετικό τρόπο... Υπάρχουν όμως στιγμές που θες να κάνεις κάτι γρήγορα και δεν έχεις χρόνο για να εκπαιδεύσεις τον εαυτό σου να σκέφτεται με R τρόπο και ίσως δεν θέλεις κιόλας να το κάνεις διότι θεωρείς ότι ο R τρόπος δεν είναι ούτε γρήγορος, ούτε αποδοτικός... Ευτυχώς υπάρχει το sqldf  που μας λύνει τα χέρια...

Το sqldf  όπως λέει και τo Introduction του πακέτου στο GitHub είναι:
...sqldf is an R package for runing SQL statements on R data frames, optimized for convenience. The user simply specifies an SQL statement in R using data frame names in place of table names and a database with appropriate table layouts/schema is automatically created, the data frames are automatically loaded into the database, the specified SQL statement is performed, the result is read back into R and the database is deleted all automatically behind the scenes making the database's existence transparent to the user who only specifies the SQL statement...
Με λίγα λόγια, το sqldf μας δίνει τη δυνατότητα να χειριστούμε τα data frames μας σαν πίνακες μιας σχεσιακής βάσης δεδομένων και να τους προσπελάσουμε γράφοντας κλασσικά και αγαπημένα SQL queries...

Ένα μικρό παράδειγμα είναι το παρακάτω...

Έστω ότι θέλουμε να προσθέσουμε μια επιπλέον κολόνα στο data frame που δουλεύουμε για να χαρακτηρίσουμε κάθε observation ανάλογα με το περιεχόμενο μιας συγκεκριμένης variable...

Χρησιμοποιώντας την R, χωρίς κάποιο πρόσθετο package, θα μπορούσαμε να το κάνουμε κάπως έτσι:



Χρησιμοποιώντας το sqldf  θα μπορούσαμε να το κάνουμε έτσι:


Το πώς θα δουλέψει τελικά ο καθένας είναι θέμα γούστου και εξοικείωσης...

Αν θέλετε λεπτομέρειες, documentation και source κώδικα θα βρείτε το sqldf  τόσο στο GitHub όσο και στο CRAN...

Τρίτη, 10 Σεπτεμβρίου 2013

Μάθετε προγραμματισμό on line...

Δεν ξέρω πόσοι από τους αναγνώστες αυτού του blog θα βρουν αυτό το post ενδιαφέρον... To "Ψαροκόκαλο" δεν είναι ένα τεχνολογικό blog και οι αναγνώστες του δεν είναι (κατά κύριο λόγο φαντάζομαι) tech-oriented, νομίζω όμως ότι θα ήταν χρήσιμο για όποιον επιθυμεί να εξερευνήσει λίγο τον χώρο της Πληροφορικής και του προγραμματισμού, να βρει συγκεντρωμένες κάποιες on line, δωρεάν πηγές που εμένα με βοήθησαν να μάθω πολλά πράγματα που τα χρησιμοποίησα στη δουλειά μου κι όχι μόνο...

  • W3Schools ("The world's largest web development site", είναι το logo του και ίσως να έχει δίκιο! Όλες οι τεχνολογίες που αφορούν το web development, από το front end (HTML, CSS ,Javascript, jQuery και άλλα) μέχρι το back end (ASP, PHP, XML, JSON και άλλα) και τις βάσεις δεδομένων (SQL) , υπάρχουν εδώ!)
  • Codecademy (Ένα εξαιρετικό on line learning site το οποίο δεν θα ήταν υπερβολή να πούμε ότι έφτιαξε σχολή από παρόμοια sites... Διαθέτει ένα εξαιρετικό interface, απόλυτα φιλικό στον user, και on line compilers για να δουλεύεις μέσα από τον browser χωρίς να χρειάζεται να κατεβάσεις τίποτα στον υπολογιστή σου... Έχει πολύ ισχυρό community από τους χιλιάδες χρήστες του, στα forums του μπορείς να λύσεις κάθε απορία σου... Τα courses που προσφέρει αφορούν κατά κύριο λόγο το web development (HTML, CSS, PHP, Javascript, jQuery) αλλά όχι μόνο καθώς προσφέρει courses και για Ruby και Python αλλά και διάφορα APIs...)
  • LearnStreet (Είναι ένα site που ανήκει στην σχολή που δημιούργησε το Codecademy ... Ακολουθεί την ίδια λογική τόσο στο interface όσο και στο γενικότερο concept, προσφέρει όμως προς το παρόν λιγότερα courses (Javascript, Python, Ruby)... Είναι μια εξαιρετική προσπάθεια, σε αυτό το site "ακονίζω" τις γνώσεις μου στην Python αυτή την περίοδο, ολοκληρώνοντας διάφορα projects που προσφέρει με την μορφή ασκήσεων... )
  • tutorialspoint (Ο τίτλος του site μιλάει από μόνος του, αν ψάχνεις tutorial για οποιοδήποτε τεχνολογικό θέμα από προγραμματισμό και telecoms μέχρι server scripting, web development και quality control, όλα είναι εδώ... Χρησιμοποιώ το συγκεκριμένο site σαν on line reference, αν ψάχνω κάτι στα γρήγορα, ξέρω πού θα το βρω...)
  • DotNetPearls ( Είναι ένα site με tutorials και παραδείγματα που αφορούν τον προγραμματισμό στον (αχανή) κόσμο του .NET ... Επικεντρώνεται στις δύο κατεξοχήν .NET γλώσσες, C# και VB.NET αλλά προσφέρει κι ένα course για Python... Θεωρώ ότι είναι εξαιρετικό site για να ξεκινήσει κάποιος τον προγραμματισμό στην πλατφόρμα του .NET πριν εμβαθύνει σε πιο σύνθετες έννοιες...)
  • SQLAuthority (Το blog του Pinal Dave, είναι το καλύτερο μέρος για πληροφορίες, tips και tricks που αφορούν τις βάσεις δεδομένων, την SQL και τον SQL Server και όχι μόνο...)
  • CheckiO (Για το τέλος άφησα ένα...παιχνίδι! Το CheckiO είναι ένα παιχνίδι στο οποίο πρέπει να λύσεις διάφορους γρίφους γράφοντας μικρά προγράμματα σε Python... Κάθε γρίφος που λύνεται ξεκλειδώνει το επόμενο level... Το παιχνίδι αυτό απαιτεί, φυσικά, καλή γνώση της Python αλλά όχι μόνο, κατανόηση κάποιων αρχών των μαθηματικών και αλγορίθμων είναι απαραίτητα... Το CheckiO είναι μια πρόκληση για το μυαλό και τις ικανότητες σου, έχω περάσει μέρες ψάχνοντας την λύση των γρίφων... Το παιχνίδι έχει και forum όπου δίνονται άμεσα απαντήσεις σε απορίες ή διευκρινήσεις, η διαχειριστική του ομάδα είναι πολύ εξυπηρετικά και ευγενικά παιδιά... Το CheckiO είναι μια εξαιρετική προσπάθεια από την Ουκρανία... )