rankTvf
rankTvf は、SQL 文の rank ウィンドウ関数に似ています。この関数は、データが分散された後にデータをフィルタリングするために使用されます。次のサンプルコードは、関数のプロトタイプを示しています。
rankTvf("group_key", "sort_key", "reserved_count", (sql))group_key: データの分散に使用するフィールド。複数のフィールドを指定することも、パラメーターを空のままにすることもできます。複数のフィールドはコンマ (,) で区切ります。
sort_key: データのソートに使用するフィールド。複数のフィールドを指定できます。プラス記号 (+) は、システムがデータを昇順でソートすることを指定します。マイナス記号 (-) は、システムがデータを降順でソートすることを指定します。デフォルトでは、システムはデータを昇順でソートします。このフィールドを空にすることはできません。
reserved_count: 各グループで保持する返されるレコードの数。負の数は、返されるすべてのレコードが各グループで保持されることを指定します。
sql: クエリ結果を分散する必要がある SQL 文。
rankTvf を使用して SQL 文の結果を分散およびフィルタリングした後も、出力結果は SQL 文の元の結果がソートされた順序でソートされます。フィルタリングされた行は出力結果から削除されます。
例:
select * from table (
rankTvf('brand','-size','1', (SELECT brand, size FROM phone))
)
order by brand
limit 100sortTvf
sortTvf は、ローカルのトップ K 機能を提供するために使用されます。たとえば、sortTvf 関数を使用して、サーチャーによって返された上位 K 個の結果をソートし、その結果に対して結合操作を実行できます。ORDER BY 句を使用する場合、句は結合操作のためにクエリレコードサーチャー (QRS) にプッシュされます。ORDER BY 句は、グローバルソート操作に使用されます。
次のサンプルコードは、関数のプロトタイプを示しています。
sortTvf("sort_key", "reserved_count", (sql))sort_key: データのソートに使用するフィールド。複数のフィールドを指定できます。プラス記号 (+) は、システムがデータを昇順でソートすることを指定します。マイナス記号 (-) は、システムがデータを降順でソートすることを指定します。デフォルトでは、システムはデータを昇順でソートします。このフィールドを空にすることはできません。
reserved_count: 各グループで保持されるフィールドの数。
sql: クエリ結果をソートする必要がある SQL 文。
sortTvf と rankTvf の違い: sortTvf は、テーブル内の SQL 文の元の結果の行の順序を変更します。
例:
select * from table (
sortTvf('-size','3', (SELECT brand, size FROM phone))
)unpackMultiValue
unpackMultiValue 関数は、複数値フィールドを展開するために使用されます。この関数は、GROUP BY 句に複数値フィールドが含まれており、複数値フィールドのグループベースの結果を展開する場合に使用されます。
次のサンプルコードは、関数のプロトタイプを示しています。
unpackMultiValue("unpack_keys", (sql))unpack_keys: 展開するフィールドの名前。複数のフィールドを指定できます。複数のフィールドはコンマ (,) で区切ります。
sql: クエリ結果を展開する必要がある SQL 文。
使用上の注意:
展開された複数値フィールドの型は変更されません。展開された各複数値フィールドには 1 つの値のみが含まれるか、展開されたフィールドは空になります。
少数の複数値フィールドを展開することをお勧めします。多数の複数値フィールドを展開すると、フィールド間のデカルト積の関係により、システムが過負荷になる可能性があります。
例:
select * from table (
unpackMultiValue('desc,price,size', (SELECT desc, price, size FROM phone where size > 5.5))
)graphSearchTvf
graphSearchTvf 関数は、サーチャーと同じプロセスでテーブル値関数 (TVF) に基づくディープラーニングモデルを使用します。このモデルは、ドキュメントのスコアリングに使用されます。次のサンプルコードは、関数のプロトタイプを示しています。
graphSearchTvf("biz_name", "pk_name", "qinfo_kv", (sql))biz_name: スコアリングモデルが属する biz 構成の名前。biz 構成は、SQL 文を実行するサーチャーと同じプロセスにある必要があります。
pk_name: スコアリングモデルのプライマリキーの名前。入力テーブルのフィールドをプライマリキーとして指定できます。
qinfo_kv: qinfo プロトコルに準拠して指定されたキーと値のペア。
sql: 詳細なスコアリングが必要な SQL 文。
graphSearchTvf 関数を実行した後も、出力結果は SQL 文の元の結果がソートされた順序でソートされます。スコアリング結果を格納するために、FLOAT 型の __buildin_score__ フィールドが追加されます。
例:
select * from table (
graphSearchTvf('model','store_id','fg_encode:abc', (SELECT brand, size FROM phone))
)
order by __buildin_score__
limit 100enableShuffleTvf
enableShuffleTvf 関数は、SQL 文を TVF から QRS に切り替えるために使用されます。たとえば、rankTvf 関数で処理する必要がある SQL 文は、デフォルトでサーチャーにプッシュダウンできます。rankTvf 関数の SQL 文に enableShuffleTvf が含まれている場合、rankTvf 関数は QRS 上でのみ実行されます。次のサンプルコードは、関数のプロトタイプを示しています。
enableShuffleTvf((sql))次のサンプルコードは、enableShuffleTvf 関数の使用方法の例を示しています。
select * from table (
enableShuffleTvf((SELECT brand, size FROM phone))
)inputTableTvf
InputTableTvf 関数は、複数の行のデータを構築するために使用されます。ほとんどの場合、この関数は論理テーブルで使用されます。次のサンプルコードは、関数のプロトタイプを示しています。
inputTableTvf('data', (sql))data は複数の行のデータを記述します。複数の行はセミコロン (;) で区切ります。行内の複数の列はコンマ (,) で区切ります。例: 100,0.1;200,0.2.
sql: 構築されたデータのスキーマを指定します。たとえば、sql パラメーターの応答でテーブルの最初の列が INT64 型で、テーブルの 2 番目の列が FLOAT 型の場合、データはこのスキーマに基づいて解析されます。
distinctTopNTvf
distinctTopNTvf 関数は、データの分散とソートに使用されます。次のサンプルコードは、関数のプロトタイプを示しています。
distinctTopNTvf('distinct_fields', 'sort_fields', 'topn', 'distinct_count', 'searcher_topn', 'searcher_distinct_count', (sql))distinct_fields 関数は、フィールドを分散するために使用されます。複数のフィールドを指定することも、パラメーターを空のままにすることもできます。複数のフィールドはコンマ (,) で区切ります。
sort_fields: データのソートに使用するフィールド。複数のフィールドを指定できます。プラス記号 (+) は、システムがデータを昇順でソートすることを指定します。マイナス記号 (-) は、システムがデータを降順でソートすることを指定します。デフォルトでは、システムはデータを昇順でソートします。このフィールドを空にすることはできません。
topn: 保持される返されるレコードの総数。
distinct_count: 各分散グループに予約されているフィールドの数。
searcher_topn: サーチャーの各列に予約されている返されるレコードの総数。
searcher_distinct_count: サーチャーの各列の各分散グループに予約されているフィールドの数。
計算プロセス:
sort_fields パラメーターを使用してデータをソートします。
各行を走査します。
distinct_fields を使用してグループを計算します。グループの数が distinct_count で指定された値よりも小さい場合、行は出力キューに入れられ、グループの数に 1 を加えたものがグループの総数になります。グループの数が distinct_count パラメーターの値以上の場合、行は待機キューに入れられます。
出力キューの行数が topn 以上の場合、出力キューからいくつかの行が返されます。次のパラメーターは、返される行数を指定します: topn。
出力キューの行数が n で、n が topn パラメーターの値よりも小さい場合、待機キューからいくつかの行が必要な順序で出力キューにマージされます。待機キューから取得される行数は、次の式を使用して計算されます: topn パラメーターの値 - n。次に、マージされた行が返されます。
OneSummaryTvf
OneSummaryTvf 関数は、1 つのサマリープラグインチェーンを実行するために使用されます。この関数は、HA3 プラグインプラットフォームの 1 つのサマリープラグインの元のロジックと互換性があります。
"sql_tvf_plugin_config" : {
"modules" : [
{
"module_name": "tvf",
"module_path": "libPluginOnline.so",
"parameters": {}
}
],
"tvf_profiles" : [
{
"func_name": "OneSummaryTvf",
"tvf_name": "tpp", // TVF 名。
"parameters": {
"config_path" : "pluginsConf/one_summary.json", // 1 つのサマリープラグインの構成。
"schema_path" : "schemas/mainse_summary_schema.json", // サマリースキーマの構成。
"chain" : "tpp_default" // TVF のサマリーチェーン。
}
}
]
}OneSummaryTvf 関数を使用して、複数の TVF プロトタイプを構成できます。各プロトタイプは、1 つのサマリープラグインチェーンを表します。
tpp(
'dl:tpp_default', // kvpair
'', // クエリ句。ほとんどの場合、クエリ句は必要ありません。
( // sql
SELECT
*
FROM
mainse_summary_summary_
WHERE
ha_in(nid, '620598126603|619969492623')
)
)ヒント
デフォルトでは、サマリープラグインは元の入力フィールドのみを処理します。フィールドを追加する場合は、追加フィールドに関する情報を iquan に登録します。追加フィールドに関する情報は、サマリープラグインの collectOutputInfo インターフェースを使用して登録できます。情報を登録しないと、追加フィールドの結果は提供されません。
typedef std::vector<std::pair<std::string, std::string>> SummaryOutputInfoType;
virtual SummaryOutputInfoType collectOutputInfo();
// 例:
SummaryOutputInfoType PostFeeSummaryExtractor::collectOutputInfo() {
if (_dstSummaryField.empty()) {
return {};
}
return {make_pair(_dstSummaryField, "string")}; // [(フィールド名, 型)]
}rerankByQuotaTvf
rerankByQuotaTvf('group_fields',
'actual_group_field_values',
'quota_num',
'rerank_fields',
'sort_fields',
'per_rerank_field_max_num',
'window_size',
'need_makeup',
(sql)
)group_fields
データをグループ化する基準となるフィールド。複数の列を指定できます。複数の列はセミコロン (;) で区切ります。
actual_group_field_values
group_fields パラメーターのすべての列挙値。group_fields パラメーターの値が単一の列である場合、すべての列挙値をセミコロン (;) で区切ります。group_fields パラメーターの値が複数の列で構成されている場合、すべての列挙値のグループをセミコロン (;) で区切ります。列挙値の各グループでは、複数の列の値をコンマ (,) で区切ります。
quota_num
各グループのクォータ。このパラメーターは、グループの 2 つのフェーズのクォータを指定します。たとえば、最初のフェーズではサーチャーで最大 10 個のデータエントリを返すことができ、2 番目のフェーズでは最大 20 個のデータエントリを返すことができます。この場合、このグループのパラメーター値は (10,20) です。グループの 2 つのフェーズのクォータはコンマ (,) で区切ります。このパラメーターを指定するグループの数は、actual_group_field_values パラメーターで指定されたグループ数と同じである必要があります。このパラメーターを指定するグループの数が actual_group_field_values パラメーターの値よりも小さい場合、最後に指定したグループのクォータが、quota_num パラメーターを指定していない追加グループのデフォルトクォータとして機能します。このパラメーターを指定するグループの数が actual_group_field_values パラメーターの値よりも大きい場合、システムはエラーを報告します。
rerank_fields
分散するフィールド。複数の列を指定できます。複数の列はセミコロン (;) で区切ります。フィールドを分散したくない場合は、このフィールドを空のままにします。
sort_fields
データのソートに使用するフィールド。+field0;-field1;field2 など、複数の列を指定できます。+ は、データが昇順でソートされることを指定します。- は、データが降順でソートされることを指定します。デフォルトでは、データは昇順でソートされます。
per_rerank_field_max_num
グループの各カテゴリで返される結果の最大数。データを分散する場合に、このパラメーターを使用できます。
window_size
グループ間でデータを不均一に分散するために使用されるウィンドウ。データを不均一に分散する場合に、このパラメーターを使用できます。
need_makeup
クォータに到達するために結果を補足するかどうかを指定します。t は結果が補足されることを指定します。f は結果が補足されないことを指定します。このパラメーターは、t;f など、2 つのフェーズの補足選択肢を指定します。2 つのフェーズの補足選択肢はセミコロン (;) で区切られます。
使用上の注意: 異なるグループのフィールドはセミコロン (;) で区切ります。フィールドは複数値フィールドにすることができます。複数の列挙された複数値フィールドは番号記号 (#) で区切ります。
手順
システムは、グループ化フィールドの列挙値に基づいて input_hash を計算します。
システムはテーブル内のデータを走査し、すべてのデータのハッシュ値を計算し、ハッシュ値を input_hash パラメーターの値と照合します。この場合、列挙されたグループデータに対応するグループが取得されます。
システムは、手順 2 で取得された複数のグループを分散します。
rerank_fields パラメーターに基づいて、グループを分散する必要があるかどうかを判断します。rerank_fields パラメーターを空のままにした場合、グループを分散する必要はありません。この場合、per_rerank_field_max_num パラメーターと window_size パラメーターを 0 に設定できます。
グループを分散する場合は、次の手順を実行します。
rerank_fields パラメーターで指定された値に基づいてデータをグループ化します。
sort_fields パラメーターの値に基づいて、グループ内のデータをソートします。
グループは、window_size パラメーターに基づいて優先的にソートされます。window_size パラメーターは、グループのウィンドウサイズを指定します。グループ内のデータは数回抽出されます。
グループから抽出されたデータが per_rerank_field_max_num パラメーターの値に達すると、システムはグループからのデータの抽出を停止します。すべてのグループから抽出されたデータの量が上限に達すると、システムはすべてのグループからのデータの抽出を停止します。
システムがすべてのグループからのデータの抽出を停止した後、2 つのデータセットを取得できます。1 つのデータセットはユーザーのすべてのルールを満たしています。もう 1 つのデータセットはバックアップセットです。
グループを分散したくない場合は、次の手順を実行します。
sort_fields パラメーターの値に基づいて、グループ内のデータをソートします。
システムは、クォータに基づいてすべてのグループのデータをフィルタリングします。2 つのデータセットを取得できます。1 つのデータセットは指定されたクォータに達しています。もう 1 つのデータセットはバックアップセットです。
クォータに到達するために結果を補足するかどうかを指定します。結果を補足する場合は、バックアップセットのデータを結果に追加します。結果を補足する必要がない場合は、バックアップデータセットを破棄します。データの補足に使用されるポリシーは、actual_group_field_values パラメーターの列挙値におけるグループの順序によって異なります。順序番号が小さいほど、データの補足の優先順位が高くなります。
例
rerankByQuotaTvf('trigger_type',
'1;11',
'100,200;100,300',
'ju_category_id',
'-final_score',
'50',
'15',
't;t',
(sql)
)simpleRerankTvf
simpleRerankTvf('group_fields',
'actual_group_field_values',
'quota_num',
'sort_fields',
'need_makeup',
(sql)
)group_fields
データをグループ化する基準となるフィールド。複数の列を指定できます。複数の列はセミコロン (;) で区切ります。
actual_group_field_values
group_fields パラメーターのすべての列挙値。group_fields パラメーターの値が単一の列である場合、異なるグループのすべての列挙値をセミコロン (;) で区切ります。group_fields パラメーターの値が複数の列で構成されている場合、異なるグループの列挙値をセミコロン (;) で区切ります。グループの複数の列の列挙値はコンマ (,) で区切ります。
quota_num
各グループのクォータ。
sort_fields
データのソートに使用するフィールド。+field0;-field1;field2 など、複数の列を指定できます。+ は、データが昇順でソートされることを指定します。- は、データが降順でソートされることを指定します。デフォルトでは、データは昇順でソートされます。このパラメーターを空のままにした場合、データはソートされません。
need_makeup
クォータに到達するために結果を補足するかどうかを指定します。t は結果を補足する必要があることを指定します。f は結果を補足する必要がないことを指定します。このパラメーターは、2 つのフェーズのクォータを指定します。
手順
システムは、グループ化フィールドの列挙値に基づいて input_hash を計算します。
システムはテーブル内のデータを走査し、すべてのデータのハッシュ値を計算し、ハッシュ値を input_hash パラメーターの値と照合します。この場合、列挙されたグループデータに対応するグループが取得されます。
システムは、手順 2 で取得されたグループのデータの分散と補足を行います。
システムは、sort_fields パラメーターの値に基づいて、グループ内のデータをソートします。sort_fields パラメーターを空のままにした場合、データはソートされません。
システムは、クォータに基づいてすべてのグループのデータをフィルタリングします。2 つのデータセットを取得できます。1 つのデータセットは指定されたクォータに達しています。もう 1 つのデータセットはバックアップセットです。
クォータに到達するために結果を補足するかどうかを指定します。結果を補足する場合は、バックアップセットのデータを結果に追加します。結果を補足する必要がない場合は、バックアップセットのデータを破棄します。データの補足に使用されるポリシーは、actual_group_field_values パラメーターの列挙値におけるグループの順序によって異なります。順序番号が小さいほど、データの補足の優先順位が高くなります。
例
simpleRerankTvf('trigger_type',
'1;11',
'100',
'-final_score',
't',
(sql)
)使用上の注意
SELECT 文を実行して TVF の結果をクエリする場合、FROM 句に table (xxxTvf()) を含めます。
TVF 内の SQL 文は括弧 () で囲む必要があります。一度に実行できる SQL 文は 1 つだけです。たとえば、sql1 union all sql2 ではエラーが報告されます。この問題を解決するには、文を select * from (sql1 union all sql2) に変更します。
TVF は STRING 型のパラメーターのみをサポートします。