

# CustomSQL
<a name="dqdl-rule-types-CustomSql"></a>

このルールタイプは、次の 2 つのユースケースをサポートするように拡張されました。
+ データセットに対してカスタム SQL ステートメントを実行し、その戻り値を指定された式と対応させて確認します。
+ SELECT ステートメントで列名を指定するカスタム SQL ステートメントを実行し、それを何らかの条件と比較して行レベルの結果を取得します。

**[Syntax]** (構文)

```
CustomSql {{<SQL_STATEMENT>}} {{<EXPRESSION>}}
```
+ **SQL\_STATEMENT** – 二重引用符で囲まれた単一の数値を返す SQL ステートメント。
+ **EXPRESSION** – ルールタイプの応答に対して実行し、論地値を生成するための式。詳細については、「[表現](dqdl.md#dqdl-syntax-rule-expressions)」を参照してください。

**例: ルール全体の結果を取得するカスタム SQL**

このルール例では、データセットのレコード数を取得するための、SQL ステートメントを使用します。その後、このルールは、レコード数が 10 から 20 の間であることを確認します。

```
CustomSql "select count(*) from primary" between 10 and 20
```

**例: 行レベルの結果を取得するカスタム SQL**

このサンプルルールでは、SELECT ステートメントで列名を指定し、それを何らかの条件と比較して行レベルの結果を取得する SQL ステートメントを使用しています。しきい値条件式は、ルール全体が失敗するまでに失敗するレコード数のしきい値を定義します。ルールには条件とキーワードの両方を一緒に含めることはできないことに注意してください。

```
CustomSql "select Name from primary where Age  > 18"
```

or

```
CustomSql "select Name from primary where Age > 18" with threshold  > 3
```

**重要**  
`primary` エイリアスは、評価するデータセットの名前の代替です。コンソールでビジュアル ETL ジョブを使用する場合、`primary` は常に、`EvaluateDataQuality.apply()` 変換に渡されている `DynamicFrame` を表します。AWS Glue データカタログを使用して、テーブルに対して 品質評価タスクを実行する場合、`primary` はテーブルを表します。

AWS Glue データカタログを使用している場合は、実際のテーブル名を使用することもできます。

```
CustomSql "select count(*) from database.table" between 10 and 20
```

複数のテーブルを結合して、異なるデータ要素を比較することもできます。

```
CustomSql "select count(*) from database.table inner join database.table2 on id1 = id2" between 10 and 20
```

 AWS Glue ETL では、CustomSQL はデータ品質チェックに失敗したレコードを特定できます。これを機能させるには、データ品質を評価する主テーブルの一部であるレコードを返す必要があります。クエリの一部として返されたレコードは成功と見なされ、返されなかったレコードは不合格と見なされます。これは、CustomSQL クエリの結果を元のデータセットに結合することで機能します。SQL クエリの複雑さによっては、パフォーマンスに影響する場合があります。

 これを実行するには: 
+  主テーブルから少なくとも 1 つの列を選択する必要があります。
  +  `select count(*) from primary` は、OVERALL CustomSQL DQ ルールでは有効なクエリですが、行レベルのカスタム SQL の有効なクエリではありません。
  +  このルールは、評価中に次のエラーをスローします。 `The output from CustomSQL must contain at least one column that matches the input dataset for AWS Glue Data Quality to provide row level results. The SQL query is a valid query but the columns from the SQL result are not present in the Input Dataset. Ensure that matching columns are returned from the SQL.`
+  SQL クエリで、テーブルから「プライマリキー」を選択するか、複合キーを形成する列の組み合わせを選択します。そうしない場合、重複行とのマッチングによって結果に矛盾が生じたり、パフォーマンスが低下したりする可能性があります。
+  参照テーブルからキーを選択するのではなく、主テーブルにあるキーのみを選択します。

次のルールにより、経過日数が 100 未満のレコードは成功と見なされ、それ以上のレコードは不合格とマークされます。

```
CustomSql "select id from primary where age < 100" 
```

次の CustomSQL ルールは、レコードの 50% の経過日数が 10 を超えた場合は合格とし、失敗したレコードも特定します。この CustomSQL によって返されたレコードは合格と見なされ、返されなかったレコードは不合格と見なされます。

```
CustomSQL "select ID, CustomerID from primary where age > 10" with threshold > 0.5
```

メモ: データセットにないレコードを返すと、CustomSQL ルールは失敗します。