Documente Academic
Documente Profesional
Documente Cultură
User: maria_dev
Parola: maria_dev
Navigăm folosind HDFS Files în /user/<banuta_adriana>. Dacă directorul nu există îl putem construi
folosind opțiunea New directory (dreapta-sus).
In arhivă există aplicația foxe.exe care poate fi folosită pentru vizualizarea fișierelor XML.
Utilizator: root
Parola: masterbdsa
Putem considera HDFS o partiție separată de sistemul local de fișiere (al MV cu linux) care poate fi
accesată folosind interfața web sau instrucțiuni din linia de comandă de tipul hdfs dfs. Spre exemplu,
pentru a afișa fișierele și directoarele din rădăcina HDFS putem folosi următoarea comandă:
hdfs dfs -ls /
Construirea unui director în HDSF se poate realiza astfel:
hdfs fsck /
Pentru a copia un fișier din sistemul de fișiere gazdă în directorul /user/banuta_adriana din HDFS se
poate folosi următoarea comandă:
hdfs-agent.sinks.hdfs-write.hdfs.path = /user/banuta_adriana/flume
hive
Hive este o soluție open-source pentru gestionarea depozitelor de date care rulează într-un mediu
Hadoop. Datele în Hive sunt organizate în tabele care pot fi partiționate în bucăți mai ușor de gestionat.
Hive implementează un limbaj de interogare tip SQL denumit HiveQL.
În Hive există două tipuri de tabele: interne (numite și managed) și externe. Cele interne (tipul implicit)
sunt create într-un subdirector din directorul declarat în parametrul hive.metastore.warehouse.dir din
hive-site.xml (stocat în /etc/hive/2.4.0.0-169/0/hive-site.xml pentru versiunea folosită în acest seminar).
Implicit acest director este: /apps/hive/warehouse.
Tabelele sunt organizate în baze de date, acestea fiind mai degrabă un catalog de tabele. Baza de date
implicită este default iar tabelele sale sunt construite în rădăcina directorului implicit. Putem crea o nouă
bază de date folosind comanda:
SHOW DATABASES;
Afișare director bază de date:
USE <nume_baza_de_date>;
Afișare tabele din baza de date curentă:
SHOW TABLES;
Afișare coloane dintr-o tabelă:
DESCRIBE <nume_tabela>;
Când se șterge o tabelă internă (drop nume_tabelă), Hive va șterge automat și fișierele de date, nu
același lucru se întâmplă pentru tabelele externe. Ambele tipuri de tabele pot fi procesate și cu alte
utilitare (spre exemplu Pig) dar tabelele interne aparțin lui Hive iar procesarea lor cu alte utilitare poate fi
mai dificilă din cauza drepturilor de acces. Pentru a vedea tipul unei tabele, putem folosi comanda
DESCRIBE EXTENDED <nume_tabelă>:
... tableType:MANAGED_TABLE) -> tabele interne
... tableType:EXTERNAL_TABLE) -> tabele externe
Construim tabela flume_example în baza de date default care va avea pe fiecare rând câte un rând din
fișierele din /user/banuta_adriana/flume_example:
hive>
CREATE EXTERNAL TABLE IF NOT EXISTS flume_example (record
string)
ROW FORMAT DELIMITED
LINES TERMINATED BY '\n'
LOCATION '/user/banuta_adriana/flume';
Durează cam 40 de secunde.
select INPUT__FILE__NAME,
f.* from flume_example f limit 3;
hdfs://sandbox.hortonworks.com:8020/banuta_adriana/flume/FlumeD
ata.1479745518580 <record><Customer>Jolie A.
Hoffman</Customer><Email>lectus@vulputateeu.edu</Email><Purchas
eDate>1368111464</PurchaseDate><Price>472</Price><FlightsAvaila
ble>97, 13</FlightsAvailable></record>
hdfs://sandbox.hortonworks.com:8020/banuta_adriana/flume/FlumeD
ata.1479745518580 <record><Customer>Leroy J.
Fox</Customer><Email>mattis.ornare.lectus@Vestibulumanteipsum.o
rg</Email><PurchaseDate>1335377562</PurchaseDate><Price>203</Pr
ice><FlightsAvailable>7, 67, 41, 43,
3</FlightsAvailable></record>
hdfs://sandbox.hortonworks.com:8020/banuta_adriana/flume/FlumeD
ata.1479745518580 <record><Customer>Evangeline Z.
Davenport</Customer><Email>Sed.malesuada.augue@consectetuereuis
modest.org</Email><PurchaseDate>1383190668</PurchaseDate><Price
>611</Price><FlightsAvailable>97,
67</FlightsAvailable></record>
Print Screen
Pentru a vizualiza data achiziției (UNIX TIMESTAMP) și zborurile disponibile la acel moment:
SELECT from_unixtime(xpath_int(record,
"/record/PurchaseDate")), xpath_string(record,
"/record/FlightsAvailable") FROM flume_example limit 30;
Putem ordona după PurchaseDate:
set hive.execution.engine=mr;
Rulăm din nou interogarea (obervam diferenta fata de Tez).
set hive.execution.engine=tez;
Pentru a afla de câte ori a fost oferit fiecare zbor la o dată anume:
Exerciții:
- Afișați doar primele 30 rânduri în ordinea descrescătoare a numărului de câte ori a fost oferit un
zbor la o data anume – interogare + print screen
SELECT FROM_UNIXTIME(purchase_date), flight_no,
LIMIT 30;
- Să se afișeze datele când un anumit zbor a fost oferit de 4 ori – interogare + print screen
HAVING flight_no = 4;
Hive suportă comenzile LMD (daca se activeaza ACID): INSERT, UPDATE, DELETE. Încărcarea unui volum
mai mare de date putându-se realiza și folosind comanda LOAD DATA.
Putem scrie instrucțiuni și le vom executa, selectând instrucțiunea și apăsând mai apoi butonul Execute:
Notă: Din cauza drepturilor de acces, ultima instrucțiune va rula doar din interfața web, nu și din linia de
comandă, unde se va primi eroarea:
describe cotatii.cotatii_nyse_2010;
select * from cotatii.cotatii_nyse_2010 limit 10;
select stock_symbol, round(avg(stock_volume),2) avg_stock from cotatii.cotatii_nyse_2010
group by stock_symbol;
select stock_symbol, round(avg(stock_volume),2) avg_stock from cotatii.cotatii_nyse_2010
group by stock_symbol having round(avg(stock_volume),2) >50000;
Print Screen
select c.tdate data_cotatie,CURRENT_DATE data_curenta,
CAST(datediff( from_unixtime( unix_timestamp() ), from_unixtime( unix_timestamp(c.tdate,
'YYYY-MM-DD'))) / 365 AS INT) nr_ani from cotatii.cotatii_nyse_2010 c limit 100;
select * from cotatii.cotatii_nyse_2010 where stock_volume= (select max(stock_volume) from
cotatii.cotatii_nyse_2010); -- nu merge, Hive nu acceptă funcții de grup în sub-interogări, poate
fi rescrisă astfel:
o select c.* from cotatii.cotatii_nyse_2010 c join (select max(stock_volume) max_v from
cotatii.cotatii_nyse_2010) m where c.stock_volume=m.max_v;
sau
o select * from cotatii.cotatii_nyse_2010 order by stock_volume desc limit 1;
Print Screen
Exerciții:
1. Folosind tabela cotatii.cotatii_nyse_2010, să se afișeze pentru simbolul AIT, cotațiile pentru zilele
în care volumul tranzacționat (stock_volume) este mai mare decât media pentru AIT.
2. Să se genereze de pe site-ul BNR o serie de date zilnice pentru cursul valutar:
http://www.bnr.ro/Baza-de-date-interactiva-604.aspx#.
Fișierul se va genera în format CSV și va fi transformat folosind Excel sau alt instrument în Tab
Separated File. Cu un editor de text (notepad sau vi) se vor elimina primele 4-5 rânduri (până la
rândul care începe cu Data). Se va încărca fișierul în HDFS folosind File Browser și se va construi,
folosind o instrucțiuni CREATE TABLE, o tabelă cotatii_bnr în baza de date cotatii. Datele se vor
încărca cu LOAD DATA. Observație: pentru ca datele numerice sa fie corect încărcate este
necesar ca virgula să fie înlocuită cu punct în fișierul text, înainte de a fi încărcat. Daca
separatorul dintre campuri nu este TAB ci ; sau , se va folosi CREATE TABLE ... FIELDS
TERMINATED BY '\;' ... – Instrucțiune CREATE TABLE + LOAD
create table cotatii.bnr(Data string, CURSZ_AUD float, CURSZ_CAD float, CURSZ_CHF float,
CURSZ_CZK float, CURSZ_DKK float, CURSZ_EGP float, CURSZ_EUR float, CURSZ_GBP float,
CURSZ_HUF float, CURSZ_JPY float, CURSZ_MDL float, CURSZ_NOK float, CURSZ_PLN float,
CURSZ_SEK float, CURSZ_TRY float, CURSZ_USD float, CURSZ_XAU float, DST_CURSZ_XDR float,
URSZ_RUB float, CURSZ_SKK float, CURSZ_BGN float, CURSZ_ZAR float, CURSZ_BRL float,
CURSZ_CNY float, CURSZ_INR float, CURSZ_KRW float, CURSZ_MXN float, CURSZ_NZD float,
CURSZ_RSD float, CURSZ_UAH float, CURSZ_AED float, CURSZ_HRK float, CURSZ_THB float)
ROW FORMAT DELIMITED FIELDS TERMINATED by '\t' stored as textfile tblproperties
("skip.header.line.count"="1");
LOAD DATA INPATH '/banuta_adriana/bnr_good.csv' OVERWRITE INTO TABLE cotatii.bnr;
4. Folosind HiveQL să se afișeze media cotațiilor pentru USD în anul 2014 –Interogare
select to_date(from_unixtime(UNIX_TIMESTAMP(data,'dd.MM.yyyy')))
Bibliografie: