Spark RDD 和 DataFrame 在将数据加载到内存中的方式有​​何不同?

How do Spark RDDs and DataFrames differ in how they load data into memory?

RDD 的 很有用,因为它们允许用户在 "row" 级别(或 json 单个对象等)处理数据,而不必将所有数据加载到内存中。驱动程序弄清楚如何将分布式数据(或指向它的指针)分配给工作人员,每个分区愉快地执行代码,每行/行/对象。然后不用收集驱动里的数据,我可以把每个分区的结果保存到一个单独的文本文件中。

数据帧。这是如何运作的?我怀疑它不一样,因为我可以使用 RDD 的小型 8 节点集群处理一个月的服务器日志,但一旦我尝试 load 分布式数据将 sql_context(spark_context).sql.read.json(s3path) 放入 DataFrame 中,它会吐出各种内存不足错误,并且作业中止。数据集与RDD正确执行的数据集完全相同,相同的集群,相同的时间段。

RDD 和 DataFrames 处理内存加载的方式是否存在差异,在某种意义上可以解释我的结果?请帮助我了解可能导致这些结果的 RDD"s 和 DataFrame 之间的差异。谢谢。

这是一个理解点,几周前我也遇到过这个问题。您正在加载的功能:

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

此代码根据 documentation 如果您不提供模式,则火花将深入您的 json 以找到构建 RDD 的类型。这类似于数据块库加载 CSV 中的 inferSchema。

所以我可以推荐你做的是:

  • 将 Json 的架构与 sql.types
  • 添加
  • 或者,据我所知,这样做确实是一项开销,请使用 this method 并在此之后使用 toDF()

嗯,这就是您可能面临的问题。我没有 OOM 问题,但是用 RDD 加载的东西真的很快。