AttributeError: 'NoneType' object has no attribute 'sc' 解决方法(二)

上一次本以为可以解决了这个问题,然而并没有那么地简单。博主最近在edx网站学习pyspark,想打一下视频上的代码,结果报错了,依旧是报了“AttributeError:’NoneType’ object has no attribute ‘sc’”,当时就有种怀疑人生的感觉。之后通过谷歌、百度均无果,最后直接就在大名鼎鼎的stack overflow网站,用蹩脚的英语提问,在一个大神的带领下,找到了问题的根源。第一次在stack overflow提问,第一次用英语向技术大牛阐述问题,虽然犯了很多错误,但是非常刺激和享受

扯远了。首先依旧先说明一下,博主的开发环境设置:

  1. 操作系统:windows 7
  2. 开发平台:anconda3
  3. 开发语言:python3
  4. spark版本:spark1.6.0(我用的是Jupyter Notebook来代替pyspark shell的)

我的目的是想建立一个DataFrame。代码如下:

sc.stop()     #关掉之前的sc,防止运行多个sc
print(sc)
data2=[("Alice",5),("Bob",5),("Tom",5)]             
print(data2)
df=sqlContext.createDataFrame(data2,["name","age"])  #建立dataframe
df.show()                                            #把建立的dataframe显示出来

结果报错了:

<pyspark.context.SparkContext object at 0x000000000483CA90>
[('Alice', 5), ('Bob', 5), ('Tom', 5)]
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-3dc21e7bb7c4> in <module>()
      3 data2=[("Alice",5),("Bob",5),("Tom",5)]
      4 print(data2)
----> 5 df=sqlContext.createDataFrame(data2,["name","age"])  #建立dataframe
      6 df.show()                                            #把建立的dataframe显示出来

D:\spark\spark-1.6.0-bin-hadoop2.6\python\pyspark\sql\context.py in createDataFrame(self, data, schema, samplingRatio)
    426             rdd, schema = self._createFromRDD(data, schema, samplingRatio)
    427         else:
--> 428             rdd, schema = self._createFromLocal(data, schema)
    429         jrdd = self._jvm.SerDeUtil.toJavaArray(rdd._to_java_object_rdd())
    430         jdf = self._ssql_ctx.applySchemaToPythonRDD(jrdd.rdd(), schema.json())

D:\spark\spark-1.6.0-bin-hadoop2.6\python\pyspark\sql\context.py in _createFromLocal(self, data, schema)
    358         # convert python objects to sql data
    359         data = [schema.toInternal(row) for row in data]
--> 360         return self._sc.parallelize(data), schema
    361 
    362     @since(1.3)

D:\spark\spark-1.6.0-bin-hadoop2.6\python\pyspark\context.py in parallelize(self, c, numSlices)
    410         [[], [0], [], [2], [4]]
    411         """
--> 412         numSlices = int(numSlices) if numSlices is not None else self.defaultParallelism
    413         if isinstance(c, xrange):
    414             size = len(c)

D:\spark\spark-1.6.0-bin-hadoop2.6\python\pyspark\context.py in defaultParallelism(self)
    346         reduce tasks)
    347         """
--> 348         return self._jsc.sc().defaultParallelism()
    349 
    350     @property

AttributeError: 'NoneType' object has no attribute 'sc'

从上面的代码显示说明了,空对象没有sc这个属性,于是乎我按照以前的经验,初始化一个的新的sc,代码如下:

sc.stop()     #关掉之前的sc,防止运行多个sc
print(sc)
sc=SparkContext("local","hello") #初始化一个新的sc
data2=[("Alice",5),("Bob",5),("Tom",5)]             
print(data2)
df=sqlContext.createDataFrame(data2,["name","age"])  #建立dataframe
df.show()                                            #把建立的dataframe显示出来

报错的结果还是一样。限于篇幅,就不重新再显示一次了。于是间我开始在stack overflow网站请教哪些大牛,他们给予我的建议就是”在一个shell里面最好就运行一个sc,不要去停止,也不要去重新建一个。“一开始无法理解这句话是什么意思?第二天,一次偶然的机会,我重新打开了pyspark的编辑界面,我把sc.stop()去掉,也把sc=SparkContext(“local”,”hello”)去掉,重新run一遍,结果好了!
代码如下:

print(sc)
data2=[("Alice",5),("Bob",5),("Tom",5)]             
print(data2)
df=sqlContext.createDataFrame(data2,["name","age"])  #建立dataframe
df.show()                                            #把建立的dataframe显示出来

结果如下:

<pyspark.context.SparkContext object at 0x000000000483CA90>
[('Alice', 5), ('Bob', 5), ('Tom', 5)]
+-----+---+
| name|age|
+-----+---+
|Alice|  5|
|  Bob|  5|
|  Tom|  5|
+-----+---+

