Spark SQL - ROWID 대체
Spark SQL에서 Oracle의 ROWID와 같은 기능을 사용해보자 한다. ROWID는 인덱스의 핵심이라고도 하는데, 이를 활용하여 중복제거, 유일성 부여 등의 작업이 가능하다.
Oracle ROWID ?
- Oracle에서 Index를 생성하기 위해 내부적으로 사용하는 pseudo column이다.
- 사용자가 임의로 변경, 삭제가 불가하다.
- 테이블의 컬럼처럼 참조만 가능, DB에 값이 저장되지는 않는다.
with Spark SQL
스파크에서는 monotonically_increasing_id
를 활용하여 비슷하게 만들 수 있다.
spark.read.json("examples/src/main/resources/people.json").createOrReplaceTempView("df")
spark.sql("select * from df").show()
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+
val df = spark.sql("select * from df").
withColumn("rowId", monotonically_increasing_id())
df.show()
+----+-------+-----+
| age| name|rowId|
+----+-------+-----+
|null|Michael| 0|
| 30| Andy| 1|
| 19| Justin| 2|
+----+-------+-----+
혹은 row_number()
을 이용할 수도 있을 것 같다. 성능은.. 모르겠다.
spark.sql("""
SELECT *
,row_number() over (order by name) as rnk
FROM df
""").show()
+----+-------+---+
| age| name|rnk|
+----+-------+---+
| 30| Andy| 1|
| 19| Justin| 2|
|null|Michael| 3|
+----+-------+---+
Leave a comment