Spark SQL案例介绍与编程实现

Kafka与Spark案例实践 Kafka系统的灵活多变,让它拥有丰富的拓展性,可以与第三方套件很方便的对接。例如,实时计算引擎Spark。接下来通过一个完整案例,运用Kafka和Spark来合理完成。 阅读详情

要点
Spark SQL/DataFrame如何理解?
如何使用spark SQL编写统计代码?
如何查看spark任务监控过程?
Spark SQL程序开发需要注意哪些内容?

1、Spark SQL/DataFrame如何理解

Spark SQL 是 Spark 生态系统里用于处理结构化大数据的模块,该模块里最重要的概念就是 DataFrame, 相信熟悉 R 语言的工程师对此并不陌生。Spark 的 DataFrame 是基于早期版本中的 SchemaRDD,所以很自然的使用分布式大数据处理的场景。Spark DataFrame 以 RDD 为基础,但是带有 Schema 信息,它类似于传统数据库中的二维表格。

Spark SQL 模块目前支持将多种外部数据源的数据转化为 DataFrame,并像操作 RDD 或者将其注册为临时表的方式处理和分析这些数据。当前支持的数据源有:

    Json
    文本文件
    RDD
    关系数据库
    Hive
    Parquet

一旦将 DataFrame 注册成临时表,我们就可以使用类 SQL 的方式操作这些数据,我们将在下文的案例中详细向读者展示如何使用 Spark SQL/DataFrame 提供的 API 完成数据读取,临时表注册,统计分析等步骤。

2、如何使用spark SQL编写统计代码

案例介绍与编程实现

案例一:

a.案例描述与分析

本案例中,我们将使用 Spark SQL 分析包含 5 亿条人口信息的结构化数据,数据存储在文本文件上,总大小为 705m。文件总共包含三列,第一列是 ID,第二列是性别信息 (F -> 女,M -> 男),第三列是人口的身高信息,单位是 cm。实际上这个文件与我们在本系列文章第一篇中的案例三使用的格式是一致的,读者可以参考相关章节,并使用提供的测试数据生成程序,生成 5 千万条数据,用于本案例中。为了便于读者理解,本案例依然把用于分析的文本文件的内容片段贴出来,具体格式如下。

文件大小:
这里写图片描述

文件格式内容:

这里写图片描述

上传Hdfs:
这里写图片描述

本例中,我们的统计任务如下:
用 SQL 语句的方式统计男性中身高超过 180cm 的人数。
用 SQL 语句的方式统计女性中身高超过 170cm 的人数。
对人群按照性别分组并统计男女人数。
用类 RDD 转换的方式对 DataFrame 操作来统计并打印身高大于 210cm 的前 50 名男性。
对所有人按身高进行排序并打印前 50 名的信息。
统计男性的平均身高。
统计女性身高的最大值。

b.编码实现

b1.数据制造

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

/**
 * args[0] : 文件路径
 * args[1] : 生成数据量条数
 * Created by Administrator on 2017/12/8.
 */
