package cn.hhb.spark.sql;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.*;
import org.apache.spark.sql.types.*;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import java.util.ArrayList;
import java.util.List;
/**
* 以编程方式动态指定元数据,将rdd转换为dataframe
* Created by dell on 2017/7/26.
*/
public class RDD2DataFrameProgrammatically {
public static void main(String[] args) {
// 创建SparkConf
SparkConf conf = new SparkConf()
.setAppName("filter").setMaster("local")
.set("spark.testing.memory", "2147480000");
// 创建javasparkContext
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
// 第一步,创建一个普通的rdd,但是必须将其转换为rdd的格式
JavaRDD lines = sc.textFile("c://students.txt");
// 往row中塞数据的时候,要注意,什么格式的数据,就用什么格式转换一下
JavaRDD studentRDD = lines.map(new Function() {
@Override
public Row call(String line) throws Exception {
String[] lineSplited = line.split(",");
return RowFactory.create(
Integer.valueOf(lineSplited[0]),
lineSplited[1],
Integer.valueOf(lineSplited[2]));
}
});
// 第二步,动态构造元数据
/**
* 比如说,id,name等,field的名称和类型,可能都是在程序运行过程中,动态从mysql里
* 或者是配置文件中,加载出来的,是不固定的
* 所以特别适合用这种编程的方式,来构造元数据
*/
List structFilelds = new ArrayList();
structFilelds.add(DataTypes.createStructField("id", DataTypes.IntegerType, true));
structFilelds.add(DataTypes.createStructField("name", DataTypes.StringType, true));
structFilelds.add(DataTypes.createStructField("age", DataTypes.IntegerType, true));
StructType structType = DataTypes.createStructType(structFilelds);
// 第三步,使用动态构造的元数据,将rdd转换为dataframe
DataFrame studentDF = sqlContext.createDataFrame(studentRDD, structType);
// 后面就可以使用dataFrame了
studentDF.registerTempTable("students");
DataFrame teenagerDF = sqlContext.sql("select * from students where age <= 18");
List rows = teenagerDF.javaRDD().collect();
for (Row row : rows){
System.out.println(row);
}
sc.close();
}
}