Spark RDD和DataFrames如何将数据加载到内存中有何不同?

时间:2016-07-27 21:39:52

标签: apache-spark pyspark pyspark-sql

RDD的非常有用,因为它们允许用户在“行”级别(或json单个对象等)处理数据,而无需将所有数据加载到内存中。驱动程序计算出如何将分布式数据(或指向它的指针)分发到worker中,并且每个分区都按照行/行/对象愉快地执行代码。然后,无需在驱动程序中收集数据,我可以将每个分区的结果保存到单独的文本文件中。

DataFrames 即可。这是如何运作的?我怀疑它不一样,因为我可以用一个使用RDD的小型8节点集群处理一个月的服务器日志,但是只要我尝试使用{{加载分布式数据1}}进入DataFrame,它会吐出各种内存不足错误,并且作业中止。数据集与完全与RDD正确执行的数据集相同,相同的群集,相同的时间段。

RDD和DataFrames处理内存加载的方式有什么不同,从某种意义上说,这可能解释了我的结果?请帮助我理解可能正在推动这些结果的RDD和DataFRames之间的差异。谢谢。

1 个答案:

答案 0 :(得分:6)

这是对此的理解,我几周前就遇到了这个问题。您正在加载的功能:

sql_context(spark_context).sql.read.json(s3path)

根据documentation的代码,如果你没有给你的模式,你的json中的火花会非常深入,以找到构建RDD的类型。这类似于databricks库的加载CSV中的inferSchema。

所以我建议你做的是:

  • 使用sql.types
  • 添加Json的架构
  • 或者,据我所知,这是一个非常有用的开销,请使用this method,然后使用toDF()

嗯,这是您面临的可能问题。我没有OOM问题,但加载RDD的东西需要花费几分钟时间。