python - 将其中一个笔记本用作模块时如何在不同笔记本中使用 "sqlContext"(Pyspark)

标签 python apache-spark pyspark jupyter-notebook jupyter

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

相关文章:

python - 为什么在声明子类的对象时不调用父类(super class)的构造函数?

python - 错误谷歌 API : "Credentials in post body and basic Authorization header do not match"

hadoop - Spark 提交到远程 yarn

json - 如何使用Spark Scala读取特定格式的Json文件?

apache-spark - 属性错误 : 'NoneType' object has no attribute 'write in Pyspark

python - Pyspark 将 RowMatrix 转换为 DataFrame 或 RDD

python - 时间戳转换为日期时间 Python、Pandas

python - 如何在 Altair 的 HConcatChart 中配置图表位置

scala - 如何计算DataFrame列的2的幂

apache-spark - 根据另一列的元素从pyspark数组中删除元素