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

Τρίτη, 22 Δεκεμβρίου 2015

Εισαγωγή δεδομένων UTF-8 στον SQL Server...

Το σημερινό post γράφεται για δύο λόγους: Ο πρώτος είναι ότι όλοι όσοι έχουμε δουλέψει με δεδομένα σε γλώσσες άλλες από αυτές που χρησιμοποιούν το Λατινικό αλφάβητο, ξέρουμε πολύ καλά πόσο μεγάλος μπελάς είναι... Ο δεύτερος είναι ότι επειδή έφαγα σχεδόν δυο μέρες για να καταφέρω να φορτώσω ένα αρχείο txt tab delimited σε μια βάση SQL Server 2008 R2, θέλω να θυμάμαι τον λόγο και την αιτία της ταλαιπωρίας μου έτσι ώστε να μην περάσω τα ίδια αν χρειαστεί να το επαναλάβω μετά από καιρό και να βοηθηθεί και κάποιος άλλος που μπορεί να έχει το ίδιο πρόβλημα και να σπάει το κεφάλι του, όπως έκανα εγώ...

Έστω λοιπόν ότι έχετε ένα txt αρχείο με δεδομένα τα οποία περιέχουν πεδία στα ελληνικά, το encoding του αρχείου είναι UTF-8 και δουλεύετε σε ένα μηχάνημα που το locale του είναι Greek... Δοκιμάζοντας να κάνετε import το αρχείο σε μια βάση SQL Server μέσω του Management Studio πιθανότατα δεν θα το καταφέρετε με την πρώτη... Κατά πάσα πιθανότητα το error που θα συναντήσετε οι περισσότεροι θα αναφέρει ότι υπάρχουν δύο encodings στο αρχείο, ότι το UTF-8 είναι unsupported στον SQL Server (δεν ξέρω αν αυτό ισχύει για όλες τις εκδόσεις του) και διάφορα άλλα ενοχλητικά μηνύματα...

Το πρόβλημα λύνεται με τον εξής απλό τρόπο:

Όταν σετάρουμε τα options του Import Wizard στο Management Studio πρέπει να κάνουμε τις παρακάτω επιλογές:

mssql2008-import-wizard-1

mssql2008-import-wizard-2

Με λίγα λόγια, πρέπει να ορίσουμε στον Import Data Source Wizard το locale σε "English (United States)" και το encoding σε "65001 (UTF-8)"... Κατόπιν, στο μενού Advanced, πρέπει να ορίσουμε το data type όλων των πεδίων σε "Unicode_string [DT_WSTR]"... Στην συνέχεια πατάμε διαρκώς Next μέχρι να φτάσουμε στο τέλος του Wizard... Τα δεδομένα θα φορτωθούν στη βάση μας, στο default αρχείο που θα παράξει ο Wizard και από εκεί και πέρα είναι πολύ απλό να κάνεις όλα τα απαραίτητα transformations και να τα φορτώσεις στον τελικό πίνακα με τα σωστά data types... Τόσο απλά!

Οι εικόνες και το credit ανήκουν στην GeoDataSource ...

Τρίτη, 24 Νοεμβρίου 2015

Χρήση variables για την περιγραφή των qvd path names - QlikView...

Ένα κοινό "πρόβλημα" στο QlikView development είναι όταν θέλεις να δοκιμάσεις την εφαρμογή σου σε κάποιο άλλο περιβάλλον, test ή live... Λόγω της φύσης του QlikView το να αλλάξεις απλά το connection string στη βάση που διαβάζεις δεν είναι αρκετό διότι θα πρέπει να ορίσεις ξανά το path για όλα τα qvds που φορτώνονται στην εφαρμογή, ένα ένα... Κάτι τέτοιο είναι χρονοβόρο και μη αποδοτικό και αυξάνει τις πιθανότητες λάθους... Η χρήση της επιλογής των Relative Paths δεν λύνει το πρόβλημα διότι προϋποθέτει ότι η εφαρμογή και τα qvds βρίσκονται στο ίδιο folder ή έστω διαφέρουν κατά ένα level κάτι το οποίο προσωπικά θεωρώ αρχιτεκτονικό λάθος... 

Μια πολύ καλή λύση για να αντιμετωπιστεί μια τέτοια κατάσταση είναι η χρήση local variables για την αποθήκευση των path names των διαφόρων qvds... Αυτό γίνεται δηλώνοντας μια μεταβλητή vPathName αμέσως μετά τα αρχικά set statements στο Main tab του script editor η οποία περιέχει το full path προς το qvd repository το οποίο θέλουμε να χρησιμοποιήσουμε... Κατόπιν σε κάθε LOAD statement  αντικαθιστούμε το full path name του qvd με την μεταβλητή συν το όνομα του qvd, όπως φαίνεται στο παρακάτω script:


Με την μέθοδο αυτή μπορούμε να κάνουμε αλλαγή του path των qvds που διαβάζει η εφαρμογή μας αλλάζοντας μόνο μια γραμμή κώδικα...  Έτσι κερδίζουμε χρόνο, ελαττώνουμε τις πιθανότητες λάθους και κάνουμε τις εφαρμογές πιο portable... Η μέθοδος αυτή μπορεί να χρησιμοποιηθεί και για παραπάνω από ένα repositories, δημιουργούμε απλά μια δεύτερη μεταβλητή που να υποδεικνύει στο δεύτερο repository και την χρησιμοποιούμε όπου είναι απαραίτητο...

Παρασκευή, 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 τα στοιχεία μόνο εκείνων των πελατών που μας αφορούν...

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

Πώς να καθαρίσουμε το workspace με ένα μόνο command - R...

Θα υπάρξουν φορές δουλεύοντας με την R που θα βρεθείτε με ένα workspace γεμάτο variables τις οποίες δεν χρειάζεστε αλλά θέλετε να συνεχίσετε τη δουλειά σας με ένα άδειο workspace... 

Υπάρχουν δυο τρόποι να το κάνετε αυτό...

Ο πρώτος είναι να κλείσετε το session που δουλεύετε χωρίς να σώσετε τα περιεχόμενα του workspace στο .RData file... Ο τρόπος αυτός όμως έχει τα μειονεκτήματα ότι πρέπει να ξαναφορτώσετε από την αρχή όλα τα packages τα οποία είναι απαραίτητα για την ανάλυσή σας και ότι πρέπει να ξαναδηλώσετε το working directory...

Ο δεύτερος τρόπος είναι πιο απλός και σύντομος και περιλαμβάνει μόνο το παρακάτω command:


Το command αυτό διαγράφει μόνο τα variables που περιέχει το workspace αφήνοντας το απολύτως κενό χωρίς όμως να επηρεάζει τα loaded packages ή άλλα preferences που σχετίζονται με το current session θέλει όμως προσοχή στην χρήση του καθώς όπως είπαμε διαγράφει πλήρως το workspace...

Δευτέρα, 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...