A-Z Data Engineering

 Data Engineering (A-Z)


Airflow — Programmable DAG based job scheduler, a very popular Apache project


BigQuery — Google’s serverless datawarehose that competes with Redshift and Azure DW


Cassandra — distributed NoSQL database popular for columnar storage capabilities


Databricks — a web-based platform for working with Spark and more


ETL — extract from source, transform, load into destination


Flink — distributed processing engine for data streams


Glue — large scale serverless ETL, data pipelining solution from AWS


Hadoop — big data processing framework comprising of MapReduce, YARN and HDFS


InfluxDB —very popular timeseries database


JSON —the de facto data transportation format over the internet


Kafka — LinkedIn’s distributed streaming framework


Looker — Google’s latest browser based BI tool


MongoDB — very popular open source NoSQL database


NoSQL — group of database technologies which are more than relational databases


Oozie — DAG based workflow scheduler for Hadoop jobs


PostgreSQL — programmers’ favorite open-source database


Query Engine — the piece of software that executes queries against a dataset


Redshift — most popular managed, petabyte scale data warehousing solution


SQL — the language that data speaks


Terraform — the de facto Infrastructure-as-code product by HashiCorp


Unstructured Data — data without a schema or a pre-defined structure


View —unpersisted database object represented by a SQL query


Wrangling — cleaning the data, making it ready for analysis


Xplenty — integrations platform to extract data out of various cloud apps and move data


YARN — resource manager for Hadoop ecosystem (used for MapReduce and Spark)


Zookeeper — centralized configuration management service


Do you know them all? What would you change?


ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION Hatası

ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION


ORACLE-BASE - Create Table for Exchange With a Partitioned Table in Oracle  Database 12c Release 2 (12.2)

2 tablo arasında kolon sayısı ,kolon tipleri,kolonların sırası farklı ise bu hata alınabilir.
Burada 2 tablo 1’e-1 eşitlenerek çözüm bulunabilir.

Fakat 2 tablo arasında yukarıda belirtilen farklarından hiçbiri yok ise ve dışarıdan bakıldığında
tablolar arasında hiçbir fark görülemiyorsa o zaman tablolarda
add/drop column yapılmasından kaynaklı unused kolonların olması ihtimalini düşünmeliyiz.


Not : Tablo partition lı değilse aşağıdaki scripti çalıştırılarak  unused kolonlar drop edilebilir.

Eğer tablolarda partition  varsa aşağıdaki script çalışmayacaktır çünkü MOVE işlemi hata alacaktır.

              ALTER TABLE XX.table_1 NOCOMPRESS;

          ALTER TABLE XX.table_1 DROP UNUSED COLUMNS;

ALTER TABLE XX.table_1 MOVE PARALLEL 4 NOLOGGING;


ALTER TABLE XX.table_2 NOCOMPRESS;

ALTER TABLE XX.table_2 DROP UNUSED COLUMNS;

ALTER TABLE XX.table_2 MOVE PARALLEL 4 NOLOGGING;

                Bu hata alındığında yapılması gereken şey ; UNUSED olan kolonların sayısının ve sırasının yine aynı                   şekilde veritipinin aynı olmasının sağlanmasıdır.


SELECT * FROM sys.dba_tab_cols   🡪unused kolonları görebileceğimiz tablo

WHERE TABLE_NAME ='table_2'  🡪bu tablo partitionlı ve unused kolonlar var

AND OWNER='XX'

ORDER BY INTERNAL_COLUMN_ID; ----ÇOK ÖNEMLI, BU KOLONDAKI SIRAYA GÖRE DIĞER TABLODA(table_1) BU YARATILAN KOLONLAR UNUSED OLARAK SET EDILMELIDIR.


Yani asıl yüklemenin yapılacağı tabloyu referans alarak unused kolonlar

ekleyebilir ya da drop edebiliriz.

Bir örnek üzerinden gidecek olursak temp tablomuzda unused kolon olmadığını varsayalım fakat datayı Exchange edeceğimiz tabloda(table_2) unused kolonlar olsun bu durumda yapılması gereken şey referans aldığımız tablodaki kolonları aynı sıra/tip/adet olacak şekilde tabloyu drop/create edip sonrasında bu kolonları UNUSED olarak işaret etmektir.

D:\Users\bdelice\Desktop\blogyazısı_1.PNG

Burada SYS_ ile başlayan kolonların daha önceden bu tabloda eklenen

ya da drop edilen kolonlar olduğunu biliyoruz artık.


DROP TABLE XX.table_1;

