将其中一个用作模块时如何在不同的笔记本中使用“sqlContext”(Pyspark)
Posted
技术标签:
【中文标题】将其中一个用作模块时如何在不同的笔记本中使用“sqlContext”(Pyspark)【英文标题】:How to use "sqlContext" in different notebooks when using one of them as a module (Pyspark) 【发布时间】:2017-08-14 14:45:42 【问题描述】:我有一个笔记本 a.pynb,它具有读取 parquet 文件语句的功能。
我在另一个笔记本 b.pynb 中使用 a.pynb,在这个新笔记本中,我正在调用 a.pynb 的函数来读取这个 parquet 文件并创建一个 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,
当它在两个笔记本中定义时。
【问题讨论】:
【参考方案1】:我会非常犹豫地使用您所遵循的方法(即将笔记本作为模块导入)。我认为将实用程序代码移动到.py
文件而不是尝试使用魔法将笔记本作为模块导入会更好。
基于documentation,您似乎忽略了一些魔法:
这里我们只运行定义函数或类的代码
从您的代码示例看来,您将 sqlContext
定义为模块级变量,而不是类或函数。
一种方法是按如下方式重新组织您的代码。我认为,最好将此代码移动到 .py
文件中。
def parquet_read(file_name):
sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)
df = sqlContext.read.parquet(file_name+"*.parquet")
return df
【讨论】:
以上是关于将其中一个用作模块时如何在不同的笔记本中使用“sqlContext”(Pyspark)的主要内容,如果未能解决你的问题,请参考以下文章