Tableau Hyper API-BIチヌムはあなたに感謝したす

BIチヌムが、タブロむドデヌタストレヌゞ圢匏「ハむパヌ」を䜿甚しおMongoDBからTableauサヌバヌにデヌタを配信する自動プロセスを敎理し、デヌタ生成を蚭定するプロセスがシンプルなWebむンタヌフェむスを介しお実行されるように支揎した方法に぀いお説明したす。



最初に、内郚補品A1にプログラムでデヌタ゜ヌスを収集し、それらをTableau Serverに公開するように教えた前埌の、プロセスがどのようになっおいたかを簡単に説明したす。次に、BIコマンドの問題ず芋぀かった解決策を詳しく調べ、内郚を調べたすここでは、.hyperファむルの䜜成、tableauサヌバヌでのファむルの公開、およびハむパヌの曎新に぀いお説明したす。猫ぞようこそ



Tableau Hyper API-BIチヌムはあなたに感謝したす




私たちDAN広告グルヌプは、メディア垂堎の産業甚メヌタヌであるMediascopeからの広告監芖デヌタを䜿甚しお倚くの䜜業を行っおいたす。さたざたなシナリオがありたす。生デヌタをアップロヌドする埓業員もいれば、既補の前凊理枈みデヌタベヌスを䜿甚する埓業員もいれば、このデヌタに基づいお自動ダッシュボヌドの開発を泚文する埓業員もいたす。最埌のシナリオに぀いお詳しく説明したしょう。BI開発者はTableauでダッシュボヌドを収集したすが、「描画」を開始する前に、開発に䟿利な目的の圢匏にデヌタを移動する必芁もありたす。



原材料から矎しい自動グラフたでのデヌタのラむフパスは、倧きく4぀のステップに分けるこずができたす。



  1. 生デヌタの取埗
  2. デヌタのクリヌニングず改蚂
  3. Tableauのデヌタ゜ヌスの䜜成
  4. 芖芚化の開発


そうだった



Tableauのデヌタ゜ヌスをプログラムで生成する方法を孊ぶ前は、プロセスは次のようになりたした。



叀い人生のプロセス


1.生デヌタの取埗



ナヌザヌは、内郚ツヌルA1を䜿甚しお衚圢匏のレポヌトを生成したす。これに぀いおは、以䞋で詳しく説明したす。



2.デヌタのクリヌニングず倉曎デヌタ



倉換機胜もA1ツヌルに含たれおいたす。その埌、クリヌンアップされたデヌタをxslx / csvにアップロヌドしお、ツヌルの倖郚で匕き続き䜜業できたす。ここで泚目に倀するのは、䞀郚のナヌザヌは自分自身を1番目のポむントに制限し、レポヌトをアップロヌドした埌、自分でデヌタを倉曎するこずです。



3.Tableauのデヌタ゜ヌスを䜜成する



以前は、ダッシュボヌドのお客様には、前の段萜で生成した䞀連のExcelが付属しおいたした。そしお、BI開発者は、これらの元の䜜品を独自の単䞀のデヌタ゜ヌスタブロむドスラングに持ち蟌みたした。 Tableauツヌルだけに限定するこずが垞に可胜であるずは限りたせんでした。圌らはしばしばPythonでスクリプトを䜜成したした。



4.ビゞュアラむれヌションの開発



最埌に、氷山の䞀角はダッシュボヌドを䜜成し、それをTableau Serverに公開しお、顧客がそれを芋るこずができるようにするこずです。実際には、レンダリングは、デヌタを収集しお曎新を蚭定するよりも時間がかからないこずがよくありたす。



カスタム゜リュヌションの数が増えるに぀れ、3番目のステップで苊痛が蓄積したしたが、これは維持ず実装に費甚がかかりたした。たた、2番目のステップのデヌタの゚ラヌが定期的にリヌクされおいたした。2぀のシステムA1ずTableauの䞭間のExcelが、ナヌザヌに「ペンで䜕かを修正したしょう。誰も気付かないでしょう」ずプッシュしおいたした。



になった



䞻なタスクは、ステップ2ず3の間の䜙分な毛皮を排陀するこずでした。その結果、A1にデヌタ゜ヌスを収集しおTableauServerに公開するように教えたした。䜕が起こったのか



新しいラむフプロセス


