Spark开发-SparkSql的开发

核心
1、介绍SparkSQL中的2中RDD转换成DataFrame的方式
2、使用反射推理模式
3、以编程的方式指定schema

Spark SQL支持将现有RDD转换为DataFrames的两种不同方法。第一种方法使用反射来推断包含特定类型对象的RDD模式。当您在编写Spark应用程序时已经知道架构时,这种基于反射的方法会导致更简洁的代码,并且可以很好地运行。
创建DataFrames的第二种方法是通过编程接口,允许您构建一个模式,然后将其应用到现有的RDD。虽然这种方法更详细,但是当运行时列和它们的类型不知道时,它允许构造DataFrames。

1、使用反射推理模式
Spark SQL支持自动将JavaBeans的RDD 转换为DataFrame。使用反射获取的BeanInfo定义了表的模式。目前,Spark SQL不支持包含嵌套或包含复杂类型(如列表或数组)的JavaBean。您可以通过创建一个实现Serializable的类并为其所有字段设置getter和setter来创建JavaBean。

代码样例

package com.xlucas;

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.SQLContext;

import java.io.Serializable;

/**
 * Created by xlucas on 2017-09-28.
 * 使用反射推理模式
 */

public class SparkSql_Ser {
    public static void main(String[] args){

        SparkConf conf=new SparkConf();
        conf.setAppName("Spark-Sql");
        conf.setMaster("local");
        //实例化SparkContext
        JavaSparkContext sc=new JavaSparkContext(conf);
        //实例化SQLContext
        SQLContext sqlc=new SQLContext(sc);
        //读取数据文件,并且将数据做map操作以后进行一个切分操作
        JavaRDD<Person> person = sc.textFile("E://data//people.txt").map(new Function<String, Person>() {
            @Override
            public Person call(String line) throws Exception {
                String[] parts=line.split(",");
                Person p=new Person();
                p.setName(parts[0]);
                p.setAge(Integer.parseInt(parts[1].trim()));
                return  p;
            }
        });
        //通过调用createDataFrame并提供JavaBean的Class对象,可以将模式应用于现有的RDD 。
        DataFrame df=sqlc.createDataFrame(person,Person.class);
        //将DataFrame注册到一个表里面
        df.registerTempTable("people");
        //DataFrame的编程
        DataFrame df1=sqlc.sql("select * from people");
        df1.show();

    }
    //创建一个实现Serializable的类
    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;
        }
    }
}

2、以编程的方式指定schema
当JavaBean类不能被提前定义时(例如,记录的结构被编码为一个字符串,或者文本数据集将被解析,而对于不同的用户而言,字段的投射将不同),DataFrame可以通过三个步骤以编程方式创建一个。
1. Row从原始RDD 创建一个RDD;
2. 创建由在步骤1中创建的RDD中StructType匹配Rows 的结构所 表示的模式。
3. Row通过createDataFrame方法提供的方式将模式应用于RDD SQLContext。

代码样例

package com.xlucas;

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.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 java.util.ArrayList;
import java.util.List;

/**
 * Created by xlucas on 2017-09-28.
 * 以编程的方式指定schema
 */
