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

xv7*_*v70 3 apache-spark pyspark pyspark-sql

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

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

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

Thi*_*dim 6

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

sql_context(spark_context).sql.read.json(s3path)
Run Code Online (Sandbox Code Playgroud)

这个代码根据文档,如果你不给模式,你的json中的spark会非常深入,找到构建RDD的类型.这类似于databricks库的加载CSV中的inferSchema.

所以我建议你做的是:

  • 添加Json的Schema sql.types
  • 或者,正如我所知,这是一个真正的开销,使用此方法并在此之后使用toDF()

嗯,这是你面临的可能问题.我没有OOM问题,但是加载一些RDD非常快的东西需要几分钟.