ここで、ステップ1から3がA1で実行されたす。出力で、BIチヌムは、芖芚化を開発するためにTableauServerで公開されたデヌタ゜ヌスを受け取りたす。Hyper APIが接続リンクになりたしたが、これに぀いおは埌で説明したす。



結果



さたざたなツヌルで䜜業するずきのノヌドの数を枛らしたした。これで、プロセスのどこかでミスを犯すこずがより難しくなり、゚ラヌが発生した堎所を芋぀けやすくなり、障害の調査にかかる時間が短瞮されたす。システムは、䞀般的な゚ラヌに぀いおナヌザヌに譊告したす。



BIチヌムの時間を解攟したす。以前は、テンプレヌト゜リュヌションはほずんどなく、倚くのカスタマむズがありたした。ほずんどの堎合、Python凊理はプロゞェクトごずに远加されたした。たれに、凊理が䞍芁な堎合は、Tableau Desktopメむンの開発ツヌルで盎接䜜業したした。



これで、デヌタ゜ヌスの準備は次のようになりたす。A1むンタヌフェむスで必須フィヌルドをクリックし、必芁に応じお行に展開するフィヌルドをマヌクし、オプションでフィヌルドのタむプを事前に定矩したす。



TableauServerをロヌドしたせんかさばるデヌタ゜ヌスの曎新-曎新はA1によっお行われ、既補のハむパヌがサヌバヌにダりンロヌドされたす。



*ボヌナス-ナヌザヌにはA1内で䜜業するこずをお勧めしたす。以前に䞀郚のナヌザヌが生のレポヌトをアンロヌドした埌、ツヌルの倖郚で手動で倉曎した堎合、ステップ1から3たでのプロセス党䜓がA1で行われるため、ナヌザヌはそこでクリヌニングプロセスを蚭定する方が簡単です。



問題ず解決策



A1に぀いお少し



゜リュヌションに぀いお説明する前に、デヌタ゜ヌスの生成をアタッチした内郚補品A1に぀いお説明する必芁がありたす。



A1は瀟内補品であり、䞻な仕事が次の埓業員のワヌクフロヌを簡玠化するように蚭蚈されおいたす。



  • MediaScope゜フトりェア補品からデヌタを取埗する
  • このデヌタを察象のアナリストにずっお䟿利な圢匏にクリヌンに持ち蟌みたす
  • 必芁に応じお、ダッシュボヌドを䜜成するためのデヌタを準備したすこれに぀いおは本日説明したす


ナヌザヌがデヌタのクリヌニングを終了するず、デヌタはA1システムに保存されたす。私たちの甚語では、これは「コンテナ」ず呌ばれたす。コンテナはMongoDBの通垞のドキュメントであり、Tableauサヌバヌに転送する必芁がありたす。



BIチヌムの問題



私たちのBI開発チヌムは、MongoDBに保存されおいるA1から䜕らかの方法でデヌタを取埗し、受信したデヌタに基づいおダッシュボヌドを構築する必芁がありたした。たず、通垞のスコアボヌドツヌルを䜿甚しおMongoDBからデヌタをフェッチしようずしたしたが、これでは問題は解決したせんでした。



  • デヌタはMongoDBに保存されるため、スコアボヌドの入り口で任意の構造のデヌタを受信したす。぀たり、このロゞックを垞に維持する必芁がありたす。
  • MongoDBからデヌタを集玄するには、コレクション党䜓ではなく、コレクションから特定のレコヌドをドラッグする必芁がありたした。Tableauドラむバヌはこれを実行できたせん。
  • 特に、デヌタを取埗するだけでは䞍十分でした。䞀郚の列を行に「ピボット解陀」するために、デヌタを「展開」する必芁がある堎合がありたした。これも、䞀蚀で蚀えば、それほど簡単なこずではありたせんでした。


私たちは䜕を思い぀いたのですか



Tableau Hyper API ラむブラリを䜿甚しお、私のバむクでこの問題を解決しようず決心したした。このラむブラリを䜿甚するず、デヌタを簡単に远加できる.hyper圢匏のファむルを䜜成し、それをデヌタ゜ヌスずしお䜿甚しお、サヌバヌボヌド䞊にダッシュボヌドを䜜成できたす。



スコアボヌドの開発者がハむパヌ自䜓を説明するず、次のようになりたす。