public class samplePeopleInfo {

    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("file path or num is null");
            System.exit(1);
        }
        String filePath = args[0];
        int peopleNum = Integer.valueOf(args[1]);
        File file = new File(filePath);
        FileWriter fw = null;
        BufferedWriter writer = null;
        Random rand = new Random();
        int age = 0;
        int se = 0;
        String sex = null;
        try {
            fw = new FileWriter(file);
            writer = new BufferedWriter(fw);
            for(int i = 1;i<= peopleNum ;i++){
                age =  rand.nextInt(100)+120;
                se = rand.nextInt(2);
                if(se!=0){
                    sex = "F";
                }else {
                    sex = "M";
                }
                writer.write(i+","+sex+","+age);
                writer.newLine();//换行
                writer.flush();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                writer.close();
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

b2:业务代码编写

package com

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}

/**
  * args(0) : HDFS数据文件地址
  * Created by Administrator on 2017/12/8.
  * //致命的缺点,可以从sparkUI看到,每个sql都是从新加载数据,性能缓慢
  */
object PeopleDataStatistics {
  private val schemaString = "id,gender,height"

  def main(args: Array[String]): Unit = {
    if (args.length < 1) {
      println("Usage:PeopleDataStatistics2 filePath")
      System.exit(1)
    }

    val conf = new SparkConf().setAppName("Spark Analysis:PeopleDataStatistics")
    val sc = new SparkContext(conf)
    val peopleDateRdd = sc.textFile(args(0).trim);
    val sqlCtx = new SQLContext(sc)

    val schemaArr = schemaString.split(",")
    val schema = StructType(schemaArr.map(fieldName => StructField(fieldName,StringType,true)))
    val rowRdd : RDD[Row] = peopleDateRdd
      .map(_.split(","))
      .map(eachRow => Row(eachRow(0),eachRow(1),eachRow(2)))
    val peopleDF = sqlCtx.createDataFrame(rowRdd,schema)

    //注意DF缓存在内存中,会根据数据量节省很多时间
    peopleDF.persist(StorageLevel.MEMORY_ONLY_SER)
    peopleDF.registerTempTable("people")


    //get the male people whose height is more than 180
    val higherMale180 = sqlCtx.sql("" +
      "select *" +
      " from people" +
      " where height > 180 and gender = 'F'")
    println("Men whose height are more than 180: " + higherMale180.count())
    println("<Display #1>")

    //get the female people whose height is more than 170
    val higherMale170 = sqlCtx.sql("" +
      "select *" +
      " from people" +
      " where height > 170 and gender = 'M'")
    println("female whose height are more than 170: " + higherMale170.count())//job 1
    println("<Display #2>")

    //Grouped the people by gender and count the number
    peopleDF.groupBy(peopleDF("gender")).count().show()
    println("People Count Grouped By Gender")
    println("<Display #3>")

    //count and print the first 50 men with a height greater than 210cm
    peopleDF.filter(peopleDF("gender").equalTo("M")).filter(peopleDF("height") > 210).show(50)
    println("Men whose height is more than 210")
    println("<Display #4>")

    //To sort all people by height and print the top 50
    peopleDF.sort(peopleDF("height").desc).take(50).foreach { println }
    println("Sorted the people by height in descend order,Show top 50 people")
    println("<Display #5>")


    //The average height of a man was counted
    peopleDF.filter(peopleDF("gender").equalTo("M")).agg(Map("height" -> "avg")).show()
    println("The Average height for Men")
    println("<Display #6>")

    //The Max height of a women was counted
    peopleDF.filter(peopleDF("gender").equalTo("F")).agg("height" -> "max").show()
    println("The Max height for Women:")
    println("<Display #7>")
    //......
    println("All the statistics actions are finished on structured People data.")
  }

}

c.提交并运行

编码完成后,把项目打成 jar 包,在这里,我们将源码打成名为 DataDemo.jar

/opt/cloudera/parcels/CDH/bin/spark-submit \
  --class com.PeopleDataStatistics \
  --master spark://namenode1:7077 \
  --driver-memory 8g \
  --executor-memory 2g \
  --total-executor-cores 12 \
  /var/lib/flume-ng/cyj/DataDemo.jar hdfs://172.20.1.102:8020/user/flume/Test/samplePeopleInfomin.txt

d.监控执行过程

在提交后,我们可以在 Spark web console(http://:8080) 中监控程序执行过程。下面我们将分别向读者展示如何监控程序产生的 Jobs,Stages,以及 D 可视化的查看 DAG 信息。

这里写图片描述

ps: 这里我有两个分析,ID-0021 / ID 0020
ID-0021 : 将数据存内存中 (peopleDF.persist(StorageLevel.MEMORY_ONLY_SER))
这里写图片描述
ID 0020 : 每次sql都从hadoop中拉取数据
这里写图片描述

ps:这里也是个性能调优,重复利用的RDD,尽量缓存起来,速度会提升很多

运行结果:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

案例二:

a.案例描述与分析

在案例一中,我们将存储于 HDFS 中的文件转换成 DataFrame 并进行了一系列的统计,细心的读者会发现,都是一个关联于一个 DataFrame 的简单查询和统计,那么在案例二中,我们将向读者展示如何连接多个 DataFrame 做更复杂的统计分析。

在本案例中,我们将统计分析 100W用户和 1 000W条交易数据。对于用户数据,它是一个包含 6 个列 (ID, 性别, 年龄, 注册日期, 角色 (从事行业), 所在区域) 的文本文件,具有以下格式。

用户数据
这里写图片描述

对于交易数据,它是一个包含 5 个列 (交易单号, 交易日期, 产品种类, 价格, 用户 ID) 的文本文件,具有以下格式。

交易数据
这里写图片描述

b.编码实现

b1.数据生成
用户数据:

package Sql.peopleinfo

import java.io.FileWriter
import scala.util.Random

/**
  * Created by Administrator on 2017/12/8.
  */
object UserDataGenerator {
  private val FILE_PATH = "F:/sparkTestData/UserDataMin.txt"
  private val ROLE_ID_ARRAY = Array[String]("ROLE001","ROLE002","ROLE003","ROLE004","ROLE005")
  private val REGION_ID_ARRAY = Array[String]("REG001","REG002","REG003","REG004","REG005")
  private val MAX_USER_AGE = 60
  //how many records to be generated 100W
  private val MAX_RECORDS = 1000000

  def main(args:Array[String]): Unit = {
    generateDataFile(FILE_PATH , MAX_RECORDS)
  }

  private def generateDataFile(filePath : String, recordNum: Int): Unit = {
    var writer:FileWriter = null

    try {
      writer = new FileWriter(filePath,true)
      val rand = new Random()
      for (i <- 1 to recordNum) {
        //generate the gender of the user
        var gender = getRandomGender
        //
        var age = rand.nextInt(MAX_USER_AGE)
        if (age < 10) {
          age = age + 10
        }

        //generate the registering date for the user
        var year = rand.nextInt(16) + 2000
        var month = rand.nextInt(12)+1

        //to avoid checking if it is a valid day for specific month
        //we always generate a day which is no more than 28
        var day = rand.nextInt(28) + 1
        var registerDate = year + "-" + month + "-" + day

        //generate the role of the user
        var roleIndex:Int = rand.nextInt(ROLE_ID_ARRAY.length)
        var role = ROLE_ID_ARRAY(roleIndex)

        //generate the region where the user is
        var regionIndex:Int = rand.nextInt(REGION_ID_ARRAY.length)
        var region = REGION_ID_ARRAY(regionIndex)

        writer.write(i + " " + gender + " " + age + " " + registerDate
          + " " + role + " " + region)
        writer.write(System.getProperty("line.separator"))
      }
    }catch {
      case e:Exception => println("Error occurred:" + e)
    }finally {
      if (writer != null)
        writer.close()
    }
    println("User Data File generated successfully.")
  }

  private def getRandomGender() :String = {
    val rand = new Random()
    val randNum = rand.nextInt(2) + 1
    if (randNum % 2 == 0) {
      "M"
    } else {
      "F"
    }
  }

}

交易记录:

package Sql.peopleinfo

import java.io.FileWriter

import scala.util.Random
/**
  * Created by Administrator on 2017/12/8.
  */
object ConsumingDataGenerator {
  private val FILE_PATH = "F:/sparkTestData/ConsumingDataMin.txt"
  // how many records to be generated
  private val MAX_RECORDS = 10000000
  // we suppose only 10 kinds of products in the consuming data
  private val PRODUCT_ID_ARRAY = Array[Int](1,2,3,4,5,6,7,8,9,10)
  // we suppose the price of most expensive product will not exceed 2000 RMB
  private val MAX_PRICE = 2000
  // we suppose the price of cheapest product will not be lower than 10 RMB
  private val MIN_PRICE = 10
  //the users number which should be same as the one in UserDataGenerator object
  private val USERS_NUM = 1000000

  def main(args:Array[String]): Unit = {
    generateDataFile(FILE_PATH,MAX_RECORDS);
  }

  private def generateDataFile(filePath : String, recordNum: Int): Unit = {
    var writer:FileWriter = null
    try {
      writer = new FileWriter(filePath,true)
      val rand = new Random()
      for (i <- 1 to recordNum) {
        //generate the buying date
        var year = rand.nextInt(16) + 2000
        var month = rand.nextInt(12)+1
        //to avoid checking if it is a valid day for specific
        // month,we always generate a day which is no more than 28
        var day = rand.nextInt(28) + 1
        var recordDate = year + "-" + month + "-" + day
        //generate the product ID
        var index:Int = rand.nextInt(PRODUCT_ID_ARRAY.length)
        var productID = PRODUCT_ID_ARRAY(index)
        //generate the product price
        var price:Int = rand.nextInt(MAX_PRICE)
        if (price == 0) {
          price = MIN_PRICE
        }
        // which user buys this product
        val userID = rand.nextInt(USERS_NUM)+1
        writer.write(i + " " + recordDate + " " + productID
          + " " + price + " " + userID)
        writer.write(System.getProperty("line.separator"))
      }
      writer.flush()
    } catch {
      case e:Exception => println("Error occurred:" + e)
    } finally {
      if (writer != null)
        writer.close()
    }
    println("Consuming Data File generated successfully.")
  }

}

b2.业务代码

package Sql.peopleinfo
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SQLContext
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}
/**
  * Created by Administrator on 2017/12/8.
  */
//define case class for user
case class User(userID:String,gender:String,age:Int,registerDate:String,role:String,region:String)

//define case class for consuming data
case class Order(orderID:String,orderDate:String,productID:Int,price:Int,userID:String)

object UserConsumingDataStatistics {
  def main(args: Array[String]): Unit = {
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    if (args.length < 1) {
      println("Usage:UserConsumingDataStatistics userDataFilePath consumingDataFilePath")
      System.exit(1)
    }

    val conf = new SparkConf().setAppName("UserConsumingDataStatistics")
    //Kryo serializer is more quickly by default java serializer
    conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    val ctx = new SparkContext(conf)
    val sqlCtx = new SQLContext(ctx)

    //隐士转换
    //需要添加import sqlContext.implicits._,才可以调用.toDF
    import sqlCtx.implicits._
    //Convert user data RDD to a DataFrame and register it as a temp table
    val userDF = ctx.textFile(args(0)).map(_.split(" ")).map(
      u => User(u(0), u(1), u(2).toInt,u(3),u(4),u(5))).toDF()
    userDF.registerTempTable("user")
    //Convert consuming data RDD to a DataFrame and register it as a temp table
    val orderDF = ctx.textFile(args(1)).map(_.split(" ")).map(o => Order(
      o(0), o(1), o(2).toInt,o(3).toInt,o(4))).toDF()
    orderDF.registerTempTable("orders")

    //cache the DF in memory with serializer should make the program run much faster
    userDF.persist(StorageLevel.MEMORY_ONLY_SER)
    orderDF.persist(StorageLevel.MEMORY_ONLY_SER)

    //业务逻辑
    //The number of people who have orders in the year 2015
    val count = orderDF.filter(orderDF("orderDate").contains("2015"))
      .join(userDF,orderDF("userID").equalTo(userDF("userID"))).count()

    println("The number of people who have orders in the year 2015:" + count)

    //total orders produced in the year 2014
    val countOfOrders2014 = sqlCtx.sql("" +
      "SELECT *" +
      " FROM orders" +
      " where orderDate like '2014%'").count()
    println("total orders produced in the year 2014:" + countOfOrders2014)

    //Orders that are produced by user with ID 1 information overview
    val countOfOrdersForUser1 = sqlCtx.sql("" +
      "SELECT" +
      " o.orderID," +
      " o.productID," +
      " o.price," +
      " u.userID" +
      " FROM orders o,user u" +
      " where u.userID = 1 and u.userID = o.userID").show()
      println("Orders produced by user with ID 1 showed.")

    //Calculate the max,min,avg prices for the orders that are producted by user with ID 10
    val orderStatsForUser10 = sqlCtx.sql("" +
      "SELECT" +
      " max(o.price) as maxPrice," +
      " min(o.price) as minPrice," +
      " avg(o.price) as avgPrice," +
      " u.userID" +
      " FROM orders o, user u" +
      " where u.userID = 10 and u.userID = o.userID" +
      " group by u.userID")
      println("Order statistic result for user with ID 10:")
      orderStatsForUser10.collect().map(order => "Minimum Price=" + order.getAs("minPrice")
      + ";Maximum Price=" + order.getAs("maxPrice")
      + ";Average Price=" + order.getAs("avgPrice")
      ).foreach(result => println(result))


  }

}

c.提交运行

./spark-submit –class Sql.peopleinfo.UserConsumingDataStatistics\
–master spark://:7077 \
–num-executors 6 \
–driver-memory 8g \
–executor-memory 2g \
–executor-cores 2 \
/home/fams/DataDemo.jar \
hdfs://:9000/user/fams/inputfiles/UserData.txt \
hdfs://:9000/user/fams/inputfiles/ConsumingData.txt

d.结果数据

这里写图片描述

3.Spark SQL程序开发需要注意哪些内容?

Spark SQL 程序开发过程中,我们有两种方式确定 schema,第一种是反射推断 schema,如本文的案例二,这种方式下,我们需要定义样本类 (case class) 来对应数据的列;第二种方式是通过编程方式来确定 schema,这种方式主要是通过 Spark SQL 提供的 StructType 和 StructField 等 API 来编程实现,这种方式下我们不需要定义样本类,如本文中的案例一

在程序实现中,我们需要使用以便隐式的把 RDD 转化成 DataFrame 来操作。
本文展示的 DataFrame API 使用的方法只是其中很小的一部分,但是一旦读者掌握了开发的基本流程,就能通过参考 DataFrame API 文档 写出更为复杂的程序。
通常来说,我们有两种方式了解 Spark 程序的执行流程。第一种是通过在控制台观察输出日志,另一种则更直观,就是通过 Spark Web Console 来观察 Driver 程序里各个部分产生的 job 信息以及 job 里包含的 stages 信息。
需要指出的是,熟练的掌握 Spark SQL/DataFrame 的知识对学习最新的 Spark 机器学习库 ML Pipeline 至关重要,因为 ML Pipeline 使用 DataFrame 作为数据集来支持多种的数据类型。
笔者在测试的过程中发现,处理相同的数据集和类似的操作,Spark SQL/DataFrame 比传统的 RDD 转换操作具有更好的性能。这是由于 SQL 模块的 Catalyst 对用户 SQL 做了很好的查询优化。在以后的文章中会向读者详细的介绍该组件。

Spark介绍(快速入门) 1 Spark概述 1.1 Spark简介 Apache Spark是一个基于内存的大数据并行处理框架,其最初由加州大学伯克利分校的AMP Lab实验室研发,现已是Apache基金会的顶级项目之一。Spark不仅提供了可扩展性、容错性、高性能的分布式数据处理,而且还提供了内存级的数据处理。 Spark与Hadoop类似,但又与Hadoop的数据处理方式不同。例如Spark的中间结果并没有保存在HDFS中,而是存放在内存中;Spark简化了数据处理流程,从而避免了不必要的排序所带来的开销。此外,Hadoop仅 阅读详情

相关推荐

Spark基础学习笔记29:Spark SQL内置函数

Spark SQL内置函数、自定义函数、自定义聚合函数、开窗函数

howard2005的专栏 1594

Spark-sql编程

类并实现相关方法,定义了一个计算平均工资的聚合函数。该实现方式较为传统,适用于。类创建了一个更为类型安全的平均工资聚合函数。,该函数接收一个字符串并返回一个新的字符串(前缀为。格式的用户数据文件,并将其转换为一个。在两种实现方式中,都展示了如何将。方法选择特定列,并展示结果。允许用户定义自己的函数,并在。实验展示了如何注册一个简单的。用于实现复杂的聚合逻辑,是。注册为临时视图,然后使用。处理聚合计算的重要工具。查询,并展示查询结果。,用于表示用户信息(对象,再进一步转换为。注册为临时视图,并在。

2401_89907524的博客 469

Cloudflare SaaS 优选IP实战:提升大陆访问速度的配置指南

本文详细介绍了如何通过Cloudflare SaaS优选IP提升中国大陆用户访问速度的配置指南。从基础环境准备到IP筛选方法,再到完整配置流程和效果验证,帮助用户突破免费套餐限制,精准优化网络线路,特别适合跨境电商和面向中国大陆用户的网站优化。

weixin_29231027的博客 683

第十一篇|基于SparkSQL的电影分析项目实战

在之前的分享中,曾系统地介绍了Spark的基本原理和使用方式,感兴趣的可以翻看之前的分享文章。在本篇分享中,将介绍一个完整的项目案例,该案例会真实还原企业中SparkSQL的开发流程,手把手教你构建一个基于SparkSQL的分析系统。为了讲解方便,我会对代码进行拆解,完整的代码已上传至GitHub,想看完整代码可以去clone,记得给个Star。以下是全文,希望本文对你有所帮助。 https://github.com/jiamx/spark_project_practise 公众号『大数据技术与数仓』,

jmx_bigdata的博客 3596

告别复杂配置!用GuidosToolbox 3.0做MSPA景观格局分析,从安装到出图全记录

本文详细介绍了如何使用GuidosToolbox 3.0进行MSPA景观格局分析,从安装配置到出图全流程。涵盖环境准备、数据预处理、参数设置、结果解读及可视化技巧,帮助用户快速掌握这一生态安全评估工具。特别针对安装教程中的常见问题提供解决方案,提升分析效率。

weixin_29248313的博客 489

Python实战:用MOOTDX库轻松抓取股票分时数据并绘制专业图表(附完整代码)

本文详细介绍了如何使用Python的MOOTDX库获取股票分时数据,并通过Pandas进行数据清洗与VWAP计算,最后利用Matplotlib绘制包含价格线、均线和成交量的专业分时图。文章提供了从环境搭建、数据获取到可视化呈现的完整代码,帮助读者快速构建本地化的股票分时数据分析工具。

weixin_29041195的博客 473

SparkSQL项目实战:TopN

SparkSQL项目实战:TopN

qq_43192537的博客 1897

EXCEL实现分层自定义比例随机抽样(图+文教程)

EXCEL实现分层自定义比例随机抽样(图+文教程) 单一字段分层自定义比例随机抽样 多字段分层自定义比例随机抽样 单一字段分层自定义比例随机抽样 首先数据源如下,我们想随机抽张三的金额数据10%、李四金额20%、王五5%、哈哈15%、李六10% 首先第一步,添加辅助列,随机数 =RAND() 对数据进行高级排序 升序、降序都可以 添加辅助列...

可乐联盟 2万+

Spark SQL案例练习

需求:区域热门商品Top3 需求说明 这里的热门商品是从点击量的维度来看的。 计算各个区域前三大热门商品,并备注上每个商品在主要城市中的分布比例,超过两个城市用其他显示(如下图)。 数据准备 数据下载 链接:https://pan.baidu.com/s/1TuSGlD53Vc8rnH2UhC8TCg 提取码:tvmi 建表 CREATE TABLE `user_visit_action`( `date` string, `user_id` bigint, `session_id` str

FlatTiger的博客 638

解析AI人工智能领域AI芯片的散热技术

当你用ChatGPT写代码、用AI生成高清图片时,背后的AI芯片可能正在“发高烧”——全球TOP500超算的平均功耗已突破10兆瓦,单颗GPU的峰值功耗超过700W(相当于3台家用空调同时运行)。本文将聚焦AI芯片的散热技术,覆盖从基础原理到前沿方案的全链条解析,帮助读者理解“散热为什么比算力更重要”。

AIGC应用创新大全的博客 936

YOLOv8改进---BiFPN特征融合

yolov8结合BiFPN进行改进

qq_41920323的博客 4523

spark-SQL-案例(超级详细)

那map( content =>{...} ) 每次取出来的content是多个单词组成的,所以用索引来定位哪一个单词,而这个定位是外部索引的地位,(内部索引就现相当于定位字母了)、查询Score表中 至少有5名学生选修的 并且以 3 开头的课程 的平均分数,count(1)表示 count(cno)而下面的例子中 每次取出的content,就一个单词,如果在使用索引就相当于定位构成单词的字母是哪一个。以下两句都是错误的,因为子查询返回了3个平均值(3类课程),导致两个表不能比较,

互联网知识分享 1451

公交车调度排班优化算法研究与实现

本文提出的公交车调度排班优化算法基于遗传算法,能够较好地处理公交车调度排班问题,使得车辆数量和运营时间得到平衡,公交车的使用效率得到了优化。在模拟的公交车路线中,使用本文所提出的算法,得到了一组较优的公交车调度排班方案。其中,车辆数量的多少会影响到公交车的行驶速度和等候时间,而运营时间的长短则会直接影响到公交车的使用效率和成本。本文基于遗传算法,通过随机生成种群、选择、交叉、变异等操作,逐步优化种群中个体的适应度,最终得到较优的公交车调度排班方案。以下是本文中所使用的Matlab代码实现,供参考。

PixelLoom的博客 872

Spark SQL精华及与Hive的集成

Spark SQL精华及与Hive的集成 SQL on Hadoop --SQL是一种传统的用来进行数据分析的标准 Hive是原始的SQL-on-Hadoop解决方案 Impala:和Hive一样,提供了一种可以针对已有Hadoop数据编写SQL查询的方法 Presto:类似于Impala,未被主要供应商支持 Shark:Spark SQL的前身,设计目标是作为Hive的补充 Phoenix:基于HBase的开源SQL查询引擎 Spark SQL****架构 Spark SQL是Spark的核心组件之一(

weixin_42834505的博客 202

使用Python爬取在线图书馆的图书馆藏和阅读记录

通过使用Python编写爬虫程序,我们可以从在线图书馆上获取图书馆藏和阅读记录,帮助人们更好地管理和利用图书馆资源。本文简要介绍了爬虫程序的准备工作、网页解析和数据提取、数据的保存和处理的关键步骤,并提供了一个示例代码。在实际应用中,我们需要注意遵守在线图书馆的使用规则和爬虫道德准则,确保合法、合规地进行爬取操作。以上仅为概述,实际应用的过程中可能需要根据具体需求进行适当的调整和改进。

2201_76125393的博客 729

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spark Sql中DataSet与RDD互操作的两种方式

介绍 Spark Sql支持两种将现有RDD转换为DataSet的方式 1.使用反射来推断包含特定对象类型RDD的数据结构 当在编写Spark应用时已经了解数据结构,即应用可以推断RDD的数据结构时,即可使用此方法,这种基于反射的方法可以使代码更为简洁 2.通过编程界面来创建DataSet,然后将其映射到RDD上 当在运行Spark应用时才得知数据结构,即应用无法推断RDD的数据结构时,则使用此方...

weixin_45568872的博客 626

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大数据之spark_spark sql的自定义函数

用户自定义函数 UDF:输入一行返回一行 UDTF:输入一行返回多行,类似于flatmap UDAF:输入多行返回一行,类似于聚合函数 用户自定义UDF函数 UDF案例1 1.在sql语句中根据ip查询省市地址 package com.doit.spark.day11 import com.doit.spark.day11.Utils.ip2Long import org.apache.spark.broadcast.Broadcast import org.apache.spark.rdd.RDD im

WuBoooo的博客 883

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

spark—SQL实战案例

对sparkSQL的学习进行案例练习

weixin_44604159的博客 4134

Spark编程基础及Spark SQL

/ 创建 Spark 运行配置对象// 创建 Spark 上下文环境对象(连接对象)//通过内存创建RDD。

iqizum的博客 1696

Spark SQL编程初级实践

本文介绍了SparkSQL的基本操作与实践案例。主要内容包括:1)SparkSQL数据操作:通过JSON文件创建DataFrame,展示查询、去重、筛选、分组、排序等基础操作;2)RDD转DataFrame:通过StructType定义schema,实现文本数据到结构化数据的转换;3)MySQL集成:配置Spark连接MySQL,完成数据库表的读写操作。实践涉及SparkShell交互式操作和独立应用程序开发两种方式,覆盖了DataFrame创建、SQL查询以及JDBC数据源处理等典型场景。文中还包含环境配

充满焦虑的大学生 4048

Spark Streaming与Spark SQL结合操作详解

Spark Streaming最强大的地方在于,可以与Spark Core、Spark SQL整合使用,之前已经通 过transform、foreachRDD等算子看到,如何将DStream中的RDD使用Spark Core执行批处理操 作。现在就来看看,如何将DStream中的RDD与Spark SQL结合起来使用。 案例:每隔10秒,统计最近60秒的,每个种类的每个商品的点击次数,然后统计出每个种类 top3热门的商品。 数据输入模型: -------------------------- 姓名 商品

蔡政洁的博客 2605

Spark编程实验三:Spark SQL编程

本实验的目的是掌握Spark SQL的基本编程方法,熟悉RDD到DataFrame的转化方法,熟悉利用Spark SQL管理来自不同数据源的数据。

Morse_Chen的博客 6048

Spark-SQL简介与编程

在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中 的二维表格。DataFrame 与 RDD 的主要区别:前者带有 schema 元信息,即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。创建DataFrame使用SparkSession对象读取数据文件,创建DataFrame。

2402_87382229的博客 2320

day05_Spark SQL

Spark SQL是Spark多种组件中其中一个,主要是用于处理大规模的**【结构化数据】**什么是结构化数据: 一份数据, 每一行都有固定的列, 每一列的类型都是一致的 我们将这样的数据称为结构化的数据例如: mysql的表数据1 张三 202 李四 153 王五 184 赵六 12简单来说:Spark SQL是Spark中用于处理结构化数据的模块,就像是“SQL与大数据之间的桥梁”,让用户能够用熟悉的SQL语句查询和分析大规模数据。具体而言核心功能。

AGI爱好者_数仓&可视化&数据分析工程师_Vae’伯乐‘ 2414

《深入浅出Apache Spark》系列③:Spark SQL解析层优化策略与案例解析

本系列是Spark系列分享的第三期。第一期分享了SparkCore的一些基本原理和一些基本概念,包括一些核心组件。Spark的所有组件都围绕SparkCore来运转,其中最活跃的一个上层组件是SparkSQL。第二期分享则专门介绍了SparkSQL的基本架构和原理。从第三期开始,后续的分享都围绕着SparkSQL展开,尤其是SparkSQL的优化。

datacreating的博客 1195
上一篇: Kafka重复消费
下一篇: Spark Streaming的恢复机制——Checkpoint
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值