public class SparkSql_Str {
    public static void main(String[] args){
        //实例化SparkContext对象
        SparkConf conf=new SparkConf();
        conf.setAppName("Spark-sql");
        conf.setMaster("local");
        JavaSparkContext sc=new JavaSparkContext(conf);
        //实例化SQLContext
        SQLContext sqlc=new SQLContext(sc);
        //读取数据文件
        JavaRDD<String> line=sc.textFile("E://data//people.txt");
        //构建schema的列表
        String schema="name age";

        List<StructField> fields=new ArrayList<StructField>();
        //动态构造DataFrame的元数据,
        for(String fieldName :schema.split(" ")){
            fields.add(DataTypes.createStructField(fieldName,DataTypes.StringType,true));
       }
       // 也可以写成下面这种方式
        //fields.add(DataTypes.createStructField("name",DataTypes.StringType,true));
        //fields.add(DataTypes.createStructField("id",DataTypes.StringType,true));
        //构建StructType,用于最后DataFrame元数据的描述
        StructType sch =DataTypes.createStructType(fields);

        // 在RDD的基础上创建类型为Row的RDD
        JavaRDD<Row> rowRDD=line.map(new Function<String, Row>() {
            @Override
            public Row call(String s) throws Exception {
                String[] Fields=s.split(",");
                return RowFactory.create(Fields[0],Fields[1].trim());

            }
        });
        // 基于已有的MetaData以及RDD<Row> 来构造DataFrame
        DataFrame df=sqlc.createDataFrame(rowRDD,sch);
        df.registerTempTable("people");
        df.show();
    }
}
### 回答1: Spark 3.0版本中的Spark SQL一个用于处理结构化数据的模块,它提供了一种基于SQL的接口,可以方便地进行数据查询、过滤、聚合、连接等操作。Spark SQL还支持将结构化数据与非结构化数据(如JSON、Parquet、Avro等)进行无缝集成,同时还提供了一些高级功能,如分区、分桶、窗口函数等。Spark 3.0版本中的Spark SQL还引入了一些新特性,如动态分区、动态分桶、动态过滤等,可以进一步提高数据处理的效率和灵活性。 ### 回答2: Spark 3.0版本中的SparkSQL一个用于处理结构化数据的分布式查询引擎。它提供了一种基于SQL语言的API,使得开发人员可以使用SQL语句对数据进行查询、转换和分析。 SparkSQL具有以下几个主要特点: 1. 高性能:SparkSQL利用了Spark的弹性分布式计算模型,能够立即处理大规模数据。它通过将查询计划转换为可以在分布式集群上执行的任务来实现高效的查询。 2. 兼容性:SparkSQL兼容Hive,可以直接读取和查询Hive表。它还支持多种文件格式,包括Parquet、ORC、Avro等。 3. 多语言支持:SparkSQL支持多种编程语言,包括Scala、Java、Python和R。这使得开发人员可以使用他们熟悉的语言进行数据查询和分析。 4. 数据源集成:SparkSQL提供了丰富的数据源接口,可以轻松地从各种数据源中读取和写入数据,包括关系型数据库、Hive、HDFS、S3等。 5. 支持流数据处理:SparkSQL不仅可以处理静态的批处理数据,还可以处理实时的流式数据。它提供了结构化流处理(Structured Streaming)功能,可以将流数据视为连续的表,并对其进行查询和转换。 总之,SparkSQLSpark 3.0版本中的一个重要组件,它提供了一种灵活、高效的方式来处理和分析结构化数据。无论是处理批量数据还是实时流数据,SparkSQL都能在分布式集群上提供高性能的查询和分析能力。 ### 回答3: Spark 3.0版本的Spark SQLSpark生态系统中的一个重要组件。它提供了用于在Spark上进行结构化数据处理的高级接口。 Spark SQL支持多种数据源,包括Hive、Avro、Parquet、ORC、JSON等,可以方便地读取和写入这些格式的数据。通过Spark SQL,用户可以使用SQL语句来查询、分析和处理数据,同时还能够使用DataFrame和Dataset API进行更灵活和更高级的数据操作。 Spark SQL还提供了一个优化器,能够对SQL查询进行优化,包括谓词下推、投影下推、列剪裁等,以提高查询的性能。此外,Spark SQL还提供了支持多种文件格式的自动schema推断功能,使得用户可以在没有定义表结构的情况下直接读取文件。 在Spark 3.0中,Spark SQL引入了更多的功能和优化。其中包括支持数组和Map类型的数据操作、支持规范化和反规范化数据、支持视图和临时表、支持动态分区写入等。此外,Spark 3.0还引入了Catalyst优化器的新版本,进一步提升了查询性能。 总之,Spark 3.0版本的Spark SQL为用户提供了一个强大而灵活的数据处理工具,在处理大规模结构化数据时具有高性能和易用性的优势。无论是在数据分析、数据仓库建设还是在机器学习和深度学习等领域,Spark SQL都是一款非常有价值的工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值