Hyperは、デヌタベヌスク゚リを効率的に評䟡するこずにより、倧芏暡たたは耇雑なデヌタセットを迅速に分析するのに圹立぀高性胜のメモリ内デヌタ゚ンゞンです。Tableauプラットフォヌムに基づいお、Hyperは独自の動的コヌド生成技術ず高床な同時実行テクノロゞヌを䜿甚しお、抜出ずク゚リで高いパフォヌマンスを実珟したす。
私たちのプログラムでの䜜業のおおよそのプロセスは次のずおりです。



  • ナヌザヌがコンテナず目的の列を遞択したす
  • システムはコンテナからデヌタを匕き出したす
  • 受信したデヌタに基づいお、システムは列のタむプを刀別したす
  • ハむパヌの䜜成ずハむパヌぞのデヌタの挿入が初期化されたす
  • ハむパヌはスコアボヌドサヌバヌにロヌドされたす
  • BI開発者はサヌバヌ䞊のハむパヌを確認し、それに基づいおダッシュボヌドを䜜成したす


新しいデヌタがコンテナに泚がれるず、ハむパヌを曎新する必芁があるずいう信号がシステムに送信されたす。



  • システムはスコアボヌドサヌバヌからハむパヌをダりンロヌドしたす
  • MongoDBから新しいデヌタを取埗し、ハむパヌを曎新したす
  • その埌、システムは新しいハむパヌをサヌバヌにアップロヌドし、既存のハむパヌを䞊曞きしたす。
  • ナヌザヌは「曎新」ボタンをクリックするだけで、ダッシュボヌドに最新の情報を衚瀺できたす。


ナヌザヌに衚瀺されるもの



前述のように、A1はWebアプリケヌションです。 Vue.jsずVuetifyを䜿甚しお、フロント゚ンドのハむパヌ生成サヌビスを䜜成したした。



アプリケヌションむンタヌフェむスは3぀の画面に分かれおいたす。



コンテナ遞択画面



最初の画面で、ナヌザヌは目的のコンテナヌず列を遞択したす。



[ピボット解陀]オプションが有効になっおいる堎合、ハむパヌに2぀の远加の列が䜜成されたす倉数-メトリック列によっお遞択された列の名前ず倀-これらの列からの倀。



ディメンション列は、同じ名前の遞択された列を持぀列をハむパヌに远加したす。遞択した列の数ディメンションずその名前は、ハむパヌ内のテヌブルの敎合性が䟵害されないように、すべおのコンテナヌで同じである必芁がありたす。したがっお、コンテナヌ内で異なる名前が付けられおいる堎合に、遞択した列の名前を指定できる列「ハむパヌ名」がありたす。



ハむパヌ䜜成プロセスログ



これで、ハむパヌを蚭定するプロセスは終了です。ナヌザヌは2番目の画面に移動し、[ハむパヌを䜜成]をクリックしお、ログでむベントの進行状況を確認するだけです。



远加の蚭定



3番目の画面には、远加の蚭定が含たれおいたす。



  • ハむパヌを自動的に曎新するシステムが必芁ない堎合は、曎新の無芖をオンにするこずができたす
  • 曎新レポヌトを送信するメヌルを指定できたす
  • 倀列のデヌタタむプを手動で指定できたすピボット解陀モヌドでのみ䜿甚されたすfloat、string、たたはシステムによっお自動的に決定されたすタむプに぀いおはさらに説明したす
  • コンテナ内の遞択した列のデヌタタむプを指定するこずもできたす。


ボンネットの䞋にあるもの



A1はPythonで曞かれおいたす。デヌタを凊理するために、Pandasを䜿甚し、Pandasからのデヌタをシリアル化しお、MongoDBGridFSにピクルスしお保存したす。



ハむパヌを䜜成するコマンドを受信するず、システムは次の操䜜を実行したす。



  • MongoDBから必芁なすべおのコンテナをアンロヌドし、デヌタをpandasdatafremesに逆シリアル化したす
  • デヌタを準備したすデヌタフレヌムに必芁な列のみを残し、新しい名前を付け、必芁に応じおpandas.meltを介しおテヌブルを展開したす
  • ナヌザヌが列のデヌタタむプを蚭定した堎合は、デヌタをfloat32たたはstringに倉換したす
  • デヌタを䜿甚したすべおの準備䜜業の埌、システムはハむパヌapiを介しおファむルを䜜成し、tabcmdを介しおファむルをスコアボヌドサヌバヌに送信したす。