CREATE TABLE XX.table_1

(

...

PARA_KOD varchar2(100),

SYS_C00092 NUMBER(30,6),

PARA_BIRIMI number,

SYS_C00093 NUMBER(30,6),

SYS_C00094 NUMBER(30,6),

SYS_C00095 NUMBER(30,6)

....

);

GRANT SELECT ON XX.table_1 TO ROLE_1;


Eğer test – preprod –prod gibi farklı ortamlarınız varsa tavsiyem test ve

preprod ortamında tabloları unused kolonlar var gibi direkt taşımanız ,

prod ortamda sadece aşağıdaki scripti çalıştırmanız olacaktır.


ALTER TABLE xx.table_1 SET UNUSED (SYS_C00097,                                SYS_C00049,SYS_C00050,SYS_C00051,SYS_C00145, SYS_C00093,

SYS_C00094,SYS_C00095,SYS_C00092);

 

Not : Unused kolonları isimlendirme konusunda bir kısıtımız yok örneğin

ben SYS_C00092 vb  gibi yeni kolonlar oluşturdum.

Bu işlemi de yaptıktan sonra unused kolonlar da dahil olacak şekilde kontrol sağlanmalı

iki tabloda 1-1 eşitllik görülürse exchange adımına geçilebilir.


              alter table XX.table_2 exchange partition P_20221120 with table  XX.table_1;

Excel de LookUp Nasıl Yapılır?

 Excel de lookup ;

İlk örnekte E sütunundaki değerler G sütununda aranıyor E3:E8;G3:G12

Daha sonra index 1 veriyoruz ilk sütun(G sütunu) ile karşılaştırdığımdan 

En son eşleşenleri getir derken de ;0 yazılır. 


İkinci örnekte I sütunudaki değerler F sütununda var mı diye kontrol edilerek 2 nci sutun(index) a göre tek ya da çift yazdırılıyor.





 Oracle 19c Sequance yaratmadan Auto Number Verme

Eskiden bir kolona sequence üretip her defasında nextval ile alıp kullanıyorduk.

Oracle bu tip kolonu database seviyesinde üretme özelliğini getirdi. Yani sequence yaratmanıza gerek kalmıyor.

 

1 ) GENERATED ALWAYS AS IDENTITY  è alttaki gibi kendi sequenceten üretiyor sen kolona değer atamıyorsun

CREATE TABLE identity_demo (id NUMBER GENERATED ALWAYS AS IDENTITY, description VARCHAR2(100) NOT NULL);

INSERT INTO identity_demo(description) VALUES('Oracle identity column demo with GENERATED ALWAYS');

INSERT INTO identity_demo(description) VALUES('Oracle identity column demo with GENERATED ALWAYS');

-- INSERT INTO identity_demo(id,description) VALUES(2, 'Oracle identity column example with GENERATED ALWAYS ');

 

1

Oracle identity column demo with GENERATED ALWAYS

2

Oracle identity column demo with GENERATED ALWAYS

 

2 ) GENERATED BY DEFAULT AS IDENTITY è kendi sequenceten üretiyor ama sen değer de atayabiliyorsun

CREATE  TABLE identity_demo (id NUMBER GENERATED BY DEFAULT AS IDENTITY,  description VARCHAR2(100) not null);

INSERT INTO identity_demo(description) VALUES('Oracle identity column demo with GENERATED BY DEFAULT');

INSERT INTO identity_demo(id,description) VALUES(2, 'Oracle identity column example with GENERATED BY DEFAULT');

--INSERT INTO identity_demo(id,description) VALUES(NULL, 'Oracle identity column demo with GENERATED BY DEFAULT, NULL value');

 

1

Oracle identity column demo with GENERATED BY DEFAULT

2

Oracle identity column example with GENERATED BY DEFAULT

 

3 ) GENERATED DEFAULT ON NULL AS IDENTITY è kendi sequenceten üretiyor ama sen değer de atayabiliyorsun. NULL atarsan kendi ürettiğini atıyor

CREATE  TABLE identity_demo  (id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, description VARCHAR2(100) not null);

INSERT INTO identity_demo(description) VALUES('Oracle identity column demo with no value');

INSERT INTO identity_demo(id,description) VALUES(NULL, 'Oracle identity column demo with null');

INSERT INTO identity_demo(id,description) VALUES(3, 'Oracle identity column demo with null');

 

1

Oracle identity column demo with no value

2

Oracle identity column demo with null

3

Oracle identity column demo with null

 

