将其中一个用作模块时如何在不同的笔记本中使用“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)的主要内容,如果未能解决你的问题,请参考以下文章

在开发基于模块或插件的系统时,我应该如何开始?

如何在将 youtube-dl 用作 python 模块时列出视频分辨率?

当用作模块时,如何让 json-server 延迟响应?

Python学习笔记十六_模块结构调整

如何找到批处理文件的当前目录,然后将其用作路径?

OpenGL/GLFW:为啥将电视用作笔记本电脑的主显示器时检测到的鼠标位置不正确?