首页 > 解决方案 > 如何将空格分隔值作为单个参数传递以从 spark 执行 java 代码?

问题描述

全部,

更新

我正在尝试通过传递参数(参数将具有空格分隔值)从 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'\'''

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

标签: javaapache-spark

解决方案


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'

推荐阅读