文档章节

查询分数大于80分的学生信息java版本实例

别寒
 别寒
发布于 2017/07/27 11:40
字数 630
阅读 122
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

package cn.hhb.spark.sql;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
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.api.java.function.PairFunction;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.types.DataType;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import scala.Tuple2;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by dell on 2017/7/27.
 */
public class JSONDataSource {
    public static void main(String[] args) {

        // 创建SparkConf
        SparkConf conf = new SparkConf()
                .setAppName("JSONDataSource").setMaster("local")
                .set("spark.testing.memory", "2147480000");

        // 创建javasparkContext
        JavaSparkContext sc = new JavaSparkContext(conf);
        SQLContext sqlContext = new SQLContext(sc);

        // 针对json文件,创建dataframe(针对json文件创建dataframe)
        DataFrame studentScoresDF = sqlContext.read().json("c://students.json");

        // 针对学生成绩信息的dataframe,注册临时表,查询分数大于80的学生
        // (注册临时表,针对临时表执行sql语句)
        studentScoresDF.registerTempTable("student_scores");
        DataFrame goodStudentScoresDF = sqlContext.sql("select name,score from student_scores where score >= 80");

        // (将dataframe转换为rdd,执行transframation操作)
        List<String> goodStudentNames = goodStudentScoresDF.javaRDD().map(new Function<Row, String>() {
            @Override
            public String call(Row row) throws Exception {
                return row.getString(0);
            }
        }).collect();

        // 然后针对javaRDD<String>,创建DataFrame
        // (针对包含json串的javardd,创建dataframe)
        List<String> studentInfoJSONs = new ArrayList<String>();
        studentInfoJSONs.add("{\"name\":\"Leo\", \"age\":18}");
        studentInfoJSONs.add("{\"name\":\"Marry\", \"age\":17}");
        studentInfoJSONs.add("{\"name\":\"Jack\", \"age\":19}");
        JavaRDD<String> studentInfoJSONsRDD = sc.parallelize(studentInfoJSONs);
        DataFrame studentInfosDF = sqlContext.read().json(studentInfoJSONsRDD);

        // 针对学生基本信息DataFrame,注册临时表,然后查询分数大于80分的学生的基本信息
        studentInfosDF.registerTempTable("student_infos");
        String sql = "select name,age from student_infos where name in(";
        for (int i=0; i<goodStudentNames.size(); i++) {
            sql += "'" + goodStudentNames.get(i) + "'";
            if (i < goodStudentNames.size() - 1){
                sql += ",";
            }
        }
        sql += ")";

        DataFrame goodStudentInfosDF = sqlContext.sql(sql);

        // 然后将两份数据的dataframe,转换为javaPairRDD,执行join transframation
        // (将dataframe转换为javardd,再map为JavaPairRDD,然后进行join)
        JavaPairRDD<String, Tuple2<Integer, Integer>> goodStudentsRDD =
                goodStudentScoresDF.javaRDD().mapToPair(new PairFunction<Row, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(Row row) throws Exception {
                return new Tuple2<String, Integer>(
                        row.getString(0),
                        Integer.valueOf(String.valueOf(row.getLong(1)))
                );
            }
        }).join(goodStudentInfosDF.javaRDD().mapToPair(new PairFunction<Row, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(Row row) throws Exception {
                return new Tuple2<String, Integer>(
                        row.getString(0),
                        Integer.valueOf(String.valueOf(row.getLong(1)))
                );
            }
        }));

        // 将封装在rdd中的好学生的全部信息,转换为一个javardd<row>的格式
        // (将javardd转换为dataframe)
        // 就是之前 以编程方式动态指定元数据,将rdd转换为dataframe 的知识点
        JavaRDD<Row> goodStudentRowsRDD = goodStudentsRDD.map(new Function<Tuple2<String, Tuple2<Integer, Integer>>, Row>() {
            @Override
            public Row call(Tuple2<String, Tuple2<Integer, Integer>> tuple) throws Exception {
                return RowFactory.create(tuple._1, tuple._2._1, tuple._2._2);
            }
        });

        // 然后动态构造一份元数据,将javardd<row>转换为dataframe
        List<StructField> structFields = new ArrayList<StructField>();
        structFields.add(DataTypes.createStructField("name", DataTypes.StringType, true));
        structFields.add(DataTypes.createStructField("score", DataTypes.IntegerType, true));
        structFields.add(DataTypes.createStructField("age", DataTypes.IntegerType, true));
        StructType structType = DataTypes.createStructType(structFields);

        // 使用动态构造的元数据,将rdd转换为dataframe
        DataFrame goodStudentsDF = sqlContext.createDataFrame(goodStudentRowsRDD, structType);

        // 将dataframe转换为javardd,然后打印
        List<Row> rows = goodStudentsDF.javaRDD().collect();
        for (Row row : rows){
            System.out.println(row);
        }

        // 将好学生的全部信息保存到一个json文件中去
        // (将dataframe中的数据保存到json文件中去)
        goodStudentsDF.write().format("json").save("c://goodStudent.json");

        sc.close();

    }
}

别寒
粉丝 30
博文 273
码字总数 155300
作品 0
永州
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.2K
3
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6K
18
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22

没有更多内容

加载失败,请刷新页面

加载更多

Java圈里,什么样的人,会越来越穷?

“我不想做 Java 了,想去做大数据!但我一个双非本科,能行么?“ 我还挺费解,为什么疫情之后,很多粉丝都想去做大数据, 但仔细想想原因太简单。 因为做大数据值钱、岗位还多。(是的,成...

倪升武
今天
0
0
Java 8 - Stream 集合操作快速上手

点击上方Java学习指南关注公众号 每天阅读Java干货文章 链接:www.jianshu.com/p/9fe8632d0bc2 目录 Stream 简介 为什么要使用 Stream 实例数据源 Filter Map FlatMap Reduce Collect Option...

xqnode
前天
0
0
工作流引擎的工作原理与功能

协同工作流引擎(Synchro flow)基于企业流程自动化基础的平台的产品同时也是企业流程再造的核心产品,并且提供以业务建模、流程设计、流程仿真、界面设计、业务整合、部署执行、系统管理、业...

osc_3nr0mda4
6分钟前
0
0
第三本 PDF !!!程序员必知核心基础知识

我们可以感觉出来,计算机专业的门槛正在逐渐增高,人与人之间的差距在逐渐拉大,今天和 一位阿里的大龄程序员聊天后发现,他也觉得自己底层知识很薄弱,正在找时间恶补,也在感叹时间管理的...

osc_htns3spg
7分钟前
0
0
【CSS】679- rem,em,px的区别和使用场景

作者:大前端小菜鸟 来源: cnblogs.com/hyns/p/12380944.html 作rem布局原理深度理解(以及em/vw/vh) 一、前言 我们h5项目终端适配采用的是淘宝那套《Flexible实现手淘H5页面的终端适配》方...

前端自习课
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部