Amazon Elastic MapReduceコマンドラインツールを使用して、いくつかのシステムコールを結合しています。これらのコマンドは、すでに(部分的に?)エスケープされているJSONテキストを返します。次に、システムコールがそれをRテキストオブジェクト(intern = T)に変換すると、再びエスケープされたように見えます。rjsonパッケージで解析できるように、これをクリーンアップする必要があります。
私はこのようにシステムコールを行います:
system("~/EMR/elastic-mapreduce --describe --jobflow j-2H9P770Z4B8GG", intern=T)
これは次を返します:
[1] "{"
[2] " \"JobFlows\": ["
[3] " {"
[4] " \"LogUri\": \"s3n:\\/\\/emrlogs\\/\","
[5] " \"Name\": \"emrFromR\","
[6] " \"BootstrapActions\": ["
...
ただし、コマンドラインからの同じコマンドは次を返します。
{
"JobFlows": [
{
"LogUri": "s3n:\/\/emrlogs\/",
"Name": "emrFromR",
"BootstrapActions": [
{
"BootstrapActionConfig": {
...
rjsonを介してシステムコールの結果を実行しようとすると、次のエラーが発生します。
Error: '\/' is an unrecognized escape in character string starting "s3n:\/"
これは、s3nラインでの二重エスケープによるものだと思います。私はこのテキストを解析できるものにマッサージするのに苦労しています。
「\\」を「\」に置き換えるのと同じくらい簡単かもしれませんが、正規表現とエスケープに少し苦労しているので、それを適切に行うことができません。
では、文字列のベクトルを取得して、出現する「\\」を「\」に置き換えるにはどうすればよいですか?(この質問を入力する場合でも、2つを表すために3つのバックスラッシュを使用する必要がありました)この特定のユースケースに関連する他のヒントはありますか?
これが私のコードです:
> library(rjson)
> emrJson <- paste(system("~/EMR/elastic-mapreduce --describe --jobflow j-2H9P770Z4B8GG", intern=T))
>
> parser <- newJSONParser()
> for (i in 1:length(emrJson)){
+ parser$addData(emrJson[i])
+ }
>
> parser$getObject()
Error: '\/' is an unrecognized escape in character string starting "s3n:\/"
emrJsonオブジェクトを再作成したい場合は、dput()の出力を次に示します。
> dput(emrJson)
c("{", " \"JobFlows\": [", " {", " \"LogUri\": \"s3n:\\/\\/emrlogs\\/\",",
" \"Name\": \"emrFromR\",", " \"BootstrapActions\": [",
" {", " \"BootstrapActionConfig\": {", " \"Name\": \"Bootstrap 0\",",
" \"ScriptBootstrapAction\": {", " \"Path\": \"s3:\\/\\/rtmpfwblrx\\/bootstrap.sh\",",
" \"Args\": []", " }", " }",
" }", " ],", " \"ExecutionStatusDetail\": {",
" \"EndDateTime\": 1278124414.0,", " \"CreationDateTime\": 1278123795.0,",
" \"LastStateChangeReason\": \"Steps completed\",", " \"State\": \"COMPLETED\",",
" \"StartDateTime\": 1278124000.0,", " \"ReadyDateTime\": 1278124237.0",
" },", " \"Steps\": [", " {", " \"StepConfig\": {",
" \"ActionOnFailure\": \"CANCEL_AND_WAIT\",", " \"Name\": \"Example Streaming Step\",",
" \"HadoopJarStep\": {", " \"MainClass\": null,",
" \"Jar\": \"\\/home\\/hadoop\\/contrib\\/streaming\\/hadoop-0.18-streaming.jar\",",
" \"Args\": [", " \"-input\",", " \"s3n:\\/\\/rtmpfwblrx\\/stream.txt\",",
" \"-output\",", " \"s3n:\\/\\/rtmpfwblrxout\\/\",",
" \"-mapper\",", " \"s3n:\\/\\/rtmpfwblrx\\/mapper.R\",",
" \"-reducer\",", " \"cat\",",
" \"-cacheFile\",", " \"s3n:\\/\\/rtmpfwblrx\\/emrData.RData#emrData.RData\"",
" ],", " \"Properties\": []", " }",
" },", " \"ExecutionStatusDetail\": {", " \"EndDateTime\": 1278124322.0,",
" \"CreationDateTime\": 1278123795.0,", " \"LastStateChangeReason\": null,",
" \"State\": \"COMPLETED\",", " \"StartDateTime\": 1278124232.0",
" }", " }", " ],", " \"JobFlowId\": \"j-2H9P770Z4B8GG\",",
" \"Instances\": {", " \"Ec2KeyName\": \"JL 09282009\",",
" \"InstanceCount\": 2,", " \"Placement\": {",
" \"AvailabilityZone\": \"us-east-1d\"", " },",
" \"KeepJobFlowAliveWhenNoSteps\": false,", " \"SlaveInstanceType\": \"m1.small\",",
" \"MasterInstanceType\": \"m1.small\",", " \"MasterPublicDnsName\": \"ec2-174-129-70-89.compute-1.amazonaws.com\",",
" \"MasterInstanceId\": \"i-2147b84b\",", " \"InstanceGroups\": null,",
" \"HadoopVersion\": \"0.18\"", " }", " }", " ]",
"}")