java rdd转化为strign_使用Java编程方式将RDD转换成DataFrame

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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值