之前写的程序中,有些API在Spark SQLContext没有,我计算的结果先保存在rdd中,最后在使用RDD转换成dataframe进行保存,话不多说下面是代码.
//一个StruceField你可以把它当成一个特征列。分别用列的名称和数据类型初始化
val structFields = List(StructField("age",DoubleType),StructField("height",DoubleType))
//最后通过StructField的集合来初始化表的模式。
val types = StructType(structFields)
val sparkConf = new SparkConf().setAppName("RDDToDataFrame").setMaster("local")
val sparkContext = new SparkContext(sparkConf)
val sqlContext = new SQLContext(sparkContext)
val rdd = sparkContext.textFile("D:\\Hadoop\\hadoop-2.6.0\\datatest\\world.csv")
//Rdd的数据,里面的数据类型要和之前的StructField里面数据类型对应。否则会报错。
val rowRdd = rdd.map(line=>Row(line.trim.split(",")(0).toDouble,line.trim.split(",")(1).toDouble))
//通过SQLContext来创建DataFrame.
val df = sqlContext.createDataFrame(rowRdd,types)
df.show()
sparkContext.stop()
下面是Spark读取CSV数据文件的代码:
val conf = new SparkConf()
conf.setAppName("FilterAndWhere").setMaster("local")
val sparkContext = new SparkContext(conf)
val sqlContext = new SQLContext(sparkContext)
val data =sqlContext.read. format("com.databricks.spark.csv")
.option("header","true") //这里如果在csv第一行有属性的话,没有就是"false"
.option("inferSchema",true.toString)//这是自动推断属性列的数据类型。
.load("D:\\Hadoop\\hadoop-2.6.0\\datatest\\world.csv")//文件的路径
在这里如果使用上面的代码的话,需要在Maven里面的pom文件中加入下面这个依赖。
<dependency>
<groupId>com.databricks</groupId>
<artifactId>spark-csv_2.10</artifactId>
<version>1.4.0</version>
</dependency>