列のデヌタタむプに぀いお少し説明する䟡倀がありたす。A1コンテナにデヌタを保存する機胜の1぀は、ナヌザヌが列に割り圓おるタむプを気にせず、パンダが完党にそれを行うこずですシステムは、数倀ず文字列倀が列に存圚する状況に冷静に察凊したす。ただし、ハむパヌはこれを奜みたせん。列がint型である必芁があるこずを圌に䌝えるず、システムは敎数以倖のものを挿入しようずするず誓いたす。したがっお、ハむパヌでは、stringずfloatの2぀のデヌタタむプのみを䜿甚するこずにしたした。



それで、私たちは仕事の䞀般的な原則を理解したした、ハむパヌ自䜓で働くこずに぀いお話したしょう。



.hyperファむルの䜜成



Hyper APIを䜿甚するには、ラむブラリをむンストヌルする必芁がありたす。こちらの公匏Webサむトからダりンロヌドできたす。このツヌルの操䜜方法の良い䟋もいく぀かありたす。䞻なポむントを簡単に説明したす。



hyiperファむル自䜓は䞀皮のデヌタベヌスであり、SQLiteをいくらか連想させたす。apiを介しお、次のようなSQL構文を䜿甚しおデヌタにアクセスできたす。



f"SELECT {escape_name('Customer ID')} FROM {escape_name('Customer')}"


システムはPythonで蚘述されおいるため、察応する蚀語のラむブラリも䜿甚したす。ファむルを䜜成するずきは、スキヌマ名、テヌブル名、および列をタむプで指定する必芁がありたす。Tableau Serverが本のデヌタを抜出するために登るのはこのスキヌマ内のテヌブルであるため、スキヌマずテヌブルの名前は「Extract」ず呌ばれる必芁がありたす。



with HyperProcess(Telemetry.SEND_USAGE_DATA_TO_TABLEAU) as hyper:
    with Connection(
        hyper.endpoint, self.fullpath_hyper, CreateMode.CREATE_AND_REPLACE
    ) as connection:
        connection.catalog.create_schema("Extract")
        main_table = TableName("Extract", "Extract")
        example_table = TableDefinition(main_table)


テヌブルを䜜成したら、列を䜜成しおタむプを蚭定する必芁がありたす。前に述べたように、デヌタには2぀のタむプフロヌトたたは文字列しかないため、デヌタフレヌム内の列のタむプに基づいお、これを列に蚭定したす。



for column in dataframe.columns:
    if dataframe[column].dtype.name in ("category", "object"):
        example_table.add_column(TableDefinition.Column(column, SqlType.text()))

    elif dataframe[column].dtype.name in ("float32"):
        example_table.add_column(
            TableDefinition.Column(column, SqlType.double())
        )

    connection.catalog.create_table(example_table)


テヌブルを䜜成した埌、デヌタを挿入できたす。



with Inserter(connection, example_table) as inserter:
    for val in dataframe.values:
        inserter.add_row(val.tolist())
    inserter.execute()


ここでは、デヌタフレヌムを1行ず぀実行し、inserter.add_row を介しお倀を含むリストを环積したす。実際、apiハむパヌには関数add_rowsがあり、リストのリストを取埗しお、すでに倀を挿入しおいたす。なぜこれが行われなかったのですか RAMを節玄するにはデヌタフレヌムから倀のリストのリストを提䟛するには、パンダにvalues.tolistを実行するように䟝頌する必芁がありたす。たた、1億5000䞇行のデヌタがある堎合、RAMの操䜜は非垞にコストがかかるこずがわかりたすが、パフォヌマンスにはたったく圱響したせんいずれの堎合も、行を繰り返し繰り返すため、ハむパヌの䜜成速床が䜎䞋したこずに気づきたせんでした。さらに、add_rows構文シュガヌのように機胜したす。実際にはリストのリストを取埗し、デヌタを繰り返し远加したす。



これでハむパヌの䜜成は完了です。次に、サヌバヌに公開する必芁がありたす。



Tableauサヌバヌぞのファむルの公開



tableau-serverにアクセスするには、tabcmdナヌティリティを䜿甚したす。これはサヌバヌに接続しお管理機胜を実行できるコン゜ヌルナヌティリティです。ナヌザヌ、グルヌプ、ブックなどを䜜成したす。



Pythonサブプロセスを介しおtabcmdコマンドを実行したす。Popen



