次の設定でKinesis Analyticsアプリケーションを構成しようとしています:
後で、Hive + JSONSERDEを使用してS3バケットのコンテンツをインポートします。これは、各JSONレコードが独自の行に存在することを期待しています。 Firehoseの出力は、JSONSERDEを壊すすべてのJSONレコードを追加するだけです。
I could AWS Lambdaデータフォーマッターを出力ストリームにアタッチしますが、コストがかかります。改行を使用して各レコードを分割するだけです。
Analyticsアプリなしで実行している場合は、各Firehoseレコードに改行を追加します。アプリのSQLでそれを行う方法がないのは奇妙に思われます。
CREATE OR REPLACE STREAM "STREAM_OUT" (
a VARCHAR(4),
b VARCHAR(4),
c VARCHAR(4)
);
CREATE OR REPLACE PUMP "STREAM_PUMP" AS
INSERT INTO "STREAM_OUT"
SELECT STREAM
"a",
"b",
"c"
FROM "SOURCE_SQL_STREAM_001";
Lambdaデータフォーマッターを追加する最良の答えは何ですか?これは絶対に避けたいです。
Firehoseで生成されたファイルに新しい行を追加する同様の要件がありました。このアプリケーションでは、firehoseはAPI Gatewayを介して呼び出されます。
これは、統合リクエストセクションのボディマッピングテンプレートで指定されます。
API Gatewayの次のコマンドは、キネシスファイアホースレコードに新しい行を生成します。
方法1:
#set($payload="$input.path('$.Record.Data')
")
{
"DeliveryStreamName": "$input.path('$.DeliveryStreamName')",
"Record": {
"Data": "$util.base64Encode($payload)"
}
}
API Gateway経由でfirehoseを呼び出す場合、これは完全に機能します。
よろしくお願いいたします。SrivigneshKN
ここで私たちが実装した方法での基本的な例。 JavaScriptを使用してレコードをKinesis Streamに入れ、Firehoseを使用してgzip圧縮でs3の場所にリダイレクトしました。後でathenaは、s3からレコードをフェッチするためにs3の場所からクエリを実行します。
JavaScriptコードを使用してKinesisストリームに送信する前に新しい行を追加するためのコードの下。
var payload = JSON.parse(payload);
finalData = JSON.stringify(payload)+"\n";
var kinesisPayload = {};
kinesisPayload.Data = finalData;
kinesisPayload.StreamName = "kinesisStreamName");
kinesisPayload.PartitionKey = "124";