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|
+----+-------+---+

댓글남기기