首页 > 其他分享 >Spark优化

Spark优化

时间:2023-11-11 20:47:23浏览次数:29  
标签:startDate endDate val Seq Spark 优化 factDF row

意识篇

  • 类型转换
    优化前:

    val extractFields: Seq[Row] => Seq[(String, Int)] = {
    (rows: Seq[Row]) => {
        var fields = Seq[(String, Int)]()
        rows.map(row => {
            fields = fields :+ (row.getString(2), row.getInt(4))
        })
    	fields
    }
    }
    

    优化后:

    val extractFields: Seq[Row] => Seq[(String, Int)] = {
    (rows: Seq[Row]) =>
    	rows.map(row => (row.getString(2), row.getInt(4))).toSeq
    }
    

    过程式编程变为函数式编程

    关注主要业务逻辑,最终一次性完成类型转换。

原理篇

  • 数据行的操作不要在Driver端执行

    服务端才是分布式,从服务端拉数据过来不仅有网络消耗,而且硬生生把分布式操作改为本地操作,失去了大数据分布式分而治之的思想,Driver端资源更有限,会处理更慢。

    优化前:

    def createInstance(factDF: DataFrame, startDate: String, endDate: String): Dat
    val instanceDF = factDF
        .filter(col("eventDate") > lit(startDate) && col("eventDate") <= lit(endDate))
        .groupBy("dim1", "dim2", "dim3", "event_date")
        .agg(sum("value") as "sum_value")
        instanceDF
    }
    pairDF.collect.foreach{
    case (startDate: String, endDate: String) =>
        val instance = createInstance(factDF, startDate, endDate)
        val outPath = s"${rootPath}/endDate=${endDate}/startDate=${startDate}"
        instance.write.parquet(outPath)
    }
    

    这种写法会把数据拉回到Driver端一句一句操作,会很慢。
    优化后:

    val instances = factDF
    .join(pairDF, factDF("eventDate") > pairDF("startDate") && factDF("eventDate")
    .groupBy("dim1", "dim2", "dim3", "eventDate", "startDate", "endDate")
    .agg(sum("value") as "sum_value")
    instances.write.partitionBy("endDate", "startDate").parquet(rootPath)
    

    这种只会分区落盘时拉取数据一次。
    Tips

    Spark 延迟计算的 Actions 算子主要有两类:

    • 一类是将分布式计算结果直接落盘的操作,
      如 DataFrame 的 write、RDD 的 saveAsTextFile 等;

    • 另一类是将分布式结果收集到 Driver 端的操作,

      如 first、take、collect。

标签:startDate,endDate,val,Seq,Spark,优化,factDF,row
From: https://www.cnblogs.com/tyxy/p/17826317.html

相关文章

  • 11 11 vue3代码优化
     使用axios发送异步请求是这种格式,现在异步请求都封装到api中。说法如下:接口调用的js代码一般都会封装到js文件中,并一函数的形式暴露给外部,例如: 这张图片包括了没有参数和有参数的两种情况 然后在组件中的script中调用函数就行,但这样不行,好像跟什么同步异步有关,反正这样......
  • Matlab代码优化之道
    ​ 一、遵守PerformanceAcceleration的规则关于什么是“PerformanceAcceleration”请参阅matlab的帮助文件。1、只有使用以下数据类型,matlab才会对其加速:logical,char,int8,uint8,int16,uint16,int32,uint32,double而语句中如果使用了非以上的数据类型则不会加速,如numeric......
  • pyqt5-自定义函数优化管理组件
    1、介绍pyqt本身提供了诸多的方法和事件特性,可以操作ui组件。对于单一的项目或者说具有个人风格的开发者来说,在此基础上进行整合可以优化代码。整合,这里特指的是ui组件。可能是ui的显示和初始化,也可能是相关的业务代码。2、测试和总结函数中的ui组件可以调用设置值或获取的......
  • 读程序员的制胜技笔记09_死磕优化(下)
    1. 造成延迟的3个方面1.1. CPU1.2. I/O1.3. 人2. 不要打包数据2.1. 一个打包的数据结构2.1.1. C#structUserPreferences{publicbyteItemsPerPage;publicbyteNumberOfItemsOnTheHomepage;publicbyteNumberOfAdClicksICanStomach;publicbyteM......
  • 开始pyspark------------jupyter notebook 读取CSV文件
    1开始pyspark  1查看版本信息¶ In [1]:importsysprint(sys.version_info)  sys.version_info(major=3,minor=11,micro=5,releaselevel='final',serial=0) In [2]:importosprint("ThevalueofSPARK_H......
  • 索引优化百万数据量
    --新建一个查询,复制以下语句,执行即可。通过存储过程创建100万数据CREATETABLE`test_user_memory`(`id`int(11)NOTNULLAUTO_INCREMENTcomment'主键id',`user_id`varchar(36)NOTNULLcomment'用户id',`user_name`varchar(30)NOTNULLcomment'用户名称',`phon......
  • 阿里云Ubuntu服务器优化
    阿里云Ubuntu服务器优化有台自用的阿里云测试服务器,最便宜的那种2核2G¥99/年,装的ubuntu22.04.之前用着感觉还行,最近几天使用vscodessh修改调试,搞了一段时间就不行,cpu和内存飙升至96%以上...之后就是各种反应迟钝,无法编译....太便宜了,提交工单都不好意思装个htop看了下,vscode......
  • MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性
    当涉及到MySQL数据库的进阶实战时,有许多方面需要考虑,包括性能优化、安全性、高可用性和复杂查询等。以下是一个关于MySQL数据库进阶实战的文章大纲,您可以根据需要进行扩展和详细说明。MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性引言MySQL是一款广泛使用的开源关系型数......
  • 14个优化网站性能提高网站访问速度技巧
    相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax,flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实现的功能。比如Google机会已经把最基本的office应用都搬到了互联网上。当然便利的同时毫无疑问的也使页面的速度越来越慢。自己是做前端开发的,在......
  • 小程序性能优化之JavaScript代码优化
    大家好,今天我们来聊一聊小程序性能优化中的JavaScript代码优化。在编程过程中,我们都喜欢轻松愉快,不想戴着沉重的“全局疯狂”帽子。但有时候,过度使用全局变量会让我们的程序变得难以维护,就像在一片大森林里找寻一个小木屋。这时候,我们就需要考虑一下,是不是该减轻一下我们的“全局疯......