Apache Spark - 将 JavaRDD 转换为 DataFrame,反之亦然,性能会下降吗?
Apache Spark - Converting JavaRDD to DataFrame and vice versa, any performance degradation?
我正在通过读取文本文件并将每一行映射到模型 Class 属性来创建 JavaRDD<Model>
。
然后我使用 sqlContext
将 JavaRDD<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()
:
访问
关于 1 和 2 的好处是你得到了一个实际的模式。最后一个,您将路径传递给文件(与其他两种方法一样),但由于未指定格式,Spark 没有关于模式的任何信息 -> 文件中的每一行都被视为 DF 中的新行单列 value
包含整行。
如果您的文本文件格式允许创建模式,例如 CSV,您可以尝试使用第三方库,例如 Spark CSV.
我正在通过读取文本文件并将每一行映射到模型 Class 属性来创建 JavaRDD<Model>
。
然后我使用 sqlContext
将 JavaRDD<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()
:
关于 1 和 2 的好处是你得到了一个实际的模式。最后一个,您将路径传递给文件(与其他两种方法一样),但由于未指定格式,Spark 没有关于模式的任何信息 -> 文件中的每一行都被视为 DF 中的新行单列 value
包含整行。
如果您的文本文件格式允许创建模式,例如 CSV,您可以尝试使用第三方库,例如 Spark CSV.