2017-08-14 42 views
2

我有一個筆記本a.pynb,它具有讀取parquet文件語句的功能。如何在使用「sqlContext」在不同的筆記本中使用其中一個作爲模塊(Pyspark)

我在另一個筆記本b.pynb中使用a.pynb,在這個新筆記本中,我調用a.pynb的函數來讀取這個parquet文件並創建一個sqltable。但它總是失敗

 Error: global name sqlContext is not defined, 

當它在筆記本電腦中定義。

確切代碼:

sc = SparkContext.getOrCreate() 
    sqlContext = SQLContext(sc) 

    def parquet_read(file_name): 
     df = sqlContext.read.parquet(file_name+"*.parquet") 
     return df 

在b.pynb我已經使用這個功能

a.pynb(utils的)

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 
相關問題