dplyr로 작성할 수있는 RedshiftSQL!

12822 단어 dplyrRredshift
이 기사는 모집 라이프 스타일 Advent Calendar 2016의 24 일째 기사입니다.

데이터 엔지니어링 그룹 유루후와 Awesome 기계 학습 엔지니어의 tomomoto입니다. 폐사는 리어충이 많아, 24일만 캘린더가 비어 있는 상태였기 때문에, 24일 12시 53분 현재로부터 몇 안되는 리어충이 아닌 엔지니어로서 Qiita 기사를 쓰기 시작하고 있습니다.

이 기사에서는 JapanR2016에서 발표 한 LT 재료의 dplyr로 작성할 수있는 RedshiftSQL에 대해 쓰고 싶습니다. (새로운 재료 생각할 시간은 없습니다!)

dplyr로 작성할 수 있는 RedshiftSQL



dplyr은 R 언어 라이브러리로, 파이프(%/%)를 사용하여 데이터 처리를 쉽게 작성할 수 있는 하나님 라이브러리입니다. 사실 이 신 라이브러리를 사용하여 SQL을 쓰지 않아도 직접 Redshift에 SQL을 던질 수 있습니다! 이미지는 아래와 같은 느낌입니다.

사용법



코드를 작성하는 방법은 다음과 같습니다. 네, 간단하죠?

connect_rs.R
library(dplyr)
library(RPostgreSQL)
myRedshift <- src_postgres(
 dbname="hoge",
    host = "XXX.XXX.XXX.XXX",
    port = XXX,
    user = "hoge_hoge",
    password = "hoge_hoge_hoge",
    options="-c search_path=hoge_schema_name")

rs_table <- tbl(myRedshift, from ="hoge_table")

rs_table %>% dplyr::filter(hoge_column = "abcd")

어떤 SQL로 변환되고 있습니까?



그럼 실제로 dplyr의 코드가 어떻게 변환되고 있는지 알아봅시다!
rs_table
SELECT * FROM hoge_table
rs_table %>% 
select(a)
SELECT a AS a FROM hoge_table
rs_table %>%
select(starts_with("a"))
SELECT a AS a, a_1 AS a_1
FROM hoge_table
rs_table %>%
filter(hoge_no="33")
SELECT * FROM hoge_table
WHERE (hoge_no = '33') 
rs_table %>%
head(3)
SELECT * FROM hoge_table
LIMIT 3 
rs_table %>%
select(a) %>%
head(3) 
SELECT * FROM
(SELECT a AS a FROM hoge_table) xauvngdbsq
LIMIT 3 
rs_table %>%
  group_by(a) %>%
  summarise(cnt=length(a)) 
SELECT a, LENGTH(a) AS cnt
FROM hoge_table
GROUP BY a 
rs_table %>%
  group_by(a) %>%
  summarise(cnt=length(a)) %>%
  arrange(desc(cnt)) 
SELECT * FROM
(SELECT a, LENGTH(a) AS cnt FROM hoge_table GROUP BY a)
hjvzhxrrld
ORDER BY cnt DESC
innerjoin(rs_table, rs_table, by=a)
SELECT * FROM (SELECT a AS a, ..... FROM hoge_table) uqhggwfohi
INNER JOIN
SELECT * FROM (SELECT a AS a, ..... FROM hoge_table) npoulssyev
USING (a)
rs_table %>%
mutate(row_number=row_number(desc(a)))
SELECT a, b, ...,
row_number() OVER (ORDER BY a DESC) AS row_number
FROM hoge_table
rs_table %>%
group_by(b) %>%
mutate(row_number=row_number(desc(a)))
SELECT a, b, ...,
row_number() OVER (PARTITION BY b ORDER BY a DESC) AS row_number
FROM hoge_table

요약


  • dplyr 역시 하나님! (기술 량 감소)
  • 데이터를 줄이는 처리를 가능한 한 앞에 (서브 쿼리로 분할해 버리므로・・・, 안 되네요)
  • 함수계는 Redshift라면 대체로 담보(해 그렇게)
  • Join 처리의 SQL은, 상당히 잡잡. 스스로 쓰는 것이 좋을지도 모른다.

  • 마지막으로



    현재 13:11! 의외로 시간 걸리지 않고 쓸 수 있는 것이군요. 여러분은 미리 써 주세요. 내일은 제가 미리 준비한 기사입니다.

    좋은 웹페이지 즐겨찾기