2016-12-04 3 views
1

Im пытается выполнить следующую завиток команду для запуска задания:В Spark JobServer. Как передать форматированную строку json на input.string?

curl -k --basic --user 'user:psw' -d 'input.string= {"user":13}' 'https://localhost:8090/jobs?appName=test&classPath=test.ImportCSVFiles&context=import&sync=true' 

Но я получаю следующее сообщение об ошибке:

"com.typesafe.config.ConfigException$WrongType: String: 1: input.string has type OBJECT rather than STRING" 

Моя идея заключается в том, чтобы передать более одного параметра, как запрос SQL. Формат json для удобства обработки на моей поданной банке.

Я нахожусь на правильном пути или есть другой способ?

+0

Я не уверен, что вы хотите достичь, но исключение довольно ясно. {«user»: 13} - это json-объект, а «input.string» хочет, кроме строкового значения. Поэтому при необходимости отправьте его в кавычки escape-строки и внутренне преобразуйте эту строку в json –

+0

@AbhishekAnand, это то, что я также пробовал, но если я использую '' input.string = {\ "user \": 13} "Я получаю тот же результат и использование '" input.string = \ {\ "user \": 13 \} "' then _Reserved character '\\' не допускается за пределами quotes_. С моей точки зрения _ {"user": 13} _ является строкой, она имеет json-формат? Да, но это строка. – Jose

+0

Вы попробовали 'input.string = \ "{\" user \ ": 13} \"' –

ответ

1

Копирование его от комментариев.

Проблема была в том, что json пытался прочитать ее не как строку, а как объект непосредственно из-за строки, начинающейся с фигурных скобок "{".

Правильный вход 'input.string= \"{\"user\":13}\" '

1

input.string не является зарезервированным ключевым словом - на самом деле вы можете назвать параметры произвольно. Скажем, у вас POST два параметра foo.string и foo.number. Затем считывать параметры в вашем SJS работу, как это:

// run is the starting point of a SJS job (also see validate function) 
override def runJob(sc: SparkContext, config: Config): Any = { 
    val cmd = config.getString("input.cmd") 
    val fooString = config.getString("foo.bar") 
    val fooNum = config.getInt("foo.number") 

Только в случае, если вы планируете выполнять работу SJS от Scala/Java:

Apache Commons Lang (org.apache.commons.lang3) приходит с очень полезным классом, чтобы избежать JSON: StringEscapeUtils

Я использую его, чтобы избежать входа из моего приложения Scala, что мне нужно, чтобы перейти на работу SparkJobServer, как это:

input.schema=\"" + StringEscapeUtils.escapeJson(referenceSchema)+"\"" 

referenceSchema документ в формате JSON (в моем случае массив JSON)

input.schema затем один из многих разделенных запятыми параметров в теле HTTP сообщению от Scala ...

Смежные вопросы