Değerli KD okuyucuları, bu makalemizde Hive Query Language(HiveQL) ile bir veri ambarı yönetimi ve sorgulaması esnasında karşılaşabileceğiniz ve daha çok şemasal başlangıçlar için sorgulara ait detayları inceleyeceğiz. Önceki makalemde belirttiğim gibi HiveQL, T-SQL diline çok benzer bir
yazım şekli ile çalışıyor. Bu nedenle bu konu Big Data ile ilk tanışanlar için önemli. Çünkü geleneksel yöntemlerden gelenlerin hızlı adapte olabilmesi için çok yararlı bir araç.

Veri Türleri

Hive içerisinde en çok kullanılan veri türleri ilkel olan türlerdir. Bu türler bir çok programlama dili ve veritabanı içerisinde karşılaştığımız türlerdir.

Sayısal Türler; TINYINT, SMALLINT, INT ve BIGINT olarak dört farklı şekilde kullanılabilir.

Metinsel Türler; VARCHAR ve CHAR olmak üzere iki farklı şekilde kullanılabilir. VARCHAR türünün uzunluğu 1 ile 65355 aralığında olabilir. CHAR türü ise 1 ile 255 aralığında olabilir.

Tarihsel ve Zamansal Türler; Timestamp ve DATE olarak iki farklı şekilde kullanılır. Timestamp türü UNIX Timestamp değerinde olabilir ve içerisinde tarih-saat şeklinde değerler saklar. Kullandığı format tipi ise klasik java.sql.Timestamp namespace’ ile aynıdır. YYYY-MM-DD HH:MM:SS.fffffffff yada yyyy-mm-dd hh:mm:ss.ffffffffff olur.
DATE tipi yıl/ay/gün formatında olabilir. Yani YYYY-MM-DD şeklinde.
Basamaklı Sayılar; Java içerisinde Big Decimal olarak adlandırılan tür ile aynıdır. Ondalıklı/küsürlü sayılar için kullanılan türdür. Yazım şeklinde DECIMAL(12,2) şeklinde kullanılır.

Birleşik Türler; Birden fazla türün kombine edildiği türlerdir. Kendi yapısal türlerimizi bu tür ile tanımlayabiliriz.

UNIONTYPE<string, int, struct<P1:int,P2:decimal>>
{"Ali":18:{"P1":25,"P2":16.9}} 
{"Merve":5:{"P1":49,"P2":29.85}} 

UNIONTYPE<string, date, array<string>>
{"Apache Hadoop":"2016/5/2":["Hadoop","Big Data","Apache"]}
{"Derinlemesine MapReduce":"2016/5/27":["Hadoop","Big Data","MapReduce"]}
{"Apache Hive":"2016/6/30":["Hive","Data Warehouse","MapReduce"]}

Boş Türler;NULL değerini alan türlerdir. Bildiğimiz NULL 🙂

İlkel türler’den bahsettik. Bunun yanında kompleks olan türler de vardır.

Array Türü; Yukarıda ki birleşik tür örneğinde kullandığımız tür. Görüldüğü üzere geleneksel veritabanı modellerinde bu tarz işlemler için dış bir tabloya ihtiyacınız varken Hive ile sorgulamalarınızda böyle bir tür ile işiniz oldukça kolaylaşıyor.

Maps Türü; Birleşik türde olduğu gibi bu türde birden fazla türü kombine edilerek oluşturulur. Fakat burada key-value olarak davranış sergiler. Kompleks türler içerisinde en gelişmiş olanı bu denebilir.

Struct Türü; Bağımsız bir yapı oluşturabileceğiniz türlerdir. Sütun bilgisi ve veri tipi bilgisi içerir. Aynı zamanda bu tür için yorum alanı mevcuttur.

Tablo İşlemleri

Tablo Oluşturmak, Veri Yüklemek, Düzenlemek ve Silmek

HiveQL ile bir tablo oluşturmak SQL dilinden biraz farklı. Önceki makalemizde hatırlayacağınız üzere CREATE komutundan sonra bir takım komutlar daha eklemiştik. Hive içerisinde alanların ve satırların nasıl ayrıştığını belirtmemiz gerekiyor.

CREATE TABLE IF NOT EXISTS Makaleler 
(Id int, Baslik String,
Icerik String, Tarih DATE)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t
LINES TERMINATED BY ‘\n
STORED AS TEXTFILE;

Burada demek istenen sütunların “\t” yani Tab ile ayrıştığı, satırların “\n” yani satır başı ile ayrıştığı belirtiliyor. Son olarakta bir metin belgesi formatında saklanacağı belirtiliyor. Hadoop ve beraberinde ki envanterlerin en güzel yönlerinden birisi budur. Kullanmak için geleneksel veritabanlarında olduğu gibi
güçlü bağıntıları olan yapısal envanterlere ihtiyacınız yok.

Veri yüklemek için de basit komutlar yardımı ile tabloya veri aktarımı yapılabilir.

LOAD DATA LOCAL INPATH '/user/hive/makaleler.txt'
OVERWRITE INTO TABLE Makaleler;

Burada dikkat çekmek istediğim nokta eğer aksi koşul belirtilmedikçe veri yüklemesi yapılacak konumun, yani “makaleler.txt” dosyasının HDFS altında olduğudur. Dolayısıyla yüklemek için dosyayı HDFS’e atmanız lazım.

Tabloyu düzenlemek için ALTER komutunu kullanmak gerekir. Tablo adı veya herhangi bir sütunun ismini, veri tipi değiştirilebilir. Yada tamamen silinebilir.

ALTER TABLE Makaleler RENAME TO Articles
ALTER TABLE Makaleler ADD COLUMNS (Etiketler array<string>, Puan DECIMAL)
ALTER TABLE Makaleler DROP [COLUMN] Puan
ALTER TABLE Makaleler CHANGE Puan Point INT
ALTER TABLE Makaleler REPLACE COLUMNS (Id INT MakaleId INT, Baslik String Title String)

Bir tabloyu silmek için DROP komutu kullanılır.

DROP TABLE IF EXISTS Articles;

 

Bölümlendirme

Hive için yazılan SQL benzeri kodları MapReduce işlemlerine dönüştürdüğünü belirtmiştik. Java içerisinde MapReduce algoritmalarını yazarken nasıl verileri bölümlendirebiliyorsak, aynı işlemi Hive’da da yapabiliriz.
Şimdi NYSE verisetine dönecek olursak elimizde yığınla stok verisi var ve hiç stokta olmayan bir ürünü her defasında sorgulamak yerine olanlar-olmayanlar şeklinde gruplandırmak ve ayrı dosyalar olarak almak istiyoruz. Bu durumda şöyle bir yöntem izleriz. Öncelikle bu işlemi yapabilmek için tablonun oluşturulma
esnasında bölümlendirilmiş olması gerektiğini söyleyelim. Bunu ilk seferde yapmadık. O nedenle tabloyu önce silelim ve tekrar oluştururken bölümlendirme özelliği ile yapalım.

create table stock(id int, stock_symbol string, stock_date date, price_open double, 
price_high double, price_low double, price_close double, stock_volume
int, price_adj_close double) PARTITIONED BY  (sv INT) row format delimited fields terminated by ',' stored 
as textfile;

Veriyi yüklerkende hangi bölümlendiriciyi kullandığımızı belirterek tamamlıyoruz.

load data inpath '/user/hive/warehouse/noStock.csv' overwrite into table stock PARTITION(sv = 0);

Sonraki makalemde verilerin tamamı ile çalışırken neleri kullanacağımza değineceğiz. Görüşmek üzere…

Facebook'dan yorumla