在pyspark map逻辑中使用sparksql无法正常工作

时间:2017-10-02 11:31:21

标签: apache-spark pyspark apache-spark-sql

我有很多小文件。我想在RDD中加载它们。然后映射它们以并行地对这些文件执行算法。该算法将需要从HDFS / Hive表中获取数据。当我使用SparkSQL获取数据时,我得到以下错误:

  

pickle.PicklingError:无法序列化对象:异常:它   似乎你试图从一个引用SparkContext   广播变量,动作或转换。 SparkContext只能   用于驱动程序,而不是在工作程序上运行的代码中。更多   信息,请参阅SPARK-5063。

SparkSQL使用SQLContext,它是SparkContext的包装器。这是否意味着我不能在工作人员执行的代码中使用SparkSQL?但那时,它太有限了。

有人可以分享一些关于如何在PySpark中编写逻辑的知识吗?

以下是我正在使用的示例PySpark代码:

def apply_algorithm(filename):
    /* SparkSQL logic goes here */ 
    /* some more logic */
    return someResult


def main(argv):
    print "Entered main method"
    input_dir = sys.argv[1]
    output_dir = sys.argv[2]

    fileNameContentMapRDD = sc.wholeTextFiles(input_dir)
    print "fileNameContentMapRDD = " , fileNameContentMapRDD.collect()

    resultRDD = fileNameContentMapRDD.map(lambda x : apply_algorithm(x[0]))

    print resultRDD.collect()
    print "end of main."

1 个答案:

答案 0 :(得分:2)

  

这是否意味着我不能在工作人员执行的代码中使用SparkSQL?

是的,这意味着这一点。您不能在并行化的上下文中使用RDDsDataFrames