1

APIコールのレコードをS3に送信し、次に特定のフィールドのみをredshiftに送信しようとしています。JSONPathsファイルエラーを使用してKinesisからRedshift COPYコマンド

{

"user": "user_name", 
"type": "GET", 
"date": "2016-03-22 16:14:13", 
"data": [{ 
    "EmpID": 1, 
    "LastName": "Smith", 
    "FirstName": "Bob", 
    "DOB": "1910-01-01", 
    "SSN": "123456789", 
    "HireDate": "1910-01-01", 
    "City": "Town", 
    "Address": "123 Abc" 
}] 

}「データ」フィールドには、クエリが返す場合は、上記の例や多くのレコードのように一つのレコードが含まれていてもよい

:たとえば、私のプログラムが正常にS3へ次JSONを送信します複数の結果。私は、同じ列名を持つredshiftのデータから "Employee"テーブルに情報だけをコピーしたいと思います。 json 'auto'でコピーすると、最上位レベルのフィールドのみが解析されるため、機能しません。

{

"jsonpaths": [ 
    "$.data[0].EmpID", 
    "$.data[0].LastName", 
    "$.data[0].FirstName", 
    "$.data[0].DOB", 
    "$.data[0].SSN", 
    "$.data[0].HireDate", 
    "$.data[0].City", 
    "$.data[0].Address", 
] 

}ここで

は、例えば、私のプログラムの実行です:

  1. 私のAWSを実行し、これを解決するために、私は次のようなJSONのパスのファイルを作成しましたTomcatサーバー上のJava Webプロジェクト
  2. http://localhost:000/projectname/rest/employee/1を入力します(従業員ID 1のjsonオブジェクトをmy SQLから正常に返します)。トライへ
  3. を:RVERデータベース)
  4. は、コールに関するメタデータと、このポストの上部にJSONオブジェクトを作成し、クエリ
  5. の結果はに正常にこのオブジェクトを書き込み「//バケツ/プレフィックス/ S3」コピーコマンドを実行して失敗します。ロードが失敗した理由の詳細については、Redshiftクラスタのロードタブに移動し、コマンドのステータスが終了し、SQLフィールドに「従業員のコピーを」と表示されます。
  6. マニュアルバージョンの以下のコピーコマンドは、私は次のエラーを取得:「ERROR:XX000を:マニフェストファイルが正しいJSON形式ではありません」

    COPY employee 
    FROM 's3://bucket/prefix/filename' 
    CREDENTIALS 'aws_access_key_id=<>;aws_secret_access_key=<>' 
    JSON 's3://bucket/jsonpaths.json'; 
    

マニフェストの問題に対処するために、私は次のファイルを作成:

{ 

    "entries": [ 
    {"url":"s3://bucket/prefix/file", "mandatory":true} 
    ] 

} 
S3に保存された完全なJSONファイルとして生のフィールド値で「が見つかりません区切り文字」:これはstl_load_errorを生み出す

COPY employee 
    FROM 's3://bucket/manifest.json' 
    CREDENTIALS'aws_access_key_id=<>;aws_secret_access_key=<>' 
    MANIFEST 

は、コピーコマンドを実行しました。以前のコピーコマンドからjsonPathsファイル行を追加すると、前と同じマニフェストエラーが発生します。

質問:

は私JSONPathsが正しい形式でファイル-is?

- これはJSONArrayの下位レベルから抽出するための最良の方法ですか?

- マニフェストファイルの形式は正しいですか?マニフェストファイルが必要な理由

メモ:メタデータを追加する前に、s3をテストして、読み込みたいフィールドだけでs3を接続して正常に読み込んだので、赤のシフト先が正しく設定されていない可能性があります。

ありがとうございました!

答えて

2

JSONデータを読み込もうとすると、JSONPathsファイルに構文エラーがあると思いますが、Redshiftはマニフェストファイルが不正であるという(間違った誤解を招く)例外をスローします。だから、あなたのJSONPathsファイル内に構文エラーがない場合、私は、次のコマンドが働くだろうと確信している:

COPY employee 
FROM 's3://bucket/prefix/filename' 
CREDENTIALS 'aws_access_key_id=<>;aws_secret_access_key=<>' 
JSON 's3://bucket/jsonpaths.json'; 

、あなたのJSONPathsファイルと間違って何ですか?私には、それが正常に見えるが、私は物事のカップルは、あなたが試してみてください提案することができます:

  • はすなわち、"$.data[0].Address""$.data[0].Address",を変更、最後のエントリにカンマを削除します。
  • 上記がうまくいかない場合は、ドット表記を使用せずに試してください。たとえば、"$.data[0].EmpID"から"$['data'][0]['EmpID']"に変更します。

P.S.-は、これは完全に間違っている:あなたはしかし、マニフェストファイルを使用するように赤方偏移を言っているからです

COPY employee 
FROM 's3://bucket/manifest.json' 
CREDENTIALS'aws_access_key_id=<>;aws_secret_access_key=<>' 
MANIFEST 

ない入力データがどのようなJSONPaths使用するにはJSON形式またはであること。デフォルトでは、

the COPY command expects the source data to be in character-delimited UTF-8 text files. The default delimiter is a pipe character (|).

+0

ありがとうございます!私はそれを逃したとは信じられません。 Kinesisで発行された自動コピーコマンドはまだ機能しませんが、手動コピーコマンドは少なくとも機能します。 – awsQuestion

+0

あなたはどの部分を欠席しましたか?最後のカンマまたは表記法の表記法の変更(ドット表記法) – TheProletariat

+0

@ketan vijayvargiya、どのようにブラケット記法を使ってすべてのオブジェクトのためにそれを扱うでしょうか? –

関連する問題