Apache Spark - 将 JavaRDD 转换为 DataFrame,反之亦然,性能会下降吗?

Apache Spark - Converting JavaRDD to DataFrame and vice versa, any performance degradation?

我正在通过读取文本文件并将每一行映射到模型 Class 属性来创建 JavaRDD<Model>

然后我使用 sqlContextJavaRDD<Model> 转换为 DataFrame

DataFrame fileDF = sqlContext.createDataFrame(javaRDD, Model.class);

基本上,我们正在尝试使用 DataFrame API 来提高性能和易于编写。

DataFrame转JavaRDD时是否会出现性能下降或者会重新创建模型对象

我这样做的原因是,我没有看到任何使用 sqlContext 直接读取文本文件的方法。

有没有其他有效的方法来做到这一点?

会不会慢一点?

肯定会有一些开销,虽然我没有对多少进行基准测试。为什么?因为 createDataFrame 必须:

  • 使用反射获取 DataFrame 的模式(一次用于整个 RDD)
  • 将 RDD 中的实体映射到行记录(因此它符合数据帧格式)- N 次,RDD 中每个实体一次
  • 创建实际的 DataFrame 对象。

有关系吗?

我怀疑。反射将非常快,因为它只是一个对象,您可能只有少数几个字段。

转型会不会很慢?同样可能不会,因为每条记录只有几个字段要迭代。

备选方案

但是,如果您不将该 RDD 用于任何其他用途,您可以在 DataFrameReader class 中使用一些选项,可以通过 SQLContext.read():

访问
  • json: 几种方法here
  • 实木复合地板:here
  • 文本:here

关于 1 和 2 的好处是你得到了一个实际的模式。最后一个,您将路径传递给文件(与其他两种方法一样),但由于未指定格式,Spark 没有关于模式的任何信息 -> 文件中的每一行都被视为 DF 中的新行单列 value 包含整行。

如果您的文本文件格式允许创建模式,例如 CSV,您可以尝试使用第三方库,例如 Spark CSV.