我通过读取一个文本文件并将每一行映射到Model 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中每个实体一次
- 创建实际的CCD_ 7对象
这有关系吗
我怀疑。反射会很快,因为它只是一个物体,而那里可能只有几个场。
转型会缓慢吗?同样可能没有,因为每个记录只有几个字段可以迭代。
替代方案
但是,如果您没有将该RDD用于其他任何事情,那么DataFrameReader类中有几个选项,可以通过SQLContext.read()
:访问
- json:这里有几种方法
- 镶木地板:在这里
- text:此处
关于1和2的好处是你得到了一个实际的模式。最后一个方法是,您传递文件的路径(与其他两种方法一样),但由于没有指定格式,Spark没有任何关于模式的信息->文件中的每一行都被视为DF中的新行,其中包含整行的单列value
。
如果您有一个允许创建模式的格式的文本文件,例如CSV,您可以尝试使用第三方库,如Spark CSV。