为了将文件(由|分隔)保存到DataFrame中,我开发了下一个代码:
obs5
我用于创建DataFrame的case类定义如下:
val file = sc.textFile("path/file/")
val rddFile = file.map(a => a.split("\\|")).map(x => ArchivoProcesar(x(0), x(1), x(2), x(3))
val dfInsumos = rddFile.toDF()
我已经使用 spark-shell 完成了一些功能测试,我的代码运行正常,正确生成了DataFrame。但是当我将程序执行到eclipse时,它会抛出下一个错误:
我的scala类中是否缺少了我正在使用和运行eclipse的东西。或者是什么原因导致我的函数在 spark-shell 中正常工作,而不是在我的eclipse应用程序中?
的问候。
答案 0 :(得分:1)
我已经使用spark-shell完成了一些功能测试,我的代码运行正常,正确生成了DataFrame。
那是因为spark-shell
负责为您创建SparkContext
的实例。 spark-shell
然后确保SparkContext
的引用不是来自“敏感地点”。
但是当我将程序执行到eclipse时,它会抛出下一个错误:
在Spark应用程序的某个地方,您持有对{strong> 序列化的org.apache.spark.SparkContext
的引用,因此将Spark计算从序列化中恢复并通过线路发送给执行程序。
正如@T. Gawęda在评论中提到的那样:
我认为
类型属性的外部类的引用ArchivoProcesar
是一个嵌套类,并且作为嵌套类,它具有对具有类型SparkContext
因此,在将代码从spark-shell
复制到Eclipse时,你已经添加了一些额外的行,你没有想到它们是不必要的,而恰恰相反。找到您创建和引用SparkContext
的任何地方,您将找到问题的根本原因。
我可以看到Spark处理发生在ValidacionInsumos
方法使用的main
类中。我认为影响方法是LeerInsumosAValidar
进行map
转换,这就是你应该寻求答案的地方。
答案 1 :(得分:0)
您的案例类必须具有公共范围。你不能在一个类
中拥有ArchivoProcesar