popen = subprocess.Popen(
    f'/opt/tableau/tabcmd/bin/tabcmd publish "{fullpath_hyper}" -n "{filename}" -o -r "A1_test" '
    '-s http://tableau.domain.com -u "username" -p "password" --no-certcheck',
    shell=True,
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
)
return_code = popen.wait()
if return_code:
    error = str(popen.communicate()[1])
    return f"     . {error}"


次のコマンドずキヌをtabcmdに枡したす。



  • 公開ファむルをサヌバヌにアップロヌドしたす
  • -n-nameサヌバヌ䞊にあるファむル名
  • -o-overwriteこの名前のファむルがある堎合は、䞊曞きしたす
  • -r “A1_test” (--project): ( )
  • -s (--server): tableau-
  • -u -p:
  • --no-certcheck: SSL-




新しいハむパヌを䜜成する方法を理解したしたが、ハむパヌが10個のコンテナヌで構成され、そのうちの1぀が新しいデヌタを受信した堎合はどうすればよいでしょうか。ハむパヌを曎新したす。



新しいデヌタがコンテナに到着するず、システムはこのコンテナを䜿甚するハむパヌがあるかどうかを確認したす。ある堎合、タスクはハむパヌを曎新するこずです。



どのコンテナからどのデヌタがハむパヌにあるかを理解するために、システムはハむパヌを䜜成するずきに远加のcontainer_id列も䜜成したす。このアプロヌチでは、曎新が非垞に簡単になりたす。



  • サヌバヌからファむルを取埗したす
  • ハむパヌ内のすべおの行を削陀したす。container_idは曎新されたコンテナヌず同じです。
  • 新しい行を挿入したす
  • 䞊曞きファむルをサヌバヌにアップロヌドし盎したす。


ファむルを取埗するプロセスは、ファむルをダりンロヌドするプロセスずは少し異なりたす。たず、サヌバヌから.hyperファむルを取埗するのではなく、.tdsxアヌカむブを取埗したす。これを解凍しお、.hyper自䜓を開きたす。



ファむルを取埗するには、tabcmdを䜿甚したす。



popen = subprocess.Popen(
    f'/opt/tableau/tabcmd/bin/tabcmd get "datasources/{filename_tdsx}" '
    f'-s http://tableau.domain.com -u "username" -p "password" '
    f'--no-certcheck -f "{fullpath_tdsx}"',
    shell=True,
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
)
return_code = popen.wait()
if return_code:
    error = str(popen.communicate()[1])
    return f". {error}"


ここでは、次のコマンドずキヌを䜿甚したす。



  • getサヌバヌからファむルを取埗したす。test.hyperファむルがサヌバヌ䞊にある堎合は、test.tdsxファむルを参照する必芁があり、それらはすべおデヌタ゜ヌスディレクトリにありたすスコアボヌドのそのような機胜がコメントで共有されおいる理由をグヌグルできたせんでした
  • -f-filenameファむル名ず拡匵子を含むフルパス。ファむルの保存堎所


ファむルがダりンロヌドされたら、zipファむルを介しお解凍する必芁がありたす。



with zipfile.ZipFile(fullpath_tdsx, "r") as zip_ref:
    zip_ref.extractall(path)


解凍埌、ハむパヌは./Data/Extractsディレクトリにありたす。



ファむルの珟圚のバヌゞョンができたので、䞍芁な行をファむルから削陀できたす。



table_name = TableName("Extract", "Extract")

with HyperProcess(Telemetry.SEND_USAGE_DATA_TO_TABLEAU) as hyper:
    with Connection(hyper.endpoint, self.fullpath_hyper) as connection:
        connection.execute_query(
            f"DELETE FROM {table_name} WHERE "
            f'{escape_name("container_id")}={container_id}'
        ).close()


さお、ファむルの挿入ず公開はすでに䞊で説明されおいたす。



結論



収益は䜕ですかハむパヌファむルの生成ずtableau-serverぞの自動配信の実装に関する䜜業を行った埌、BIチヌムの負荷を倧幅に軜枛し、ダッシュボヌドのデヌタの曎新が容易になり、最も重芁なこずずしお、より高速になりたした。ハむパヌAPIに粟通しおいるこずは苊痛ではなく、ドキュメントは適切に蚘述されおおり、テクノロゞヌをシステムに統合するこずは簡単でした。



ご枅聎ありがずうございたしたご質問やご意芋がございたしたら、コメント欄にご蚘入ください。



この蚘事はVasilyLavrovVasilyFromOpenSpace) — -



All Articles