例外処理およびスクリプトのトラブルシューティング

「変換」では、変換をプレビューまたは保存する際に、静的パーサーを使用して、Groovyの一部の動的型付けの動作をオーバーライドしたり、未定義の変数などの解析のエラーを検出します。

重要: 静的パーサーにより、Groovyが静的型付け言語のように動作するよう強制されるため、変換内でGroovyの動的型付け機能を使用することはできません。たとえば、Groovyでは通常、宣言されていない変数が許可されますが、「変換」では解析エラーが発生します。

また、静的パーサーにより、スクリプト内で直接参照される属性が、データ・セットのスキーマに定義されている属性と一致するかどうかも検証されます。属性が一致しない(たとえば、スペルミスがある)場合は、エラーが発生します。

重要: 静的パーサーでは、変換に含まれるパラメータが、一部のカスタム関数(エンリッチメント関数など)の行マップで参照される構文と一致するかどうかは検証されません。関数からパラメータを不正に参照した場合、変換スクリプトによってこの操作は検証されませんが、パーサーではエラーが指定されません。したがって、変換APIリファレンス(このドキュメント内またはGroovydoc内)をチェックし、行マップ内の関数パラメータを正しく参照しているかどうかを検証してください。

変換スクリプト内に属性を変数として組み込む場合、属性に使用する書式が、静的パーサーがこの属性を処理する方法に影響します。属性の書式の詳細は、「変数の書式」を参照してください。

変換に解析エラーが含まれる場合、「変換」では、変換をプレビューまたは保存するときに「変換エラー」ダイアログ・ボックス内にエラー・メッセージが表示されます。また、「変換エラー」には、エラーが含まれる各行の横に赤い「X」アイコンが表示されます。これらのアイコンにカーソルを合わせると、エラーに関する詳細を表示できます。

ダイアログ・ボックスを閉じ、エラーを修正し、変換を再びプレビューし、すべてのエラーが修正されていることを検証する必要があります。エラーがない状態にするまでは変換をスクリプトに保存することはできません。

set関数の例外のトラブルシューティング

複数割当属性(Studioでは、このような属性は複数値属性と呼ばれます)に対してのみ、変換APIから次のset関数を実行できます。
  • cardinality()
  • isSet()
  • isEmpty()
  • isMemberOf()
  • toSet()
  • toSingle()

これらの関数は、「変換」から実行できるインライン変換に属しています。これらのset関数は、複数割当されている属性の値セットに適用されます。

Studio内の「変換」からこれらの関数のいずれかを実行し、実行対象となる属性が単一割当(単一値)属性である場合、変換APIによって属性のDgraphタイプに応じてNULLまたは例外がスローされます。

注意: 属性が複数値かどうかは、「探索」の中のデータ・セットを調べ、表ビューを選択することで確認できます。セル内に複数の値を持つ列は、その列が複数値属性であることを示しています。また、「プロジェクトの設定」「データ・ビュー」でも、データ・セットの複数値列の値を確認できます。

要約すると、変換を実行しようとして例外が発生する場合は、変換を実行する属性が単一値ではないかをチェックしてください。その場合、set変換関数は適用されません。

セキュリティ例外

サポートされていないGroovy言語の機能が変換スクリプトに含まれる場合、セキュリティ例外がスローされ、「変換エラー」ダイアログ・ボックスに表示されます。エラーの原因となったコードを削除してください。

セキュリティ例外の原因となる可能性のあるGroovy言語機能の詳細は、「Groovyの予約済キーワードおよびサポートされていない機能」を参照してください。

実行時の例外のトラブルシューティング

静的パーサーでは、すべてのエラーを検出できるわけではなく、特にデータ内の異常が原因で発生した実行時の例外は検出できません。通常、「変換」では、処理できないデータに対してnull値を返すことによってこれらのエラーを処理します。

変換スクリプトによってnull値が生成された理由の詳細を確認するには、コードをtryブロックでラップし、その出力先を文字列型の新しい一時属性に設定できます(出力は、文字列型の属性の新しい列としてプロジェクトのデータ・セット内に表示されます)。
try {
    <transformation script>  // replace this with your transformation script code
    'OK'
  } catch (Exception ex) {
    ex.getMessage()
  }

変換スクリプトをプレビューすると、生成されたエラー・メッセージが文字列型の一時列に出力されます。デバッグが完了したら、tryブロックを削除し、一時属性を削除できます。

日時変換のトラブルシューティング

日時オブジェクト(つまり、mdex:dateTime属性)を文字列オブジェクトに暗黙的に変換する場合、クラスタのSparkジョブが実行される場所に応じて結果が異なる場合があります。特に、結果のタイムゾーンが予期したものとは異なる可能性があります。

たとえば、次の文を考えてみます。
// mydatetime is an mdex:dateTime object
mydatetime = 1/1/1970 03:00:00 PM UTC
// convert to mdex:string-set object
new_set= toSet(mydatetime)

広範囲にわたるクラスタでは、ジョブがどこで実行されるかわからない場合があります。ジョブがNYタイムゾーンのニュー・ヨークに対して構成されているマシンで実行される場合、ESTはUTCより5時間早いため、結果は"Jan 1, 1970 10:00:00 AM"となります。しかし、ジョブがCAタイムゾーンのサンノゼに対して構成されているマシンで実行される場合、結果は"Jan 1, 1970 07:00:00 AM"となります。

mydatetimeを文字列として使用する場合、明示的に変換することをお薦めします。次に例を示します。
new_set = toSet(toString(mydatetime,"MMM d, yyyy HH:mm:ss a","UTC"))
この場合、タイムゾーンは、Sparkノードによってではなく、ユーザーによって指定されます。