Вы когда-нибудь создавали несколько источников данных в своей серверной среде и не знали, какие источники данных использовались и не использовались в рабочих книгах? Одной из ваших задач в качестве администратора сервера Tableau является отслеживание и мониторинг всех источников данных сервера. Вам нужно знать все источники данных, которые были использованы и неиспользованные. Используя REST API Tableau Server, вы можете программно управлять ресурсами Tableau Server и изменять их.

API предоставляет вам простой доступ к функциональным возможностям источников данных, рабочих книг, проектов, пользователей сайта и сайтов на сервере Tableau. Вы можете использовать этот доступ для создания собственных пользовательских приложений. Вам может потребоваться построить диаграмму BI, которая показывает количество или информацию об использованных источниках данных. Знание этого поможет вам лучше управлять ресурсами вашего сервера.

Без лишних слов давайте начнем с создания фрейма данных, который показывает неиспользуемые источники данных.

Шаг 1. Импортируйте библиотеку Python REST API (TSC) Tableau Server, а также импортируйте pandas.

import tableauserverclient as TSC
import pandas as pd

Шаг 2. Затем необходимо указать учетные данные и конечную точку сервера.

tableau_auth = TSC.TableauAuth('XXXXXXXX', 'XXXXX', 'XXXX')
server = TSC.Server('https://dub01.online.tableau.com/')

Шаг 3. В следующих двух строках мы установим размер страницы равным 1000 и будем готовы перемещаться по количеству ресурсов, чтобы мы могли получить все ресурсы на сервере независимо от номер. Затем мы перейдем к аутентификации на сервере Tableau.

request_options = TSC.RequestOptions(pagesize=1000)
with server.auth.sign_in(tableau_auth):

Шаг 4. В следующих шести строках кода мы получим все источники данных на сервере Tableau. Результат будет включать все используемые и неиспользуемые источники данных на сервере. Мы также получим все рабочие книги сервера, и это принесет идентификаторы рабочих книг, имя рабочей книги, дату создания рабочей книги и дату обновления рабочей книги.

all_datasources = list(TSC.Pager(server.datasources, request_options))
all_workbooks_items =  list(TSC.Pager(server.workbooks, request_options))
WorkbooksID = [workbook.id for workbook in all_workbooks_items]
workbooksName = [workbook.name for workbook in all_workbooks_items]
workbooksCrea = [workbook.created_at for workbook in all_workbooks_items]
workbooksUpdate = [workbook.updated_at for workbook in all_workbooks_items]

Шаг 5. В следующих пяти строках кода мы сосредоточимся на источниках данных так же, как мы сделали это для рабочих книг. Мы получим дату создания источника данных, дату обновления источников данных, имя источника данных, идентификатор источника данных и идентификатор владельца источников данных. Эта информация поможет нам узнать, какие источники данных используются в рабочей книге.

datasource_create = [datasource.created_at for datasource in all_datasources]
datasource_update = [datasource.updated_at for datasource in all_datasources]
datasource_name = [datasource.name for datasource in all_datasources]
datasource_id = [datasource.id for datasource in all_datasources]
datasource_owner_id = [datasource.owner_id for datasource in all_datasources]

Теперь, когда у нас есть книги и информация об источниках данных, мы можем приступить к созданию фрейма данных.

Шаг 6. Следующей задачей является связать каждый источник данных с его книгами, чтобы, когда у вас есть книга, вы знали, какой источник данных использовался в книге. С другой стороны, если к источнику данных не подключена рабочая книга, мы увидим и узнаем источники данных.

На следующем этапе мы будем перебирать идентификаторы книг и заполнять подключения (источники данных) к книгам.

Прежде чем мы получим доступ к источникам данных книги, мы должны заполнить сведения о соединении (свойства соединения).

Линия с;

workbookdata =  [{connection.datasource_name:workbookinfo.name} for connection in workbookinfo.connections]

помогает нам получить имя источника данных и присвоенное ему имя рабочей книги. Затем мы сохраним значения источника данных в ключе и имя рабочей книги в списке значений Python.

key = []
value = []
for ids in WorkbooksID:
workbookinfo = server.workbooks.get_by_id(ids)
server.workbooks.populate_connections(workbookinfo)
#populate the datasource connection using the workbook ids
"""

Строка ниже получает все имена источников данных, идентификаторы источников данных для каждой книги и отправляет данные в пустые списки выше.

"""
datasourceinfo = [{connection.datasource_id:connection.datasource_name} for connection in workbookinfo.connections]
workbookdata =  [{connection.datasource_name:workbookinfo.name} for connection in workbookinfo.connections]
for k in workbookdata:
for key1, value1 in k.items():
key.append(key1)
value.append(value1)

Шаг 7: Здесь мы собираемся получить пользователей сервера, получить идентификатор, прикрепленный к пользователю; это также значения идентификатора владельца в конечной точке источника данных.

all_users = list(TSC.Pager(server.users, request_options))
userinfo = [{user.id:user.name} for user in all_users]
key22 = []
value22 = []
for userdiction in userinfo:
for key2, value2 in userdiction.items():
key22.append(key2)
value22.append(value2)

Шаг 8: На этом этапе мы выйдем из сервера и начнем работать с полученной таблицей. Мы соберем (объединим) все столы вместе; здесь мы работаем с четырьмя таблицами.

У нас есть таблица «Рабочие книги», таблица «Источники данных», «Источники данных», прикрепленные к таблице «Рабочие книги», и таблица с информацией о пользователе. С помощью этих четырех таблиц мы теперь можем предоставить мощное представление о том, что происходит с рабочими книгами и ресурсами источников данных.

server.auth.sign_out()