perfect!如果故事就在这里完美,那你就错了,因为我很爱整事儿!
于是我在上面的代码再加一句sc.stop(),run一下,结果又是报了之前的错误—-AttributeError: ‘NoneType’ object has no attribute ‘sc’。接下来我把sc.stop()去掉了,再run一下,结果又报错了,依旧是那个错误———–AttributeError: ‘NoneType’ object has no attribute ‘sc’。怎么会这样呢?为什么一开始没有加sc.stop()不会报错,而后来加了sc.stop()再去掉sc.stop()就会报错了?如果报了错,我是不是把sc.stop()去掉,然后再重启一次pyspark shell才能解决呢?

后来又是偶然发现Jupyter Notebook的Kernel选项有个restart的功能,于是我就点击restart,然后把之前的代码(已经去掉sc.stop())再run一遍,结果就没有报错了。

具体操纵如下:点击Kernel,然后点击Restart,或者Restart &run all即可:
这里写图片描述
这样就可以解决AttributeError: ‘NoneType’ object has no attribute ‘sc’ 这个问题了。

<think>好的,用户遇到了Python中的错误信息'NoneType' object has no attribute 'sc',需要帮助解决。首先,我要分析这个错误的原因。通常,这种错误发生在尝试访问一个值为None的对象的属性或方法时。这里,用户试图访问名为'sc'的属性,但该对象实际上是None,因此没有这个属性。 接下来,我需要考虑可能导致这种情况的常见原因。首先,变量未被正确初始化,可能在代码的某个地方,该变量被赋值为None,或者在函数调用中没有正确返回预期的对象。其次,函数或方法可能在某些条件下返回了None,而用户没有处理这种情况。第三,可能存在异步操作或延迟赋值,导致在访问属性时对象还未被正确赋值。 然后,我需要根据这些可能的原因,逐步给出解决方法。用户需要检查变量的初始化位置,确认是否在所有路径中都正确赋值。添加条件判断来确保对象不为None后再访问属性也是一个关键步骤。此外,调试方法如打印对象类型或使用断点可以帮助定位问题所在。 还要注意用户提供的引用,比如引用[1]中提到如何判断参数为None或空,这可能涉及到在代码中添加None检查。引用[2]中的单例模式可能相关,如果单例实例未正确初始化,也可能导致None的问题。不过当前错误更可能直接与变量未正确初始化有关。 最后,生成相关问题需要考虑用户可能遇到的类似问题或进一步优化代码的需求,比如处理其他属性错误、调试技巧或预防性编程方法。</think>### 问题分析:'NoneType' object has no attribute 'sc' 此错误表示**试图访问一个值为`None`的对象的属性`sc`**。由于`None`是空值对象,没有属性或方法,因此触发`AttributeError`。以下是逐步排查和解决方法: --- #### 1. 定位错误触发点 - **检查报错堆栈**:首先查看错误信息中的具体代码行号,找到类似`AttributeError: 'NoneType' object has no attribute 'sc'`的行。 - **示例代码片段**: ```python obj = get_object() # 可能返回None obj.sc = 10 # 若obj为None则报错 ``` --- #### 2. 常见原因及解决方案 ##### 情况一:变量未正确初始化 - **问题**:对象未被赋予有效值,默认或意外为`None`。 - **解决**: ```python # 检查初始化逻辑 obj = initialize_object() # 确保返回有效对象 if obj is not None: obj.sc = 10 else: print("对象初始化失败") ``` ##### 情况:函数/方法返回了`None` - **问题**:调用的函数可能在某些条件下返回`None`。 - **解决**: ```python # 检查函数返回值 def get_object(): if condition: return MyClass() else: return None # 可能引发问题 obj = get_object() if obj is not None: # 添加保护条件 obj.sc = 10 ``` ##### 情况三:异步操作未完成 - **问题**:在异步场景中(如网络请求、多线程),对象可能尚未被赋值。 - **解决**: ```python # 确保异步操作完成后再访问对象 import time obj = None def async_task(): global obj time.sleep(1) obj = MyClass() async_task() while obj is None: # 等待初始化完成 time.sleep(0.1) obj.sc = 10 ``` --- #### 3. 调试方法 - **打印对象类型**: ```python print(type(obj)) # 输出是否为<class 'NoneType'> ``` - **使用断言**: ```python assert obj is not None, "对象不能为None" ``` - **IDE调试工具**:通过断点检查变量状态。 --- #### 示例修正代码 ```python class MyClass: def __init__(self): self.sc = None def create_object(): # 假设某些条件下返回None return MyClass() if success else None obj = create_object() if obj is not None: # 关键检查 obj.sc = 10 else: print("对象创建失败") ``` ---
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值