본문 바로가기
Tableau 흡수내용

[Tableau(태블로)]Tableau Server에서 데이터 원본 가져오기(Python)(Tableau Server Datasource to hyper to Dataframe)

by Mr.noobiest 2024. 1. 22.

 

Tableau Server에서 CSV / Dataframe 으로 가져오기

서버에서 데이터 원본을 가져온다음 그걸 Dataframe으로 변경하는 일련의 과정을 Python을 사용하여 자동화 하려고한다.

그런데 데이터 원본을 가져오는것 까지는 좋은데 해당 데이터 원본을 다운받을때 파일형식이 hyper가 아닌 tdsx로 받아지는 문제가 발생했다.

약간 더러운 방법이지만 다른 방법을 찾아봐도 잘 모르겠으니 더 좋은 방법이 있다면 언제든 댓글을 달아주길 바랍니다.


 

1. Python 코드(tableauhyperapi)

 

 

1.1) 가져올 데이터원본 ID 구하기(get Datasource ID in  Tableau Server)

import tableauserverclient as TSC

tableau_auth = TSC.TableauAuth('태블로 서버 접속시 ID','태블로 서버 접속시 PW',site_id='') 
server = TSC.Server('태블로 서버 주소',use_server_version=True)
server.auth.sign_in(tableau_auth)

datasourceName = '가져오고 싶은 데이터 원본명' <=== 프로젝트에 위치에 상관없이 가져오는것이므로 중복명이 되지 않게하자


datasource_id = [i.id for i in all_datasources if i.name==datasource]
datasource_name = [i.name for i in all_datasources if i.name==datasource]

datasource_id=datasource_id[0]
datasource_name=datasource_name[0]
print(datasource_id)
print(datasource_name)


#Tip
#TSC.Page(server.datasources) 대신 server.projects를 써주면 프로젝트 id와 name을 가져올 수 있다.

 

 

 


 

 

1.2) Download Datasource


#코드를 실행할때 무조건 auth인증을 유지해야한다.
with server.auth.sign_in(tableau_auth):
	server.datasources.download('1-1)에서 구한 데이터 원본 ID' , filepath='tdsx파일을 저장하고하는 위치' )

result : ./filepath/"Datasource Name".tdsx

#위 과정을 통해 tdsx 파일을 다운로드할수 있다, TSC 도움말을 보면 데이터 원본을 다운로드 할때 ..hyper로도 받을수 있다고 나오지만, 어떻게 format을 설정하는지는 나와있지 않다,,,,;;;;;(방법을 알면 댓글바랍니다.)

#이제 tdsx에서 hyper 파일을 추출 할것이다
#기본적으로 tdsx는 zip으로 확장자를 변경하면 데이터 원본을 따로 구할 수 있다(.csv or .hyper)

 

 

 


 

 

 

2) .tdsx -> .zip -> .hyper or .csv

from pathlib import Path


p=Path('/경로/다운로드 받은 데이터원본명.tdsx')
p.rename(p.with_suffix('.zip'))

HyperFileName='저장하고 싶은 .hyper명.hyper'

with zipfile.Zipfile('/경로/다운로드 받은 데이터원본명.zip') as zip:
    for zip_info in zip.infolist():
        if zip_info.filename[-1] == '/':
            continue
        if zip_info.filename.endswith('.hyper'):
            zip_info.filename = HyperFileName
            zip.extract(zip_info,'hyper 파일을 저장하고 싶은 경로/')

위 코드를 실행하면 tdsx파일에 저장되어 있는 .hyper파일을 따로 저장할 수 있다

만약 해당 데이터 원본이 .csv라면 .hyper대신 .csv를 사용하면 되고 여러개라면 for문으로 반복해주면된다.

 

 


 

 

 

3) .hyper 파일을 Dataframe으로 변경하기

#pantab을 사용한다면 frame_to_hyper를 사용하면 되지만 왜인지 계속 에러가 발생하여 다른 방법을 사용하게 되었다.

#만약 pantab이 정상적으로 실행된다면 pantab을 쓰면된다.

table_name = TableName('해당 hyper파일의 테이블명')
from tableauhyperapi import HyperProcess , Connection, TableDefinition,SqlType,Telemetry,Inserter,CreateMode,TableName,escape_string_literal

result_list=[]
with HyperProcess(telemetry=Telemetry.SEN_USAGE_DATA_TO_TABLEAU) as hyper:
    with Connection(endpoint=hyper.endpoint, database = '.hyper 파일의 위치.hyper') as connection:
        table_names = connection.catalog.get_table_definition(name=table_name)
        with connection.execute_query(query=f"SELECT * FROM {TableName(table_name)} ") as result:
            rows = list(result)
            column_list=[]
            for k in range(0,len(result.schema.columns)):
                get_column=str(result.schema.columns[k]).split("'")[1]
                column_list.append(get_column.replace("'",""))

result=pd.DataFrame(rows)
result.columns=column_list

result.to_csv('.csv파일을 저장할 경로 .csv' , index=False)

 

 


 

 

 

전체 과정 요약

이렇게 서버에서 데이터 원본을 다운로드 받고(tdsx) -> hyper나 csv파일을 추출한뒤(.zip -> .hyper/.csv)

-> 해당 데이터 원본을 Dataframe으로 변환하는 과정을 진행해보았다(.hyper -> Dataframe)

굉장히 번잡하지만 한번 설정해놓으면 이후에는 자동화라 초반에만 고생하면될듯

다른 좋은 방법이 있다면 언제든 댓글로 공유바랍니다. 영어로 구글링해도 도움말말고 잘안나온다.ㅠㅠ

 

 

끝.

 

 

728x90
반응형