PySpark и Argparse - PullRequest
       78

PySpark и Argparse

0 голосов
/ 28 апреля 2020

Как указать аргументы командной строки, используя argparse для скрипта PySpark? Я ломал голову над этим и клянусь, что не могу найти решение где-либо еще.

Вот мой тестовый скрипт:

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 намного лучше!

1 Ответ

0 голосов
/ 28 апреля 2020

На основании сообщения об ошибке (аналогично этому ) Pyspark пытается передать аргументы argparse в i python вместо python. Установите правильную среду Spark в /path/to/pyspark/conf/spark-env.sh, добавив / изменив приведенные ниже строки (замените SPARK_HOME на правильный путь к Spark):

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"

Это гарантирует, что Pyspark ищет правильные python3 исполняемый файл - после чего аргументы argparse должны читаться идеально.

...