RDD的非常有用,因为它们允许用户在“行”级别(或json单个对象等)处理数据,而无需将所有数据加载到内存中。驱动程序计算出如何将分布式数据(或指向它的指针)分发到worker中,并且每个分区都按照行/行/对象愉快地执行代码。然后,无需在驱动程序中收集数据,我可以将每个分区的结果保存到单独的文本文件中。
DataFrames 即可。这是如何运作的?我怀疑它不一样,因为我可以用一个使用RDD的小型8节点集群处理一个月的服务器日志,但是只要我尝试使用{{加载分布式数据1}}进入DataFrame,它会吐出各种内存不足错误,并且作业中止。数据集与完全与RDD正确执行的数据集相同,相同的群集,相同的时间段。
RDD和DataFrames处理内存加载的方式有什么不同,从某种意义上说,这可能解释了我的结果?请帮助我理解可能正在推动这些结果的RDD和DataFRames之间的差异。谢谢。
答案 0 :(得分:6)
这是对此的理解,我几周前就遇到了这个问题。您正在加载的功能:
sql_context(spark_context).sql.read.json(s3path)
根据documentation的代码,如果你没有给你的模式,你的json中的火花会非常深入,以找到构建RDD的类型。这类似于databricks库的加载CSV中的inferSchema。
所以我建议你做的是:
sql.types
toDF()
嗯,这是您面临的可能问题。我没有OOM问题,但加载RDD的东西需要花费几分钟时间。