Замените символ свиньи в HDInsight с помощью powershell

Мои данные в следующем формате..

{"Foo":"ABC","Bar":"20090101100000","Quux":"{\"QuuxId\":1234,\"QuuxName\":\"Sam\"}"}

Мне нужно, чтобы это было в таком формате:

{"Foo":"ABC","Bar":"20090101100000","Quux":{"QuuxId":1234,"QuuxName":"Sam"}}

Я пытаюсь использовать функцию замены Pig, чтобы получить ее в нужном мне формате. Итак, я попробовал как здесь..

#Specify the cluster name
$clusterName = "CLUSTERNAME"
#Where the output will be saved
$statusFolder = "/tutorial/pig/status"

#Store the Pig Latin into $QueryString
$QueryString =  "LOGS = LOAD 'wasb:///example/data/sample.log'as unparsedString:chararray;" +
"REPL1 = foreach LOGS REPLACE($0, '"\\{', '\\{');"
...and so on..

Я получаю сообщение об ошибке во второй строке (REPL1 =...) Неожиданный токен '\\' в выражении или операторе.

Теперь этот код отлично работает, когда я запускаю его с помощью удаленного рабочего стола.

Любая помощь искренне приветствуется.

Спасибо


person Arnab    schedule 19.07.2015    source источник
comment
избегайте " как `" или "". Возможно, вам также потребуется заменить $0 на `$0.   -  person Mathias R. Jessen    schedule 19.07.2015


Ответы (1)


Я предполагаю, что вы пытаетесь сохранить в переменной следующее строковое значение:

REPL1 = foreach LOGS REPLACE($0, '"\\{', '\\{');

Первая «интерпретация» вашей строки выполняется синтаксическим анализатором PowerShell. Поскольку вы используете двойные кавычки ("), это рассматривается как расширяемая строка.

Поскольку вы не экранируете " внутри оператора REPLACE(), синтаксический анализатор предполагает, что на этом строка заканчивается.

То, что у вас осталось, это:

"REPL1 = foreach LOGS REPLACE(, '"
# a valid string, $0 expanded to an empty string
\\
# two slashes , PowerShell cannot resolve these to anything meaningful
{
# opening curly brace
', '
# a valid string literal
\\
# two slashes , PowerShell still cannot resolve these to anything meaningful
{
# opening curly brace
');"
# non-terminated string

Вам нужно экранировать " внутри REPLACE(), либо используя две двойные кавычки подряд (""), либо используя escape-последовательность обратной кавычки (\"`):

$QueryString += "REPL1 = foreach LOGS REPLACE($0, '`"\\{', '\\{');"

or

$QueryString += "REPL1 = foreach LOGS REPLACE($0, '""\\{', '\\{');"

Вы также можете избежать $0, чтобы избежать расширения строки:

$QueryString += "REPL1 = foreach LOGS REPLACE(`$0, '""\\{', '\\{');"
person Mathias R. Jessen    schedule 19.07.2015
comment
Новая ошибка: Start-AzureHDInsightJob: запрос не выполнен с кодом: BadRequest Content: {ошибка: переданный параметр неверно указан в кавычках: LOGS = LOAD 'wasb://[email protected]/pigdatauax/' as unparsedString :chararray;REPL1c = foreach LOGS GENERATE REPLACE($0, '\\\\\{', '\\\\{');} В строке:1 char:11 + CategoryInfo : NotSpecified: (:) [Start-AzureHDInsightJob ], HttpLayerException + FullyQualifiedErrorId: Microsoft.WindowsAzure.Management.HDInsight.Framework.Core.Library.WebRequest.HttpLayerE - person Arnab; 05.08.2015