クエリ結果の形式
クエリ結果の形式として、string、json、full_json、flatbuffers がサポートされています。クエリ結果の形式は、次のいずれかの方法で設定できます。
構成ファイルで形式を指定します。形式の設定は、OpenSearch Retrieval Engine Edition V3.0 の SQL が起動された後にグローバルに有効になります。デフォルトでは、すべてのクエリは指定された形式でクエリ結果を返します。
クエリの kvpair 句で形式を指定します。形式の設定は、現在のクエリに対して有効になります。現在のクエリは、構成ファイルで指定された形式に関係なく、kvpair 句で指定された形式でクエリ結果を返します。
クエリの kvpair 句でクエリ結果の形式を指定する
kvpair 句で、formatType:json または formatType:string を使用してクエリ結果の形式を指定します。kvpair 句の使用方法の詳細については、kvpair 句を参照してください。
query=...&&kvpair=...;formatType:{json | string | full_json | flatbuffers};...文字列形式のクエリ結果
文字列形式で返されるクエリ結果は、整形されています。これにより、結果が見やすく、読みやすくなります。ほとんどの場合、文字列形式のクエリ結果はデバッグに使用されます。これはトラブルシューティングに役立ちます。
/ha3_develop/source_code/ha3_manual_example/sql $ ./search.sh -s "select nid, price, brand, size from phone"
+ python2.7 /ha3_develop/install_root/usr/local/lib/python/site-packages/ha_tools/search.py -a http://localhost:39341/ -s 'select nid, price, brand, size from phone'
USE_TIME: 0.025, ROW_COUNT: 10
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
1 | 3599 | Huawei | 5.9 |
2 | 4388 | Huawei | 5.5 |
3 | 899 | Xiaomi | 5 |
4 | 2999 | OPPO | 5.5 |
5 | 1299 | Meizu | 5.5 |
6 | 169 | Nokia | 1.4 |
7 | 3599 | Apple | 4.7 |
8 | 5998 | Apple | 5.5 |
9 | 4298 | Apple | 4.7 |
10 | 5688 | Samsung | 5.6 |
------------------------------- TRACE INFO ---------------------------
------------------------------- SEARCH INFO ---------------------------
scanInfos { kernelName: "ScanKernel" nodeName: "0_0" tableName: "phone" hashKey: 243934**** parallelNum: 1 totalOutputCount: 10 totalScanCount: 10 totalUseTime: 86 totalSeekTime: 29 totalEvaluateTime: 13 totalOu\
tputTime: 43 totalComputeTimes: 1 }JSON 形式のクエリ結果
JSON 形式のクエリ結果は、サービス間の呼び出しに使用されます。この形式により、プログラムによる解析が容易になります。JSON 形式のクエリ結果には、文字列形式のクエリ結果よりも多くの情報が含まれています。次のセクションでは、返される結果に含まれる各フィールドについて説明します。
/ha3_develop/source_code/ha3_manual_example/sql $ ./search.sh -s "select nid, price, brand, size from phone&&kvpair=formatType:json"
+ python2.7 /ha3_develop/install_root/usr/local/lib/python/site-packages/ha_tools/search.py -a http://localhost:39341/ -s 'select nid, price, brand, size from phone&&kvpair=formatType:json'
{
"error_info": // 返されたエラーメッセージ。
"{\"Error\": ERROR_NONE}",
"format_type":
"json",
"row_count": // 結果の行数。
10,
"search_info": // Searcher に関する情報。scan や sort などの演算子が含まれます。
"scanInfos { kernelName: \"ScanKernel\" nodeName: \"0_0\" tableName: \"phone\" hashKey: 243934**** parallelNum: 1 totalOutputCount: 10 totalScanCount: 10 totalUseTime: 81 totalSeekTime: 28 totalEvaluateTime: 1\
1 totalOutputTime: 40 totalComputeTimes: 1 }",
"sql_result": // JSON または文字列形式で返された結果。
"{\"column_name\":[\"nid\",\"price\",\"brand\",\"size\"],\"column_type\":[\"uint64\",\"double\",\"multi_char\",\"double\"],\"data\":[[1,3599,\"Huawei\",5.9],[2,4388,\"Huawei\",5.5],[3,899,\"Xiaomi\",5],[4,2999\
,\"OPPO\",5.5],[5,1299,\"Meizu\",5.5],[6,169,\"Nokia\",1.4],[7,3599,\"Apple\",4.7],[8,5998,\"Apple\",5.5],[9,4298,\"Apple\",4.7],[10,5688,\"Samsung\",5.6]]}",
"total_time": // 消費された合計時間。単位:秒。
0.024,
"trace": // トレース情報。
[
]
}full_json 形式のクエリ結果
full_json 形式の結果と JSON 形式の結果は、同様の構造を使用します。形式間の唯一の違いは、sql_result フィールドの値です。JSON 形式では、sql_result フィールドの値は文字列形式です。full_json 形式では、sql_result フィールドの値は JSON 形式です。
{
"total_time": 34.003,
"covered_percent": 1,
"row_count": 10 ,
"format_type": "full_json",
"search_info": {},
"trace": [],
"sql_result": {
"data": [
[
232953260,
"德克士"
],
[
239745260,
"叶氏兄弟"
],
[
240084010,
"菜老包"
],
[
240082260,
"周黑鸭"
],
[
240086260,
"绝味鸭脖"
],
[
240108260,
""
],
[
239256390,
"每一天生活超市"
],
[
240079390,
"美宜佳"
],
[
265230260,
""
],
[
239313011,
"大参林"
]
],
"column_name": [
"store_id",
"brand_name"
],
"column_type": [
"int64",
"multi_char"
]
},
"error_info": {
"ErrorCode": 0,
"Error": "ERROR_NONE",
"Message": ""
}
}sql_result
{
"column_name":[ // 列の名前。
"nid",
"price",
"brand",
"size"
],
"column_type":[ // 列の型。
"uint64",
"double",
"multi_char",
"double"
],
"data":[ // 各データ行。
[
1,
3599,
"Huawei",
5.9
],
[
2,
4388,
"Huawei",
5.5
],
[
3,
899,
"Xiaomi",
5
],
[
4,
2999,
"OPPO",
5.5
],
[
5,
1299,
"Meizu",
5.5
],
[
6,
169,
"Nokia",
1.4
],
[
7,
3599,
"Apple",
4.7
],
[
8,
5998,
"Apple",
5.5
],
[
9,
4298,
"Apple",
4.7
],
[
10,
5688,
"Samsung",
5.6
]
]
}search_info
返される結果において、search_info は複雑なフィールドです。search_info フィールドの値に基づいてクエリプロセスを分析し、問題を解決し、パフォーマンスを最適化できます。返される結果に search_info フィールドを含めるには、kvpair 句に searchInfo:true を追加します。
"search_info": {
"exchangeInfos": [
{
"fillResultUseTime": 1276, // exchange カーネルがレスポンス構造から結果を取得するのに消費された時間。
"hashKey": 413114****,
"kernelName": "ExchangeKernel", // exchange カーネルの名前。
"nodeName": "1", // exchange カーネルが属するノードの名前。
"poolSize": 472, // このクエリで exchange カーネルが属する worker が使用するプールのサイズ。
"rowCount": 2, // すべての列がマージされた後に返される有効な結果行の数。
"searcherUseTime": 7335, // 検索リクエストを開始するまでの待機時間。単位:マイクロ秒。
"totalAccessCount": 4 // 検索リクエストによってアクセスされる列の総数。
}
],
"rpcInfos": [ // リモートプロシージャコール (RPC) リクエストの詳細。フィールドに含まれる要素の数は、フィールドに返される列の数と同じです。
{
"beginTime": 1588131436272843, // exchange カーネルを呼び出す開始時刻。単位:マイクロ秒。
"rpcNodeInfos": [
{
"callUseTime": 5431, // RPC ノードによって消費された時間。単位:マイクロ秒。
"isReturned": true, // リクエストに対するレスポンスが返されたかどうかを示します。
"netLatency": 664, // ネットワークレイテンシ。単位:マイクロ秒。
"rpcBegin": 1588131436272857, // RPC が開始されたときのタイムスタンプ。単位:マイクロ秒。
"rpcEnd": 1588131436278288, // RPC が終了したときのタイムスタンプ。単位:マイクロ秒。
"rpcUseTime": 5175, // RPC の期間。単位:マイクロ秒。
"specStr": "11.1.XX.XX:20412" // サーバーの呼び出しに使用される IP アドレスとポート。
},
...
],
"totalRpcCount": 4, // 送信された RPC リクエストの数。
"useTime": 7335 // RPC の合計時間。
}
],
"runSqlTimeInfo": {
"sqlPlan2GraphTime": 174, // iquan プランを navi グラフに変換するのにかかった時間。単位:マイクロ秒。
"sqlPlanStartTime": 1588143112640920, // プランを取得するために iquan にリクエストが送信されたときのタイムスタンプ。単位:マイクロ秒。
"sqlPlanTime": 10295, // iquan にリクエストを送信してからプランを取得するまでの合計時間。単位:マイクロ秒。
"sqlRunGraphTime": 13407 // SQL グラフの実行にかかった合計時間。単位:マイクロ秒。
},
"scanInfos": [
{
"hashKey": 691673167,
"kernelName": "ScanKernel", // カーネルの名前。
"parallelNum": 2, // スキャンの並列度。このフィールドは、グローバルで並列に実行されるスキャンの数を示します。
"parallelIndex": 1, // 並列ロジックにおけるスキャンカーネルのシーケンス番号。値が 0 の場合、スキャンカーネルはデフォルトで並列ロジックに表示されません。
"tableName": "store", // テーブルの名前。
"totalComputeTimes": 4, // batchScan が呼び出された合計回数。
"totalEvaluateTime": 9, // フィールドの評価に消費された合計時間。単位:マイクロ秒。
"totalInitTime": 3758, // init フェーズで費やされた合計時間。単位:マイクロ秒。
"totalOutputCount": 2, // 出力行の総数。
"totalOutputTime": 264, // 出力データの構築に消費された合計時間。テーブルへのデータの追加または削除が含まれます。単位:マイクロ秒。
"totalScanCount": 2, // スキャンされた行の総数。
"totalSeekTime": 2, // seek 呼び出しの合計時間。単位:マイクロ秒。
"totalUseTime": 4217 // スキャンカーネルの呼び出しにかかった合計時間。単位:マイクロ秒。
}
]
}flatbuffers 形式のクエリ結果
flatbuffers 形式の結果は、FlatBuffers に基づいて実装された効率的なシリアライゼーションの結果です。flatbuffers 形式は、高パフォーマンスが要求されるシナリオで使用されます。flatbuffers 形式の結果は、対応するクライアントによってデシリアライズおよび解析される必要があります。
SqlResult.fbs:
include "TwoDimTable.fbs";
namespace isearch.fbs;
table SqlErrorResult {
partitionId: string (id:0);
hostName: string (id:1);
errorCode: uint (id:2);
errorDescription: string (id:3);
}
table SqlResult {
processTime: double (id:0);
rowCount: uint32 (id:1);
errorResult: SqlErrorResult (id:2);
sqlTable: TwoDimTable (id:3);
searchInfo: string (id:4);
coveredPercent: double (id:5);
}
root_type SqlResult;TwoDimTable.fbs:
include "TsdbColumn.fbs";
namespace isearch.fbs;
// 複数値
table MultiInt8 { value: [byte]; }
table MultiInt16 { value: [short]; }
table MultiInt32 { value: [int]; }
table MultiInt64 { value: [long]; }
table MultiUInt8 { value: [ubyte]; }
table MultiUInt16 { value: [ushort]; }
table MultiUInt32 { value: [uint]; }
table MultiUInt64 { value: [ulong]; }
table MultiFloat { value: [float]; }
table MultiDouble { value: [double]; }
table MultiString { value: [string]; }
// 列ベースストレージ
table Int8Column { value: [byte]; }
table Int16Column { value: [short]; }
table Int32Column { value: [int]; }
table Int64Column { value: [long]; }
table UInt8Column { value: [ubyte]; }
table UInt16Column { value: [ushort]; }
table UInt32Column { value: [uint]; }
table UInt64Column { value: [ulong]; }
table FloatColumn { value: [float]; }
table DoubleColumn { value: [double]; }
table StringColumn { value: [string]; }
table MultiInt8Column { value: [MultiInt8]; }
table MultiUInt8Column { value: [MultiUInt8]; }
table MultiInt16Column { value: [MultiInt16]; }
table MultiUInt16Column { value: [MultiUInt16]; }
table MultiInt32Column { value: [MultiInt32]; }
table MultiUInt32Column { value: [MultiUInt32]; }
table MultiInt64Column { value: [MultiInt64]; }
table MultiUInt64Column { value: [MultiUInt64]; }
table MultiFloatColumn { value: [MultiFloat]; }
table MultiDoubleColumn { value: [MultiDouble]; }
table MultiStringColumn { value: [MultiString]; }
// 列型
union ColumnType {
Int8Column,
Int16Column,
Int32Column,
Int64Column,
UInt8Column,
UInt16Column,
UInt32Column,
UInt64Column,
FloatColumn,
DoubleColumn,
StringColumn,
MultiInt8Column,
MultiInt16Column,
MultiInt32Column,
MultiInt64Column,
MultiUInt8Column,
MultiUInt16Column,
MultiUInt32Column,
MultiUInt64Column,
MultiFloatColumn,
MultiDoubleColumn,
MultiStringColumn,
TsdbDpsColumn,
}
table Column {
name: string;
value: ColumnType;
}
table TwoDimTable {
rowCount: uint (id:0);
columns: [Column] (id:1);
}TsdbColumn.fbs:
namespace isearch.fbs;
struct TsdbDataPoint {
ts: int64 (id:0);
value: double (id:1);
}
table TsdbDataPointSeries { points: [TsdbDataPoint]; }
table TsdbDpsColumn { value : [TsdbDataPointSeries]; }注記
column_type フィールドの場合、multi_ というプレフィックスが付いた値は複数値型です。構造はリストです。値 multi_char は STRING 型の値を示します。