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

时间:2017-01-29 01:58:50

标签: python amazon-web-services apache-spark pyspark amazon-emr

我正在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 :(得分:0)

当您运行python 3.4时,可能会将EMR群集配置为使用pyspark 2.7,这可能会在使用pyspark 2.7时导致问题

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

  

我知道在Amazon EMR集群实例上安装了Python 3.4.3,   但是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

有关python2与python3中range()之间差异的更多信息:

Python2 https://docs.python.org/2/library/functions.html#range  范围(开始,停止[,步骤])

  

这是一个用于创建包含算术的列表的通用函数   级数。它最常用于for循环。争论必须   是简单的整数。如果省略step参数,则默认为1。   如果省略start参数,则默认为0.完整表单   返回普通整数列表[start,start + step,start + 2 *   步, ...]。如果step为正,则最后一个元素是最大的开始   + i *步骤少于停止;如果step为负数,则最后一个元素是最小的start + i * step大于stop。步骤不能为零   (或者引发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(10)
range(0, 10)

答案 1 :(得分:0)

试试这个

导出PYSPARK_PYTHON = python3

答案 2 :(得分:0)

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

我现在的解决方案是设置var searchResponse = client.Search<Invoice>(s => s .AllIndices() .AllTypes() .Query(q => +q .Terms(m => m .Field(f => f.LineItems.First().ListItems.First().ListItemID) .Terms(ids) ) ) );

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