我有一个笔记本 a.pynb,它具有读取 parquet 文件语句的功能。
我在另一个笔记本 b.pynb 中使用 a.pynb,在这个新笔记本中,我调用 a.pynb 的一个函数来读取这个 parquet 文件并创建一个 sqltable。但它总是失败
Error: global name sqlContext is not defined,
当它在两个笔记本中都有定义时。
具体代码:
a.pynb(实用程序)
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,
当它在两个笔记本中都有定义时。
最佳答案
我会非常犹豫地使用您正在遵循的方法(即将笔记本作为模块导入)。我认为您最好将实用程序代码移动到 .py
文件,而不是尝试使用魔术将笔记本作为模块导入。
基于documentation ,看来您忽略了一些魔法:
here we only run code which either defines a function or a class
从您的代码示例看来,您将 sqlContext
定义为模块级变量,而不是类或函数。
一种方法是按如下方式重新组织您的代码。我认为更好的方法是将此代码移动到 .py
文件中。
def parquet_read(file_name):
sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)
df = sqlContext.read.parquet(file_name+"*.parquet")
return df
关于python - 将其中一个笔记本用作模块时如何在不同笔记本中使用 "sqlContext"(Pyspark),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45677180/