Python PySpark和argparse

Python PySpark和argparse,python,apache-spark,pyspark,command-line-interface,argparse,Python,Apache Spark,Pyspark,Command Line Interface,Argparse,如何使用PySpark脚本的argparse指定命令行参数?我为这件事伤了脑筋,我发誓我在其他任何地方都找不到解决办法 以下是我的测试脚本: import argparse from pyspark.sql import SparkSession def main(): parser = argparse.ArgumentParser() parser.add_argument("--v1", "-a", type=int, default=2) parser.add

如何使用PySpark脚本的
argparse
指定命令行参数?我为这件事伤了脑筋,我发誓我在其他任何地方都找不到解决办法

以下是我的测试脚本:

import argparse
from pyspark.sql import SparkSession


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--v1", "-a", type=int, default=2)
    parser.add_argument("--v2", "-b", type=int, default=3)
    args = vars(parser.parse_args())

    spark = (SparkSession.builder
        .appName("Test")
        .master("local[*]")
        .getOrCreate()
    )

    result = args['v1'] + args['v2']
    return result


if __name__ == "__main__":
    result = main()
    print(result)
当我尝试使用
spark submit file.py--v1 5--v2 4运行该文件时,出现如下错误:

[TerminalIPythonApp] CRITICAL | Bad config encountered during initialization:
[TerminalIPythonApp] CRITICAL | Unrecognized flag: '--v1'
但是,当我不指定参数时(仅指定
spark submit file.py
),它使用参数解析器中的默认值2和3正确地进行求和,并按预期显示“5”。很明显,它正确地读取了argparse中的值。当我实际传递非默认值时,命令出了什么问题

注意:我使用的是PySpark 2.4.4和Python 3.6


编辑:当然,我可以直接使用sys.argv并完成它,但是argparse好得多

根据错误消息(类似于),Pyspark尝试将argparse参数传递给ipython而不是python。通过添加/修改以下行,在
/path/to/pyspark/conf/Spark env.sh
中设置正确的Spark环境(用正确的Spark路径替换
Spark\u HOME
):


这可以确保Pyspark查找正确的python3可执行文件-接下来应该完全读取argparse参数。

在调试
argparse
时,最好查看
sys.argv
(查看shell提供了什么)和
args
(查看
argparse
对其做了什么)。但在您的例子中,我想知道是否还有另一个解析器也在查看
sys.argv
。错误看起来不像是由解析器生成的。@hpaulj谢谢,这是有道理的。我打印出了这两个参数,并从argparse中获得sys.argv的
['path/to/file/file.py']
{'v1':2,'v2':3}
。我想知道这个问题是否与我如何在本地机器上设置PySpark有关。我忽略了一个事实,即引发错误的是
终端PyThonapp
。我不知道
PySpark
是如何与
ipython
交互的
ipython
执行自己的解析,无论是在从shell调用还是在处理其魔法时。确切地说,我错过了一个事实,即它是在前面的
ipython
端进行的—我错误地将python驱动程序环境变量设置为使用
ipython
,这就是argparse无法工作的原因。谢谢你最初的建议!
export SPARK_HOME=/home/user/spark-2.4.0-bin-hadoop2.7/
export PYSPARK_PYTHON=python3
export PYSPARK_DRIVER_PYTHON=python3
export SPARK_YARN_USER_ENV="PYSPARK_PYTHON=python3"