Azure/Databricks
Databricks, Delta Table 생성 및 데이터 삽입/수정/삭제, 테이블 삭제
helenaaaaa
2022. 12. 23. 12:37
Delta Lake는 Databricks로 만든 모든 테이블의 기본 형식이다.
Databricks에서 SQL문을 실행했다면, 이미 Delta Lake로 작업중 !
Delta Lake는 Azure Databricks에서 만든 테이블의 기본 스토리지 공급자이므로
Databricks에서 만든 모든 테이블은 기본적으로 Delta 테이블!
테이블 생성
✔ 관리되는 테이블
- Azure Databricks는 관리되는 테이블에 대한 [메타데이터], [데이터] 모두 관리함. 따라서 테이블 삭제 시, 기본 데이터도 삭제
- 관리되는 테이블의 데이터는 등록된 데이터베이스의 LOCATION에 있다.
- Databricks Runtime 8.0 이상에서는 Delta Lake가 기본 형식이며 **`USING DELTA`**가 필요하지 않다.
CREATE TABLE students (id INT, name STRING, value DOUBLE);
/* CREATE TABLE IF NOT EXISTS students (id INT, name STRING, value DOUBLE) */
✔ 관리되지 않는 (외부) 테이블
- Azure Databricks는 관리되지 않는 (외부) 테이블에 대한 [메타데이터]만 관리함. 따라서 테이블 삭제 시, 기본 데이터에 영향 주지 않음.
- 관리되지 않는 테이블을 생성할 때는 항상 LOCATION을 지정한다.
- 테이블이라는 껍데기 형태만 데이터브릭스에 존재하고, Location 하위 경로에서 데이터를 가져온 형태라고 이해하자. 그래서 LOCATION에서 지정한 외부 경로의 데이터가 바뀌는 경우, 따로update 작업해주지 않아도 해당 테이블을 select하면 변동된 데이터가 조회된다.
create table delta_new( num int, name string, date date )using delta LOCATION '[경로]'
create table delta_newtable( num int, name string, date date )using delta
LOCATION '/mnt/flightdata/newtable/'
--mount한 /mnt/flightdata 하위에 newtable 폴더 생성 후 저장
⚠ LOCATION ‘[경로]’ : 기존에 존재하는 경로를 써줘도 되고, 새 폴더명을 써주면 생성과 동시에 해당 위치에 저장된다.
아무것도 써주지 않을 경우 DEFAULT 경로에 저장됨.
mount한 스토리지 경로로 지정하면, Azure Portal에서 폴더가 생긴다. 만약 해당 테이블에 데이터가 추가되면 파일까지 생긴 것을 확인할 수 있다.
데이터 추가, 변경, 삭제
⚠ Databricks는 COMMIT 가 없다.트랜잭션이 구문이 수행되는 순간에 실행되고 성공하면 바로 commit이 된다.
1) INSERT
INSERT INTO delta_newtable VALUES(1, 'MADS', CURRENT_DATE());
INSERT INTO students VALUES (1, "Yve", 1.0);
INSERT INTO students VALUES (2, "Omar", 2.5);
INSERT INTO students VALUES (3, "Elia", 3.3);
/* INSERT INTO students VALUES (4, "Ted", 4.7), (5, "Tiffany", 5.5), (6, "Vini", 6.3)1) */
2) SELECT
SELECT * FROM delta_newtable;
SELECT * FROM students;
⚠ Delta Lake가 테이블에 대한 모든 읽기가 항상 최신 버전의 테이블을 반환하고, 진행 중인 작업으로 인해 교착 상태가 발생하지 않도록 보장한다.
⚠ 테이블을 읽을 때, 다른 작업과 충돌할 수 없으며, 최신 버전의 데이터는 Lakehouse를 쿼리할 수 있는 모든 클라이언트에서 즉시 사용가능하다.
⚠ 모든 트랜잭션 정보가 데이터 파일과 함께 클라우드 개체 저장소에 저장되기 때문에, Delta Lake 테이블을 동시에 읽는 것은 클라우드 개체 저장소에 대한 엄격한 제한에 의해서 제한된다. (참고: 무한은 아니지만, 초당 적어도 수천번 읽는다.)
3) UPDATE
UPDATE students SET value = value + 1 WHERE name LIKE "T%";
4) MERGE
CREATE OR REPLACE TEMP VIEW updates(id, name, value, type) AS VALUES
(2, "Omar", 15.2, "update"),
(3, "", null, "delete"),
(7, "Blue", 7.7, "insert"),
(11, "Diya", 8.8, "update");
SELECT * FROM updates;
- 데이터를 추가, 변경, 삭제하기 위해서 각각의 구문을 실행하는 방법도 있으나, 이럴 경우 3개의 개별 트랜잭션이 발생한다. 이 때 하나라도 실패하게 되면, 데이터가 잘못된 상태로 남아있을 수도 있다.
- 이 작업들을 결합하여 3가지 유형의 변경작업을 한번에 적용해보기로 한다.
- MERGE문에는 일치시킬 필드가 하나 이상 있어야 하며, 각 WHEN MATCHED / WHEN NOT MATCHED 절에는 조건문이 여러개 추가될 수 있다.
MERGE INTO students b
USING updates u
ON b.id=u.id
WHEN MATCHED AND u.type = "update"
THEN UPDATE SET *
WHEN MATCHED AND u.type = "delete"
THEN DELETE
WHEN NOT MATCHED AND u.type = "insert"
THEN INSERT *
5) DELETE
DELETE FROM students WHERE value > 6 ;
테이블 삭제
DROP TABLE students; /*현재까지 진행한 테이블과 파일들을 삭제*/ %python DA.cleanup()