【问题标题】:How to use "sqlContext" in different notebooks when using one of them as a module (Pyspark)将其中一个用作模块时如何在不同的笔记本中使用“sqlContext”(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, 

当它在两个笔记本中定义时。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2022-08-11
      • 2020-03-29
      • 2015-10-19
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      相关资源
      最近更新 更多