Redash의 매개 변수 기능을 사용하여 Presto에서 SQL을 실행할 때 Tips
개요
당사에서는 마이크로서비스화나 국내·해외의 회사의 JOIN도 있어, SQL Server, MySQL, BigQuery, Hadoop, PostgreSQL, Elasticsearch 등, 서비스 마다 다양한 DB가 사용되고 있습니다.
그렇지만, 분석 업무, 데이터 추출 업무, 분석 기반의 운영을 하는 몸으로 하면 힘들군요...
따라서 우리는 Redash 데이터 소스에 Presto를 추가하고,
이기종의 DB를 가로지르는 데이터 분석·추출 업무에 활용하고 있습니다.
이번에는 Redash의 파라미터 기능을 사용하여 Presto에 SQL을 실행할 때 약간의 Tips를 몇 가지 소개합니다.
presto 뭐야? redash 뭐야?라는 분은 아래 링크에서
- Presto란 무엇이며 Presto에서 무엇을 할 수 있습니까? - Treasure Data
- 대시보드 도구 "Re:dash"란? 설치 방법에서 사용법까지 해설! 【초급편】 | SELECK
Redash에서 Date 형식의 매개 변수를 Presto로 보낼 때
SQL Server 등이라면 Redash GUI에서 매개 변수 유형을 Date 형식으로 설정하고,
이러한 SQL을 실행하면 성공적으로 결과를 얻을 수 있습니다.
redash_parameter_to_sqlserver.sql USE hoge
SELECT
*
FROM
guns g
WHERE
1=1
AND g.created_at <= {{作成日が何日以下か入力}}
그러나 이러한 SQL에서 Presto에 대해 실행하면 다음 오류가 반환됩니다.
error_redash_parameter_to_presto.sqlSELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.created_at <= {{作成日が何日以下か入力}}
errorcom.facebook.presto.sql.analyzer.SemanticException: line 3:20: '<=' cannot be applied to timestamp,integer
GUI에서 매개변수 유형을 Date 유형으로 설정했음에도 불구하고 integer로 수신됩니다.
그건 그렇고, Presto에서 다음 SQL이 실행됩니다.
error_on_presto.sqlSELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.created_at <= 2017-11-29
해결 방법으로 Date 형에 CAST 해 봅시다.
단지 integer형에서 직접 Date형으로 CAST할 수 없기 때문에,
매개 변수를 단일 따옴표로 묶고 문자열로 만든 다음 CAST합니다.
아래와 같은 SQL이 됩니다.
redash_parameter_to_presto.sqlSELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.created_at <= CAST('{{作成日が何日以下か入力}}' AS DATE)
이제 Redash 매개 변수와 Date 유형의 열을 비교하고 결과를 반환합니다.
IN 절에 매개 변수를 전달하고 Presto로 보내는 경우
통상이라면 아래의 SQL과 같이, IN구의 내용을 TEXT형의 파라미터로 옮겨놓고,
실행할 뿐입니다만, 이것이라고 의도한 결과가 돌아오지 않습니다.
html_escape.sqlSELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.id IN ({{指定の番号をカンマ区切りで入力}})
HTML 이스케이프를 비활성화해야 하며 두 개의 괄호{{ }}
대신 괄호 3개{{{ }}}
로 묶어야 합니다.
다음과 같은 SQL이 됩니다.
non_html_escape.sqlSELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.id IN ({{{指定の番号をカンマ区切りで入力}}})
Github의 Redash 아래의 issue에서 소개됩니다.
공식 HELP에도 쓰지 않았기 때문에 해결에 상당히 고생했습니다…
Quotation Mark is Not Replaced Correctly When Inserted Using Query Parameters · Issue #1211 · getredash/redash · GitHub
요약
Redash는 진짜 편리합니다만, 다양한 데이터 소스를 연결할 수 있는 Presto와 사용하면,
Python 데이터 소스를 사용하지 않아도 SQL에서만 이기종 DB를 결합 할 수 있으므로 매우 편리합니다.
다만, 조금 일근줄로는 가지 않는 것이 있기 때문에 그런 때에 이 기사를 참고해 주시면 좋겠습니다.
2일째는 kubotak씨의 「공부회 구동 개발의 스즈메」입니다!
Reference
이 문제에 관하여(Redash의 매개 변수 기능을 사용하여 Presto에서 SQL을 실행할 때 Tips), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/anntoque/items/4657df31f4acb5015f97
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
SQL Server 등이라면 Redash GUI에서 매개 변수 유형을 Date 형식으로 설정하고,
이러한 SQL을 실행하면 성공적으로 결과를 얻을 수 있습니다.
redash_parameter_to_sqlserver.sql
USE hoge
SELECT
*
FROM
guns g
WHERE
1=1
AND g.created_at <= {{作成日が何日以下か入力}}
그러나 이러한 SQL에서 Presto에 대해 실행하면 다음 오류가 반환됩니다.
error_redash_parameter_to_presto.sql
SELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.created_at <= {{作成日が何日以下か入力}}
error
com.facebook.presto.sql.analyzer.SemanticException: line 3:20: '<=' cannot be applied to timestamp,integer
GUI에서 매개변수 유형을 Date 유형으로 설정했음에도 불구하고 integer로 수신됩니다.
그건 그렇고, Presto에서 다음 SQL이 실행됩니다.
error_on_presto.sql
SELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.created_at <= 2017-11-29
해결 방법으로 Date 형에 CAST 해 봅시다.
단지 integer형에서 직접 Date형으로 CAST할 수 없기 때문에,
매개 변수를 단일 따옴표로 묶고 문자열로 만든 다음 CAST합니다.
아래와 같은 SQL이 됩니다.
redash_parameter_to_presto.sql
SELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.created_at <= CAST('{{作成日が何日以下か入力}}' AS DATE)
이제 Redash 매개 변수와 Date 유형의 열을 비교하고 결과를 반환합니다.
IN 절에 매개 변수를 전달하고 Presto로 보내는 경우
통상이라면 아래의 SQL과 같이, IN구의 내용을 TEXT형의 파라미터로 옮겨놓고,
실행할 뿐입니다만, 이것이라고 의도한 결과가 돌아오지 않습니다.
html_escape.sqlSELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.id IN ({{指定の番号をカンマ区切りで入力}})
HTML 이스케이프를 비활성화해야 하며 두 개의 괄호{{ }}
대신 괄호 3개{{{ }}}
로 묶어야 합니다.
다음과 같은 SQL이 됩니다.
non_html_escape.sqlSELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.id IN ({{{指定の番号をカンマ区切りで入力}}})
Github의 Redash 아래의 issue에서 소개됩니다.
공식 HELP에도 쓰지 않았기 때문에 해결에 상당히 고생했습니다…
Quotation Mark is Not Replaced Correctly When Inserted Using Query Parameters · Issue #1211 · getredash/redash · GitHub
요약
Redash는 진짜 편리합니다만, 다양한 데이터 소스를 연결할 수 있는 Presto와 사용하면,
Python 데이터 소스를 사용하지 않아도 SQL에서만 이기종 DB를 결합 할 수 있으므로 매우 편리합니다.
다만, 조금 일근줄로는 가지 않는 것이 있기 때문에 그런 때에 이 기사를 참고해 주시면 좋겠습니다.
2일째는 kubotak씨의 「공부회 구동 개발의 스즈메」입니다!
Reference
이 문제에 관하여(Redash의 매개 변수 기능을 사용하여 Presto에서 SQL을 실행할 때 Tips), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/anntoque/items/4657df31f4acb5015f97
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
SELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.id IN ({{指定の番号をカンマ区切りで入力}})
SELECT
*
FROM
catalog.weapon.guns g
WHERE
1=1
AND g.id IN ({{{指定の番号をカンマ区切りで入力}}})
Redash는 진짜 편리합니다만, 다양한 데이터 소스를 연결할 수 있는 Presto와 사용하면,
Python 데이터 소스를 사용하지 않아도 SQL에서만 이기종 DB를 결합 할 수 있으므로 매우 편리합니다.
다만, 조금 일근줄로는 가지 않는 것이 있기 때문에 그런 때에 이 기사를 참고해 주시면 좋겠습니다.
2일째는 kubotak씨의 「공부회 구동 개발의 스즈메」입니다!
Reference
이 문제에 관하여(Redash의 매개 변수 기능을 사용하여 Presto에서 SQL을 실행할 때 Tips), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/anntoque/items/4657df31f4acb5015f97텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)