如何将空格分隔的值作为单个参数传递以执行spark的java代码?

jum4pzuy  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(578)

全部,

更新

我试图通过传递参数来执行spark的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的值视为单个参数。我正在shell脚本中执行spark代码,我已将所有值传递给shell脚本中的变量。

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

在通过sh-x执行shell脚本时,我确实看到命令行中arg4的值如下

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

我们如何处理这个问题?你能帮我解决这个问题吗。

busg9geu

busg9geu1#

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(通过shell脚本运行程序)

$ 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'
ldxq2e6h

ldxq2e6h2#

我们必须向主类传递用空格分隔的参数,您可以尝试如下传递参数。

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

如果加逗号 , 在参数之间,主类将把这些参数作为单个值处理,直到找到空间为止。
尽量把你的论点放在引号里。就像下面一样。

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

相关问题