Я склеиваю несколько системных вызовов, используя инструменты командной строки Amazon Elastic Map Reduce. Эти команды возвращают текст 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. Я изо всех сил пытаюсь получить этот текст в массе, что будет анализировать.
Это может быть так же просто, как заменить "\\" на "\", но, поскольку я вроде как борюсь с регулярными выражениями и экранированием, я не могу сделать это правильно.
Так как же взять вектор строк и заменить любое вхождение "\\" на "\"? (даже для того, чтобы напечатать этот вопрос, мне пришлось использовать три обратные слэши, чтобы обозначить два). Какие-либо другие советы, связанные с этим конкретным вариантом использования?
Вот мой код более подробно:
> 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\"", " }", " }", " ]",
"}")