4 ) GENERATED DEFAULT ON NULL AS IDENTITY START WITH è Belli bir sayıdan başlayarak kendi sequenceten üretiyor ama sen değer de atayabiliyorsun. NULL atarsan kendi ürettiğini atıyor

CREATE  TABLE identity_demo  (id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY START WITH 100, description VARCHAR2(100) not null  );

INSERT INTO identity_demo(description) VALUES('Oracle identity column demo with START WITH option');

INSERT INTO identity_demo(id,description) VALUES(null,'Oracle identity column demo with START WITH option');

INSERT INTO identity_demo(id,description) VALUES(102,'Oracle identity column demo with START WITH option');

INSERT INTO identity_demo(description) VALUES('Oracle identity column demo with START WITH option');

 

100

Oracle identity column demo with START WITH option

101

Oracle identity column demo with START WITH option

102

Oracle identity column demo with START WITH option

102

Oracle identity column demo with START WITH option

 

5 ) GENERATED DEFAULT ON NULL AS IDENTITY START WITH 10 INCREMENT BY 10è Belli bir sayıdan başlayarak kendi sequenceten belli bir aralıkla değer üretiyor ama sen değer de atayabiliyorsun.NULL atarsan kendi ürettiğini atıyor.

CREATE  TABLE identity_demo (id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY START WITH 10 INCREMENT BY 10, description VARCHAR2(100) not null);

INSERT INTO identity_demo(description) VALUES('Oracle identity column demo 1 with INCREMENT BY option');

INSERT INTO identity_demo(id,description) VALUES(null,'Oracle identity column demo 2 with INCREMENT BY option');

INSERT INTO identity_demo(id,description) VALUES(11,'Oracle identity column demo 2 with INCREMENT BY option');

INSERT INTO identity_demo(description) VALUES('Oracle identity column demo 3 with INCREMENT BY option');

 

10

Oracle identity column demo 1 with INCREMENT BY option

20

Oracle identity column demo 2 with INCREMENT BY option

11

Oracle identity column demo 2 with INCREMENT BY option

30

Oracle identity column demo 3 with INCREMENT BY option

Kendime Notlar-1

Merhaba,

--Çalışan SELECT in tamamını görme ve çalışan kodun Statu durumunu öğrenmek için;

select sql_fulltext from gv$sql where sql_id = 'cuyrdgsssffjkku5c54z6777';

select s.* from gv$active_session_history a, gv$session s where a.sql_id = 'cuyrdgsssffjkku5c54z6777' and a.SESSION_ID = s.sid and S.username='xxxx';

NOT_EXISTS Performans Problemi

Merhaba,

NOT_EXISTS bazı durumlarda performans problemine neden olabilir.

Bu tarz bir durumda NOT_EXISTS ile yapılması istenen mantığın, aynı şekilde JOIN ile yazılması gerekir.


SELECT LAST_DAY (m.kst_trh)
FROM burhan.mvdt m
WHERE m.vdl_vds_acklm = 'Vadeli'
AND EXISTS (
SELECT 1 FROM burhan.firma m2
WHERE 1 = 1
AND m.kst_trh = m2.kst_trh
AND m.clsm_skl = m2.clsm_skl
AND m.firm_ortk_clsm_skl IN (2, 4, 5)
)
GROUP BY LAST_DAY (m.kst_trh);


Aşağıdaki gibi yazılarak NOT_EXISTS den kurtarılabilir.


SELECT LAST_DAY (m.kst_trh)
FROM burhan.mvdt m,
burhan.firma m2
WHERE m.vdl_vds_acklm = 'Vadeli'
AND m.kst_trh = m2.kst_trh(+)-->left gidilir.
AND m.clsm_skl = m2.clsm_skl(+)-->left gidilir.
AND NOT ( m2.kst_trh is not null and m2.clsm_skl is not null
AND m.firm_ortk_clsm_skl IN (2, 4, 5)
)
GROUP BY LAST_DAY (m.kst_trh);

Date Difference

2 farklı tarih arasındaki günleri getirebilmek için ;


SELECT to_date('01/10/2019','dd/mm/yyyy')+LEVEL-1 tarih
FROM DUAL
CONNECT BY LEVEL <= (to_date('17/10/2019','dd/mm/yyyy') - to_date('01/10/2019','dd/mm/yyyy')+1) order by 1 ;



2 farklı sayı arasındaki sayılar;

SELECT 10 + LEVEL as iki_sayı_arası_fark
FROM dual
CONNECT BY LEVEL <= 30-10