当使用其中一个作为模块时,如何在不同的笔记本中使用“sqlContext”(Pyspark)

时间:2017-08-14 14:45:43

标签: python apache-spark pyspark jupyter-notebook jupyter

我有一个笔记本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, 

在两个笔记本中都定义了它。

1 个答案:

答案 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