Четыре строки ниже создают фрейм данных с мощной библиотекой Pandas Python, и мы называем ее Workbookdf1. Мы сделаем то же самое для всех фреймов данных Datasource_df, datasourcesAttachedToWorkbooks и userdf.

Workbook_df = pd.DataFrame({"Workbook_ID":WorkbooksID,"Workbook_Name":workbooksName, "Workbook_CreatedTime":workbooksCrea,"Workbook_UpdatedTime":workbooksUpdate})
Datasource_df = pd.DataFrame({"Datasource_id":datasource_id,"datasource_owner_id":datasource_owner_id, "Datasource_name":datasource_name,"Datasource_CreatedTime":datasource_create, "Datasource_updatedTime":datasource_update})
datasourcesAttachedToWorkbooks = pd.DataFrame({"datasource_name":key,"workbook_name":value})
userdf = pd.DataFrame({"datasource_owner_id":key22,"Name":value22})

Datasource_df выглядит так, как показано ниже.

User_df выглядит так, как показано ниже.

Шаг 9. Следующей частью этого проекта является получение источников данных, не прикрепленных к книге, из всех источников данных сервера Tableau. Я собираюсь преобразовать значения набора данных в набор соответственно. Строки ниже показывают нам, как это сделать.

rint("__________List of Unique Datasources with Workbooks attached_____________")
df1Set = set(datasourcesAttachedToWorkbooks['datasource_name'])
df2Set = set(Datasourcedf1['Datasource_name'])

Код для получения уникальных источников данных, прикрепленных к книге, задается как Unique_Datasources_attached_to_workbooks, а источники данных, не прикрепленные к книге, задаются как Unique_Datasources_not_attached.

Unique_Datasources_attached_to_workbooks = df1Set.intersection(df2Set)
Unique_Datasources_not_attached = df2Set.difference(Unique_Datasources_attached_to_workbooks)

Затем мы можем приступить к обогащению таблиц, добавив в наш набор данных больше столбцов.

x = pd.DataFrame(Unique_Datasources_not_attached,columns=['Datasource_name'])
NEWdfDatasource = pd.merge(Datasource_df,x,on='Datasource_name')
NEWdf = pd.merge(NEWdfDatasource,userdf,on='datasource_owner_id')

Полный код указан как;

import tableauserverclient as TSC
import pandas as pd
tableau_auth = TSC.TableauAuth('XXXX', 'XXXX', 'XXXXX')
server = TSC.Server('https://prod-useast-a.online.tableau.com/')
request_options = TSC.RequestOptions(pagesize=1000)
with server.auth.sign_in(tableau_auth):

all_datasources = list(TSC.Pager(server.datasources, request_options))
all_workbooks_items =  list(TSC.Pager(server.workbooks, request_options))
WorkbooksID = [workbook.id for workbook in all_workbooks_items]
workbooksName = [workbook.name for workbook in all_workbooks_items]
workbooksCrea = [workbook.created_at for workbook in all_workbooks_items]
workbooksUpdate = [workbook.updated_at for workbook in all_workbooks_items]

datasource_create = [datasource.created_at for datasource in all_datasources]
datasource_update = [datasource.updated_at for datasource in all_datasources]
datasource_name = [datasource.name for datasource in all_datasources]
datasource_id = [datasource.id for datasource in all_datasources]
datasource_owner_id = [datasource.owner_id for datasource in all_datasources]    key = []
value = []
for ids in WorkbooksID:
workbookinfo = server.workbooks.get_by_id(ids)
server.workbooks.populate_connections(workbookinfo)
#populate the datasource connection using the workbook ids
"""
 the line below gets all the datasource name and the datasource ids for each workbooks and send the data to empty lists above
"""
datasourceinfo = [{connection.datasource_id:connection.datasource_name} for connection in workbookinfo.connections]
workbookdata =  [{connection.datasource_name:workbookinfo.name} for connection in workbookinfo.connections]
for k in workbookdata:
for key1, value1 in k.items():
key.append(key1)
value.append(value1)
all_users = list(TSC.Pager(server.users, request_options))
userinfo = [{user.id:user.name} for user in all_users]
key22 = []
value22 = []
for userdiction in userinfo:
for key2, value2 in userdiction.items():
key22.append(key2)
value22.append(value2)
server.auth.sign_out()
Workbookdf1 = pd.DataFrame({"Workbook_ID":WorkbooksID,"Workbook_Name":workbooksName, "Workbook_CreatedTime":workbooksCrea,"Workbook_UpdatedTime":workbooksUpdate})
Datasourcedf1 = pd.DataFrame({"Datasource_id":datasource_id,"datasource_owner_id":datasource_owner_id, "Datasource_name":datasource_name,"Datasource_CreatedTime":datasource_create, "Datasource_updatedTime":datasource_update})
datasourcesAttachedToWorkbooks = pd.DataFrame({"datasource_name":key,"workbook_name":value})
userdf = pd.DataFrame({"datasource_owner_id":key22,"Name":value22})
print("__________List of Unique Datasources with Workbooks attached___________")
df1Set = set(datasourcesAttachedToWorkbooks['datasource_name'])
df2Set = set(Datasourcedf1['Datasource_name'])
Unique_Datasources4workbooks = df1Set.intersection(df2Set)
Unique_Datasourcesdifference = df2Set.difference(Unique_Datasources4workbooks)
x = pd.DataFrame(Unique_Datasourcesdifference,columns=['Datasource_name'])
NEWdfDatasource = pd.merge(Datasourcedf1,x,on='Datasource_name')
NEWdf = pd.merge(NEWdfDatasource,userdf,on='datasource_owner_id')
NEWdf