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 加载的东西真的很快。
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 加载的东西真的很快。