【问题标题】:Preloading scripts and parsing `args` in the spark-shell在 spark-shell 中预加载脚本和解析 `args`
【发布时间】:2020-09-04 20:19:58
【问题描述】:

我有一个测试脚本来读取作为参数提供的文本文件,如下所示:

test.scala:

$ cat test.scala
import scala.io.Source

val filename = args(0)
for (line <- Source.fromFile(filename).getLines) {
    println(line)
}

我想阅读下面的文本文件:

$ cat test.txt
test1
test2
test3

我需要在命令行中运行 scala,如下所示:

spark-shell -i test.scala test.txt

我希望 test.txt 被识别为 args(0),但我看到的输出如下:

:26: 错误:未找到:值 args val 文件名 = args(0)

谁能告诉我这样做的正确用法是什么?非常感谢。

更新:

cat test.scala
import scala.io.Source

val args = spark.sqlContext.getConf("spark.driver.args").split(",")
val filename = args(0)

for (line <- Source.fromFile(filename).getLines) {
    println(line)
}

测试结果: spark-shell -i test.scala --conf spark.driver.args="test.txt"

 SQL context available as sqlContext. Loading test.scala... import
 scala.io.Source <console>:26: error: not found: value spark
          val args = spark.sqlContext.getConf("spark.driver.args").split(",")

【问题讨论】:

标签: scala apache-spark


【解决方案1】:

您可以将自定义的 --conf 参数值传递给 spark。以下是传递参数的方式:

import scala.io.Source

val args = spark.sqlContext.getConf("spark.driver.args").split(",")
val arg1 = args(0)
val arg2 = arg(1)
print(arg1)

--conf 中,我必须传递spark.driver.args 参数的值。所以运行脚本的最终命令是:

spark-shell -i test.scala --conf spark.driver.args="param1value,param2value,param3value"

【讨论】:

  • 非常感谢。这适用于 spark 1.6 吗?更新了这个问题。
  • 适用于 spark 2.3。 SparkSession 是从spark-2.0 引入的,所以如果你使用小于2.0 的spark 版本,你会得到spark not found 错误。所以首先初始化SqlContext obj 然后它应该可以工作了。我建议更新您的 spark env 以获得更多功能和更好的性能。
【解决方案2】:

这对我有用

import scala.io.Source

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

val args = sqlContext.getConf("spark.driver.args").split(",")

println(args)

args

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多