Bash grep-i shell命令的rdd.pipe抛出java.lang.IllegalStateException?
我正在运行RDD spark操作中使用管道的代码: 我尝试过以下代码片段:Bash grep-i shell命令的rdd.pipe抛出java.lang.IllegalStateException?,bash,scala,apache-spark,rdd,Bash,Scala,Apache Spark,Rdd,我正在运行RDD spark操作中使用管道的代码: 我尝试过以下代码片段: //PIPE - run a external shell script in spark val x = sc.parallelize(Array("A", "Ba", "C", "AD")) val y = x.pipe("grep -i A") println(x.collect()) println(y.collect()) 但我得到了: org.apache.spark.sparkeexception:作业
//PIPE - run a external shell script in spark
val x = sc.parallelize(Array("A", "Ba", "C", "AD"))
val y = x.pipe("grep -i A")
println(x.collect())
println(y.collect())
但我得到了:
org.apache.spark.sparkeexception:作业因阶段失败而中止:阶段61.0中的任务0失败1次,最近的失败:阶段61.0中的任务0.0丢失(TID 592,本地主机,执行器驱动程序):java.lang.IllegalStateException:子进程退出,状态为1。命令run:grep-ia用于运行上述代码段
有没有办法通过管道运行grep-i
命令
我尝试调用一个.sh
脚本,它正在工作,但我想将它作为shell命令运行。
这是因为数据是分区的。即使您在.sh
文件中使用与您所提到的相同的命令,您也会得到相同的错误。如果将RDD重新分区到一个分区,它应该可以正常工作:
val y = x.repartition(1).pipe("grep -i A")
根据:
管道(命令,[envVars])
:
通过shell命令(例如Perl或
bash脚本。RDD元素被写入进程的stdin和行中
其标准输出的输出将作为字符串的RDD返回
当您使用grep
命令时,您不能独立地处理每一行,因为如果一个元素失败,它就存在 子进程以状态1退出
表示Grep命令以非零状态退出。grep的退出代码1仅仅意味着没有选择/匹配任何行-这对于RDD中没有A的所有元素都是正确的them@tomgalpin:但是我在输入RDD中有一个元素A。正确,但是grep命令是针对所有元素独立运行的。因此,当它再次以“Ba”为例运行时,grep“无法”匹配任何行,因此以失败的退出代码退出,从而给出上述错误。在.sh文件中执行此操作时,.sh文件可能每次都退出0。这更有意义吗?@tomgalpin谢谢,任何解决此问题的替代方法,即使您在.sh文件中使用与您提到的相同的命令,您也会得到相同的错误。
除非您在脚本中处理错误。x.repartition(1)。管道工作得很好。谢谢你的团队。