Как передать значение, разделенное пробелом, как один аргумент для выполнения кода java из искры? - PullRequest
0 голосов
/ 09 мая 2020

ALL,

update

Я пытаюсь выполнить код java из искры, передав аргумент (аргумент будет иметь значение, разделенное пробелом). например,

arg4 = "country='USA' AND state='Newyork'"

мой код будет таким:

spark-submit --jars <path>/spark-sql-kafka-0-10_2.11-2.3.0.jar \
--driver-java-options "-Djava.security.auth.login.config=<path>/devjaas.conf" \
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./jaas_hdfs_dev.conf" \
--master yarn \
--deploy-mode client \
--files <path>/jaas_hdfs_dev.conf,<credential> \
--executor-memory 10g \
--executor-cores 5 \
--driver-cores=5 \
--driver-memory=10G \
--conf spark.executor.cores=5 \
--conf spark.yarn.am.cores=5 \
--conf spark.yarn.am.memory=15g \
--conf spark.executor.memoryOverhead=4096 \
--class "<java class>" <jar file> $arg1 $arg2 $arg3 $arg4

это вызывает ошибку, потому что arg4 имеет пробел, а код не обрабатывает значение arg4 как единственный аргумент. Я выполняю искровой код внутри сценария оболочки, я передал все значения переменной в сценарии оболочки.

    arg1= "first"
    arg2="second"
    arg3="third"
    arg4="country='USA' AND state='Newyork'"

при выполнении сценария оболочки с помощью sh -x, я вижу значение arg4 в команде строка вроде этой

'country='\''USA'\'' AND '\''state=NEWYORK'\'''

Как мы можем решить эту проблему? не могли бы вы помочь мне решить эту проблему.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Java обрабатывает набор всех слов, заключенных в двойные кавычки ("), как одну строку. Таким образом, использование двойных кавычек позволит читать список слов, разделенных пробелами, как один аргумент.

Вот рабочая демонстрация:

// File name:  ShowArgs.java

public class ShowArgs {
    public static void main (String[] args) {
        int count = 0;
        for (String s: args) {
            count++;
            System.out.println("arg # " + count + " : " + s);
        }
    }
}

Выход # 1 (запуск программы из командной строки):

$ javac ShowArgs.java

$ java ShowArgs arg1 arg2 arg3 "country='USA' AND state='Newyork'"

arg # 1 : arg1
arg # 2 : arg2
arg # 3 : arg3
arg # 4 : country='USA' AND state='Newyork'

Выход # 2 (Запустить программу через сценарий оболочки)

$ export arg1="Hello!"
$ export arg2="How are you doing"
$ export arg3=", buddy?"
$ export arg4="country='USA' AND state='New York'"

$ java ShowArgs "$arg1" "$arg2" "$arg3" "$arg4"
arg # 1 : Hello!
arg # 2 : How are you doing
arg # 3 : , buddy?
arg # 4 : country='USA' AND state='New York'
1 голос
/ 09 мая 2020

Мы должны передать аргументы, разделенные пробелом, в основной класс. Можете ли вы попробовать передать аргументы, как показано ниже?

--class "<java class>" <jar file> arg1 arg2 arg3 "country='USA' AND state='Newyork'"

Если вы добавите запятую , между аргументами, основной класс будет рассматривать эти аргументы как одно значение пока не найдется место.

Попробуйте заключить свои аргументы в кавычки. как показано ниже.

--class "<java class>" <jar file> "$arg1" "$arg2" "$arg3" "$arg4"
...