質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

735閲覧

JSONデータへのデータ抽出方法について

Otaka-A

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/11/16 10:48

編集2021/11/16 13:24

AWS Glue上でPython Shellをつかい、ワークフロー上でエラーとなった
jobのエラー内容を取得したいのですがコーディングがわからず、お助けください。

boto3のGlueクライエント get_workflowより受け取った以下レスポンスから
JobRunState(['Workflow']['Graph']['Nodes']['JobDetails']['JobRuns']['JobRunState'])が'FAILED'となったJOBのErrorMessageを取得したいです。

Responseまでは取得できているのですが、どのようにデータ抽出(検索クエリ)すればよいのかご教示頂きたいです。

※追記
以下の方法でJubRunState事体は取得できるのですが、Nodes以下に複数のJobが入っており、JubRunStateがSuccessed、Failedのものが混在しています。取得したいのはこのステータスがFailedとなったJOBのErrorMessageなのですが、JSONにおける指定行のデータを取得する方法がわからず質問させて頂きました。

例:以下数字部分は複数あり、その中でJubRunStateがFailedになったものを抜き出したいです。
response['Workflow']['LastRun']['Graph']['Nodes'][2]['JobDetails']['JobRuns'][0]['JobRunState']

Python

1(レスポンスを取得するまでの処理) 2import json 3import sys 4import boto3 5from awsglue.utils import getResolvedOptions 6 7glue_client = boto3.client("glue") 8 9# 実行パラメータ取得 10args = getResolvedOptions(sys.argv, ['WORKFLOW_NAME', 'WORKFLOW_RUN_ID','chimeURL']) 11workflow_name = args['WORKFLOW_NAME'] 12workflow_run_id = args['WORKFLOW_RUN_ID'] 13 14try: 15 16 #ワークフロー情報取得 17 response = glue_client.get_workflow( 18 Name=workflow_name, 19 IncludeGraph=True 20 ) 21

JSON

