我有一个笔记本a.pynb,它具有镶木地板文件的读取声明功能。
我在另一个笔记本b.pynb中使用a.pynb,在这个新笔记本中,我调用a.pynb的函数来读取这个镶木地板文件并创建一个sqltable。但它始终以
失败 Error: global name sqlContext is not defined,
在两个笔记本中都定义了它。
确切代码:
a.pynb(Utils)
sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)
def parquet_read(file_name):
df = sqlContext.read.parquet(file_name+"*.parquet")
return df
在b.pynb中我使用了这个功能
import nbimporter
import a as commonUtils
reload(commonUtils)
sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)
df2 = commonUtils.parquet_read("abc")
总是失败
Error: global name sqlContext is not defined,
在两个笔记本中都定义了它。
答案 0 :(得分:2)
我会非常犹豫地使用你所遵循的方法(即将笔记本导入为模块)。我认为将移动实用程序代码移动到.py
文件而不是尝试使用魔术将笔记本导入为模块会更好。
基于documentation,你似乎忽视了一些魔法:
这里我们只运行定义函数或类
的代码
从您的代码示例中可以看出,您将sqlContext
定义为模块级变量,而不是类或函数。
一种方法是重新组织您的代码,如下所示。我认为更好的办法是将此代码移到.py
文件中。
def parquet_read(file_name):
sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)
df = sqlContext.read.parquet(file_name+"*.parquet")
return df