一、问题背景
原本我是想利用spark处理大量的数据集来训练Lr模型,然后需要提取数据集中的标签索引,然后我就想将标签的索引保存成csv格式的数据,再直接导入到hive表中。
这里我们需要得到csv格式的数据,首先我想到可以先创建成dataframe格式的数据==>再转换成csv格式数据。
二、解决方案
经过我的一系列变换,将我所需要的数据都存储到了ListBuffer
的数组中,然后直接利用createDataFrame
来创建df数据,代码如下:
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import scala.collection.mutable.ListBuffer
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
var list = ListBuffer(("a", 1, 0),…,("z", 5, 99))
val df = sqlContext.createDataFrame(list).toDF("class", "key", "index") // 创建一个dataframe类型的数据
这样我们就把我们的数据变成了DataFrame格式,接下来就是找转csv格式数据的方法,我这里参考了一下:
http://cn.voidcc.com/question/p-wygpwrof-boe.html
DataFrame转csv:
方法一:
df.write.format("com.databricks.spark.csv").option("header", "true") save("myFile.csv")
上述方法,用了save的方法,csv方法就是save方法的一种封装,对比如下,然后会产生一个myFile.csv的文件夹,该文件夹的命名也可以不用.csv结尾,同时其中的数据会保存成多个csv文件。
save方法 | csv方法 |
---|---|
![]() | ![]() |
方法二:
df.coalesce(1).write.option("header", "true").csv("myFile.csv")
这里便使用了csv方法,同样会产生一个myFile.csv的文件夹,但其中的数据会全部保存到单个csv文件中,这里主要是coalesce(1)
来将DF合并,然后才会保存到一个csv文件中。
上述最终的结果产生了多个文件(有利于分布式)或是单个文件,各自有各自的优势,看自己目前的需要各取所需啦!