首页 文章

pyspark saveAsTextFile适用于python 2.7但不适用于3.4

提问于
浏览
1

我在Amazon EMR集群上运行pyspark . 我有一个非常简单的测试脚本,看看我是否可以使用spark-submit将数据写入s3 ...

from pyspark import SparkContext
sc = SparkContext()
numbers = sc.parallelize(range(100))
numbers.saveAsTextFile("s3n://my-bucket/test.txt")
sc.stop()

当我在python2.7环境中使用spark-submit运行这个脚本时,它运行得很好 . 但是当我尝试在python3.4环境中运行相同的脚本时,我得到以下回溯...

Caused by: org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File ".../pyspark/worker.py", line 161, in main 
    func, profiler, deserializer, serializer = read_command(pickleSer, infile)
File ".../pyspark/worker.py", line 54, in read_command
    command = serializer._read_with_length(file)
File ".../pyspark/serializers.py", line 164, in _read_with_length
    return self.loads(obj)
File ".../pyspark/serializers.py", line 419, in loads
    return pickle.loads(obj, encoding=encoding)
AttributeError: Can't get attribute 'unicode' on <module 'builtins' (built-in)>

我正在使用conda并通过设置 PYSPARK_PYTHONPYSPARK_DRIVER_PYTHON 变量来操纵我的python环境 .

在python 3中使用 saveAsTextFile 有问题吗?或者我错过了设置我的python 3环境的一步?

谢谢!

3 回答

  • 0

    您正在运行python 3.4时,您的EMR集群可能配置为使用pyspark 2.7,这可能会在使用pyspark 2.7时出现问题

    以下链接描述了如何配置Amazon EMR以使用spark与python 3.4

    我知道Python 3.4.3安装在Amazon EMR集群实例上,但Spark和其他程序使用的默认Python版本是Python 2.7.10 . 如何将默认Python版本更改为Python 3并运行pyspark作业?

    https://aws.amazon.com/premiumsupport/knowledge-center/emr-pyspark-python-3x/


    Python2与Python3中的 range() 函数有不同的实现 .

    在Python2中 range() 返回 a list of numbers .
    在Python2中 range() 返回 a generator .

    因此,当您使用Python3时,您提供的输入是 generator 而不是 list of numbers

    More info about the different between range() in python2 vs python3:

    Python2 https://docs.python.org/2/library/functions.html#range range(start,stop [,step])

    这是一个多功能函数,用于创建包含算术进度的列表 . 它最常用于for循环 . 参数必须是普通整数 . 如果省略step参数,则默认为1.如果省略start参数,则默认为0.完整表单返回普通整数列表[start,start step,start 2 * step,...] . 如果step为正,则最后一个元素是最大的开始i * step小于stop;如果step为负数,则最后一个元素是最小的start i * step大于stop . step不能为零(否则引发ValueError) .

    例:

    >>> range(10)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    Python 3 https://docs.python.org/3/library/functions.html#func-range range(start, stop[, step])

    范围实际上是一个不可变的序列类型,而不是一个函数,如范围和序列类型 - 列表,元组,范围中所述 .

    >>> range(10)
    range(0, 10)
    
  • 0

    试试这个

    导出PYSPARK_PYTHON = python3

  • 0

    好的,所以看起来这与python3无关,而且与我的conda环境有关 . 简而言之,我在 bootstrap.sh 中设置了一个conda环境,但我实际上只在主节点上激活了它 . 所以主节点使用的是conda python,但是工作者正在使用系统python .

    我现在的解决方案是设置 PYSPARK_PYTHON=/home/hadoop/miniconda3/envs/myenv/python .

    有没有更好的方法在工作节点上激活我的conda环境?

相关问题