1Response Syntax 2{ 3 'Workflow': { 4 'Name': 'string', 5 'Description': 'string', 6 'DefaultRunProperties': { 7 'string': 'string' 8 }, 9 'CreatedOn': datetime(2015, 1, 1), 10 'LastModifiedOn': datetime(2015, 1, 1), 11 'LastRun': { 12 'Name': 'string', 13 'WorkflowRunId': 'string', 14 'PreviousRunId': 'string', 15 'WorkflowRunProperties': { 16 'string': 'string' 17 }, 18 'StartedOn': datetime(2015, 1, 1), 19 'CompletedOn': datetime(2015, 1, 1), 20 'Status': 'RUNNING'|'COMPLETED'|'STOPPING'|'STOPPED'|'ERROR', 21 'ErrorMessage': 'string', 22 'Statistics': { 23 'TotalActions': 123, 24 'TimeoutActions': 123, 25 'FailedActions': 123, 26 'StoppedActions': 123, 27 'SucceededActions': 123, 28 'RunningActions': 123 29 }, 30 'Graph': { 31 'Nodes': [ 32 { 33 'Type': 'CRAWLER'|'JOB'|'TRIGGER', 34 'Name': 'string', 35 'UniqueId': 'string', 36 'TriggerDetails': { 37 'Trigger': { 38 'Name': 'string', 39 'WorkflowName': 'string', 40 'Id': 'string', 41 'Type': 'SCHEDULED'|'CONDITIONAL'|'ON_DEMAND'|'EVENT', 42 'State': 'CREATING'|'CREATED'|'ACTIVATING'|'ACTIVATED'|'DEACTIVATING'|'DEACTIVATED'|'DELETING'|'UPDATING', 43 'Description': 'string', 44 'Schedule': 'string', 45 'Actions': [ 46 { 47 'JobName': 'string', 48 'Arguments': { 49 'string': 'string' 50 }, 51 'Timeout': 123, 52 'SecurityConfiguration': 'string', 53 'NotificationProperty': { 54 'NotifyDelayAfter': 123 55 }, 56 'CrawlerName': 'string' 57 }, 58 ], 59 'Predicate': { 60 'Logical': 'AND'|'ANY', 61 'Conditions': [ 62 { 63 'LogicalOperator': 'EQUALS', 64 'JobName': 'string', 65 'State': 'STARTING'|'RUNNING'|'STOPPING'|'STOPPED'|'SUCCEEDED'|'FAILED'|'TIMEOUT', 66 'CrawlerName': 'string', 67 'CrawlState': 'RUNNING'|'CANCELLING'|'CANCELLED'|'SUCCEEDED'|'FAILED' 68 }, 69 ] 70 }, 71 'EventBatchingCondition': { 72 'BatchSize': 123, 73 'BatchWindow': 123 74 } 75 } 76 }, 77 'JobDetails': { 78 'JobRuns': [ 79 { 80 'Id': 'string', 81 'Attempt': 123, 82 'PreviousRunId': 'string', 83 'TriggerName': 'string', 84 'JobName': 'string', 85 'StartedOn': datetime(2015, 1, 1), 86 'LastModifiedOn': datetime(2015, 1, 1), 87 'CompletedOn': datetime(2015, 1, 1), 88 'JobRunState': 'STARTING'|'RUNNING'|'STOPPING'|'STOPPED'|'SUCCEEDED'|'FAILED'|'TIMEOUT', 89 'Arguments': { 90 'string': 'string' 91 }, 92 'ErrorMessage': 'string', 93 'PredecessorRuns': [ 94 { 95 'JobName': 'string', 96 'RunId': 'string' 97 }, 98 ], 99 'AllocatedCapacity': 123, 100 'ExecutionTime': 123, 101 'Timeout': 123, 102 'MaxCapacity': 123.0, 103 'WorkerType': 'Standard'|'G.1X'|'G.2X', 104 'NumberOfWorkers': 123, 105 'SecurityConfiguration': 'string', 106 'LogGroupName': 'string', 107 'NotificationProperty': { 108 'NotifyDelayAfter': 123 109 }, 110 'GlueVersion': 'string' 111 }, 112 ] 113 }, 114 'CrawlerDetails': { 115 'Crawls': [ 116 { 117 'State': 'RUNNING'|'CANCELLING'|'CANCELLED'|'SUCCEEDED'|'FAILED', 118 'StartedOn': datetime(2015, 1, 1), 119 'CompletedOn': datetime(2015, 1, 1), 120 'ErrorMessage': 'string', 121 'LogGroup': 'string', 122 'LogStream': 'string' 123 }, 124 ] 125 } 126 }, 127 ], 128 'Edges': [ 129 { 130 'SourceId': 'string', 131 'DestinationId': 'string' 132 }, 133 ] 134 }, 135 'StartingEventBatchCondition': { 136 'BatchSize': 123, 137 'BatchWindow': 123 138 } 139 }, 140※以下省略

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Supernove

2021/11/16 12:19

responseでJsonが取得出来ているのであれば `response['Workflow']['Graph']['Nodes']['JobDetails']['JobRuns']['JobRunState'] `で取得すればいいと思うのですが、出来なかったのですか?
Otaka-A

2021/11/16 12:33

ご質問ありがとうございます。おっしゃるやり方でJubRunState事体は取得できるのですが、下記の通り、Nodes以下に複数のJobが入っており、JubRunStateがSuccessed、Failedのものが混在しています。取得したいのはこのステータスがFailedとなったJOBのErrorMessageなのですが、JSONにおける指定行のデータを取得する方法がわからず質問させて頂きました。 例:以下数字部分は複数あり、その中でJubRunStateがFailedになったものを抜き出したいです。 response['Workflow']['LastRun']['Graph']['Nodes'][2]['JobDetails']['JobRuns'][0]['JobRunState']
Supernove

2021/11/16 12:41 編集

なるほど、それが質問からは分からなかったので書き直してもらってもいいですか? あと、response['Workflow']['LastRun']['Graph']['Nodes'][2]['JobDetails']['JobRuns']の要素が複数あって、各要素の['JobRunState']を取りたいという質問で良かったですか?
Otaka-A

2021/11/16 13:25

確かに質問内容がわかりづらかったですね。申し訳ありません。ご指摘の通り修正しました。 はい、ご認識のとおり、複数の要素から['JobRunState']を取得したいです。
Supernove

2021/11/16 13:35

ありがとうございます。回答したので確認お願いします
guest

回答2

0

Python

1 #ワークフロー情報取得 2 response = glue_client.get_workflow( 3 Name=workflow_name, 4 IncludeGraph=True 5 ) 6 7 #エラーJOB内容の確認 8 job_runs = response['Workflow']['LastRun']['Graph']['Nodes'] 9 10 for job_run in job_runs: 11 if job_run['Type'] == 'JOB': 12 if job_run['JobDetails']['JobRuns'][0]['JobRunState'] == 'FAILED': 13 print(job_run['JobDetails']['JobRuns'][0]['ErrorMessage']) 14 error_job = job_run['JobDetails']['JobRuns'][0]['JobName'] 15 workflow_error = job_run['JobDetails']['JobRuns'][0]['ErrorMessage'] 16 break

投稿2021/11/16 14:38

Otaka-A

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

response['Workflow']['LastRun']['Graph']['Nodes'][2]['JobDetails']['JobRuns']で辞書を要素にしたリストが取得できると考えれば、以下のようにするとエラーメッセージを取得できると思います。

python

1job_runs = response['Workflow']['LastRun']['Graph']['Nodes'][2]['JobDetails']['JobRuns'] 2for job_run in job_runs: 3 if job_run['JobRunState'] == 'FAILED': 4 print(job_run['ErrorMessage'])

投稿2021/11/16 13:35

Supernove

総合スコア1154

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Otaka-A

2021/11/16 14:37

早速のご回答ありがとうございます。Responseの中身を確認したところ、TypeがJOBのものに絞る必要があり、ご回答いただいた内容を以下の通り変更したところ無事データを取得することができました。 #ワークフロー情報取得 response = glue_client.get_workflow( Name=workflow_name, IncludeGraph=True ) #エラーJOB内容の確認 job_runs = response['Workflow']['LastRun']['Graph']['Nodes'] for job_run in job_runs: if job_run['Type'] == 'JOB': if job_run['JobDetails']['JobRuns'][0]['JobRunState'] == 'FAILED': print(job_run['JobDetails']['JobRuns'][0]['ErrorMessage']) break
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問