spark之DataFrame 通过反射创建

本文介绍如何使用JavaBean反射机制创建DataFrame,并通过Spark SQL进行条件查询。首先定义JavaBean类并实现序列化接口,接着利用JavaSparkContext读取文本文件,并通过map函数将每一行数据映射为JavaBean实例。然后利用SQLContext创建DataFrame并注册临时表,最后执行SQL查询筛选年龄在13至21岁之间的个体。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面给大家介绍通过javaBeas反射创建DataFrame。
一,准备数据文件:
这里写图片描述

二,过程分析:

    1,根据数据文件创建对应的javaBean,设置对应的set和get方法。
    2,读取text文件通过map函数将文件内容分割,设置到person并返回。
    3,通过返回的RDD和javaBean反射创建DataFrame。并设置表名。
    4,条件查旬从该表中筛选想要的信息。返回的也是一个DataFrame.
    5,再次通过map算子将teenagers转化为RDD将结果输出注意在DataFrame转RDD时的map泛型的第一个参数是row,对应表的一行数据。通过getString指定位置取对应的参数。

三,代码展示:

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.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;

public class SparkrefleCttest2 {

    public static void main(String[] args) {
        SparkConf conf=new SparkConf();
        conf.set("spark.testing.memory", "269522560000");
        JavaSparkContext sc=new JavaSparkContext("local","SparkrefleCttest2",conf);
        System.out.println("与spark的连接建立成功"+conf);
        SQLContext sqlContext=new org.apache.spark.sql.SQLContext(sc);

        System.out.println("sqlContext建立成功" + sqlContext);

        //读取text文件通过map函数将文件内容分割,设置到person并返回
        JavaRDD<Person> people=sc.textFile("hdfs://192.168.61.128:9000/spark001/sparkreflect.txt").map(new Function<String,Person>(){
            public Person call(String line) throws Exception {
                String[] ss=line.split(",");
                Person person=new Person();
                person.setName(ss[0]);
                person.setAge(Integer.parseInt(ss[1]));
                return person;
            }});

        //通过javaBeans 即person创建DataFrame
        DataFrame schemaPeople=sqlContext.createDataFrame(people, Person.class);
        schemaPeople.registerTempTable("people");//创建表名

        //从创建好的表中条件查旬信息
        DataFrame teenagers=sqlContext.sql("select name from people where age>13 and age<22");

        //再次通过map算子将teenagers转化为RDD将结果输出
        //注意在DataFrame转RDD时的map泛型的第一个参数是row,对应表的一行数据
        List<String> teenagerNames =teenagers.javaRDD().map(new Function<Row,String>(){
            public String call(Row row) throws Exception {
                String name=row.getString(0);
                return "Name: "+name;
            }}).collect();

        for(String name:teenagerNames){
            System.out.println("符合条件的人:"+name);
        }
    }



    public static class Person implements Serializable{
        private String name;
        private int age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值