데이터 계보(lineage) with Streamlit

juyun hwang
Snowflake Korea
Published in
5 min readAug 29, 2022

데이터의 활용이 보편화 되면서, 점점 Data Lake 혹은 Warehouse에 모이는 데이터의 종류와 그에 관련된 테이블의 양이 점점 많아지도 있습니다. 이러한 상황에서 각 데이터의 흐름도를 표현하는 data lineage(데이터 계보)가 매우 중요한 기능으로 활용할 수 있습니다.

Access History

snowflake는 table, stage 등 내부에 가지고 있는 모든 resource에 대한 접근 이력을 가지고 있이며, 이를 조회할 수 있도록 기능을 제공하고 있습니다.

select * from snowflake.account_usage.access_history

또한 이러한 정보를 바탕으로 각 SQL간의 연관관계를 표현할 수 있습니다.

select
r.value:objectName::string as source_name,
r.value:objectDomain::string as source_domain,
w.value:objectName::string as target_name,
w.value:objectDomain::string as target_domain
from
(select * from SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY) t,
lateral flatten(input => t.BASE_OBJECTS_ACCESSED) r,
lateral flatten(input => t.OBJECTS_MODIFIED) w
group by 1,2,3,4

With Streamlit

다만 위와 같은 SQL 방식의 경우, 관계가 복잡하거나 많은 table이 얽혀 있을 경우 이를 직관적으로 확인 하기 어려운 부분이 있습니다. Snowflake는 이와 같은 User Define UX를 위한 python 기반 Chart Library Streamit를 인수하여 내재화 하고 있습니다.

streamlit에 대한 자세한 사용법은 아래 url를 참조하여 주시길 바랍니다.

data lineage를 위해서 여기서는 graphviz_chart를 활용할 예정입니다.

Data Lineage With Graphviz

이제 우리는 snowflake가 제공해주는 access history와 streamlit를 활용하여 직관적인 data lineage chart를 만들어 보겠습니다.

가장 먼저 접속 후 위에서 제공된 쿼리를 활용하여 각 데이터 간의 관계 정보를 추출합니다.

session = Session.builder.configs(connection_parameters).create();

dl = session.sql(“select r.value:objectName::string as source_name, “

“ group by 1,2,3,4”).collect();

이렇게 추출된 쿼리를 활용해서 우리는 graph edge에 해당 결과를 매핑합니다.

graph = graphviz.Digraph(graph_attr={‘rankdir’:’LR’,’size’:’8,15'})

#graph.edge(‘run’, ‘intr’)

for row in dl:

graph.edge(row[‘SOURCE_NAME’],row[‘TARGET_NAME’])

마지막으로 chart를 streamlit를 통해 가시화하고, 이를 웹화면을 통해 제공합니다.

st.graphviz_chart(graph)

snowflake는 향후 snowsight 안에서도 streamlit application을 내부에서 생성하고 활용할 수 있도록 하여 데이터와 이를 활용 하는 다양한 Application을 같이 제공할 예정입니다.

--

--