武汉网站程序开发公司/关键词排名优化技巧

武汉网站程序开发公司,关键词排名优化技巧,浙江网站建设推广,汉邦未来网站开发有限公司Transformation操作 与RDD类似的操作 map、filter、flatMap、mapPartitions、sample、 randomSplit、 limit、 distinct、dropDuplicates、describe,而以上这些都是企业中比较常用的,这里在一个文件中统一论述 val df1 spark.read.json("src/m…

Transformation操作

与RDD类似的操作

map、filter、flatMap、mapPartitions、sample、 randomSplit、 limit、

distinct、dropDuplicates、describe,而以上这些都是企业中比较常用的,这里在一个文件中统一论述

val df1 = spark.read.json("src/main/resources/people.json")
// 使用map去除某些字段
df1.map(row => row.getAs[Long](1)).withColumnRenamed("value","age").show()
//df1.map(row => row.getAs[String]("address")).show()
//df1.map(row => row.getString[String](0)).show()// randomSplit,按照数组中的权重将数据集划分为不同的比例,可用于机器学习
val df2 = df1.randomSplit(Array(0.5, 0.6, 0.7))
df2(0).count
df2(1).count
df2(2).count// 取10行数据生成新的DataSet
val df3 = df1.limit(5).show()// distinct,去重
val df4 = df1.union(df1)
df4.distinct.count// 这个方法,不需要传入任何的参数,默认根据所有列进行去重,然后按数据行的顺序保留每行数据出现的第一条。
df4.dropDuplicates.show
// 传入的参数是一个序列。你可以在序列中指定你要根据哪些列的重复元素对数据表进行去重,然后也是返回每一行数据出现的第一条
//def dropDuplicates(colNames: Seq[String])
df4.dropDuplicates("name", "age").show
df4.dropDuplicates("name").show// 返回全部列的统计(count、mean、stddev、min、max)
df4.describe().show// 返回指定列的统计
df4.describe("age").show
df4.describe("name", "age").show
存储相关

persist、checkpoint、unpersist、cache

备注:Dataset 默认的存储级别是 MEMORY_AND_DISK

val df1 = spark.read.json("src/main/resources/people.json")
import org.apache.spark.storage.StorageLevel
spark.sparkContext.setCheckpointDir("src/main/resources/data/checkpoint")
df1.show()
df1.checkpoint()// 默认的存储级别是MEMORY_AND_DISK
df1.cache()
df1.persist(StorageLevel.MEMORY_ONLY)
println(df1.count())
df1.unpersist(true
select相关

列的多种表示:select、selectExpr、drop、withColumn、withColumnRenamed、cast(内置函数)

import spark.implicits._
import org.apache.spark.sql.functions._
val df1 = spark.read.json("src/main/resources/people.json")
// 列的多种表示方法。使用'、""、$""、col()、df("")
// 注意:不要混用;必要时使用spark.implicitis._;并非每个表示在所有的地方都有效
df1.select('name, 'age, 'address).show
df1.select("name", "age", "address").show
df1.select($"name", $"age", $"address").show
df1.select(col("name"), col("age"), col("address")).show
df1.select(df1("name"), df1("age"), df1("address")).show// 下面的写法无效并且会报错
// df1.select("name", "age"+10, "address").show
// df1.select("name", "age+10", "address").show// 这样写才符合语法
df1.select($"name", $"age"+10, $"address").show
df1.select('name, 'age+10, 'address).show// 可使用expr表达式(expr里面只能使用引号)
df1.select(expr("name"), expr("age+100"), expr("address")).show
df1.selectExpr("name as ename").show
df1.selectExpr("power(age, 2)", "address").show
df1.selectExpr("round(age, -3) as newAge", "name", "address").show// drop、withColumn、 withColumnRenamed、casting
// drop 删除一个或多个列,得到新的DF
df1.drop("name")
df1.drop("name", "age")// withColumn,修改列值
val df2 = df1.withColumn("age", $"age"+10)
df2.show// withColumnRenamed,更改列名
df1.withColumnRenamed("name", "ename")
// 备注:drop、withColumn、withColumnRenamed返回的是DF// 类型转化的两种方式
df1.selectExpr("cast(age as string)").printSchema
import org.apache.spark.sql.types._
df1.select('age.cast(StringType)).printSchema
 where 相关的
val df1 = spark.read.json("src/main/resources/people.json")
// 过滤操作
df1.filter("age>30").show
df1.filter("age>30 and name=='Tom'").show
// 底层调用的就是filter算子
df1.where("age>30").show
df1.where("age>30 and name=='Tom'").show
groupBy相关的

groupBy、agg、max、min、avg、sum、count(后面5个为内置函数)

import spark.implicits._
import org.apache.spark.sql.functions._
val df1 = spark.read.json("src/main/resources/people.json")// 内置的sum max min avg count
df1.groupBy("address").sum("age").show
df1.groupBy("address").max("age").show
df1.groupBy("address").min("age").show
df1.groupBy("address").avg("age").show
df1.groupBy("address").count.show// 类似having子句
df1.groupBy("address").avg("age").where("avg(age) > 20").show
df1.groupBy("address").avg("age").where($"avg(age)" > 20).show// agg
df1.groupBy("address").agg("age"->"max", "age"->"min", "age"->"avg", "age"->"sum", "age"->"count").show// 这种方式更好理解
df1.groupBy("address").agg(max("age"), min("age"), avg("age"),sum("age"), count("age")).show// 给列取别名
df1.groupBy("address").agg(max("age"), min("age"), avg("age"),sum("age"), count("age")).withColumnRenamed("min(age)","minAge").show// 给列取别名,最简便
df1.groupBy("address").agg(max("age").as("maxAge"),min("age").as("minAge"), avg("age").as("avgAge"),sum("age").as("sumAge"), count("age").as("countAge")).show
 orderBy相关的
import spark.implicits.
val df1 = spark.read.json("src/main/resources/people.json")// sort,以下语句等价
df1.sort("age").show
df1.sort($"age").show
df1.sort($"age".asc).show
df1.sort($"age".desc).show
df1.sort(-$"age").show
df1.sort(-'age, -'name).show// orderBy,底层调用的还是sort
df1.orderBy("age").show
join相关的

目前 Apache Spark 3.x 版本中,一共支持以下七种 Join 类型:

INNER JOIN

CROSS JOIN

LEFT OUTER JOIN

RIGHT OUTER JOIN

FULL OUTER JOIN

LEFT SEMI JOIN

LEFT ANTI JOIN

在实现上,这七种 Join 对应的实现类分别如下:

object JoinType {def apply(typ: String): JoinType = typ.toLowerCase(Locale.ROOT).replace("_", "") match {case "inner" => Innercase "outer" | "full" | "fullouter" => FullOutercase "leftouter" | "left" => LeftOutercase "rightouter" | "right" => RightOutercase "leftsemi" | "semi" => LeftSemicase "leftanti" | "anti" => LeftAnticase "cross" => Crosscase _ =>val supported = Seq("inner","outer", "full", "fullouter", "full_outer","leftouter", "left", "left_outer","rightouter", "right", "right_outer","leftsemi", "left_semi", "semi","leftanti", "left_anti", "anti","cross")throw new IllegalArgumentException(s"Unsupported join type '$typ'. " +"Supported join types include: " + supported.mkString("'", "', '", "'") + ".")}
}

准备数据

    // 准备数据val order = spark.sparkContext.parallelize(Seq((1, 101, 2500), (2, 102, 1110), (3, 103, 500), (4, 102, 400))).toDF("paymentId", "customerId", "amount")val customer = spark.sparkContext.parallelize(Seq((101, "ds"), (102, "ds_hadoop"), (103, "ds001"), (104, "ds002"), (105, "ds003"), (106, "ds004"))).toDF("customerId", "name")

order 表

customer表

 INNER JOIN

在 Spark 中,如果没有指定任何 Join 类型,那么默认就是 INNER JOIN。INNER JOIN 只会返回满足 Join 条件( join condition)的数据,这个在企业中用的应该比较多,具体如下: 

    // inner join// 单字段关联customer.join(order,"customerId").show// 多字段关联  Seq(“customerId”, “name”)customer.join(order,Seq("customerId")).show

执行结果

CROSS JOIN

这种类型的 Join 也称为笛卡儿积(Cartesian Product),Join 左表的每行数据都会跟右表的每行数据进行 Join,产生的结果行数为 m*n,所以在生产环境下尽量不要用这种 Join。下面是 CROSS JOIN 的使用例子:

    // cross join// 笛卡尔积customer.crossJoin(order).show()// 如果两张表出现相同的字段,可以使用下面的方式进去筛选  类似customer.name  order.amountcustomer.crossJoin(order).select(customer("name"), order("amount") ).show

执行1结果

执行2结果,只显示select的字段

 LEFT OUTER JOIN

LEFT OUTER JOIN 等价于 LEFT JOIN,这个 Join 的返回的结果相信大家都知道,我就不介绍了。下面三种写法都是等价的

    // 俩个表关联字段名一致customer.join(order, Seq("customerId"), "left_outer").showcustomer.join(order, Seq("customerId"), "leftouter").showcustomer.join(order, Seq("customerId"), "left").showval order2 = spark.sparkContext.parallelize(Seq((1, 101, 2500), (2, 102, 1110), (3, 103, 500), (4, 102, 400))).toDF("paymentId", "custId", "amount")// 如果两张表使用不同的字段进行关联的话,要使用三等号即===customer.join(order2, $"customerId"===$"custId", "left").show

执行结果

RIGHT OUTER JOIN

和 LEFT OUTER JOIN 类似,RIGHT OUTER JOIN 等价于 RIGHT JOIN,下面三种写法也是等价的:

    order.join(customer, Seq("customerId"), "right").showorder.join(customer, Seq("customerId"), "right_outer").showorder.join(customer, Seq("customerId"), "rightouter").show

FULL OUTER JOIN

FULL OUTER JOIN 的含义大家应该也都熟悉,会将左右表的数据全部显示出来。FULL OUTER JOIN 有以下四种写法:

    order.join(customer, Seq("customerId"), "outer").showorder.join(customer, Seq("customerId"), "full").showorder.join(customer, Seq("customerId"), "full_outer").showorder.join(customer, Seq("customerId"), "fullouter").show
LEFT SEMI JOIN

LEFT SEMI JOIN 只会返回匹配右表的数据,而且 LEFT SEMI JOIN 只会返回左表的数据,右表的数据是不会显示的,下面三种写法都是等价的

order.join(customer, Seq("customerId"), "leftsemi").show
order.join(customer, Seq("customerId"), "left_semi").show
order.join(customer, Seq("customerId"), "semi").show

LEFT SEMI JOIN 其实可以用 IN/EXISTS 来改写

select * from order where customerId in (select customerId from customer)

LEFT ANTI JOIN

与 LEFT SEMI JOIN 相反,LEFT ANTI JOIN 只会返回没有匹配到右表的左表数据。而且下面三种写法也是等效的

order.join(customer, Seq("customerId"), "leftanti").show
order.join(customer, Seq("customerId"), "left_anti").show
order.join(customer, Seq("customerId"), "anti").show

LEFT SEMI JOIN 其实可以用 NOT IN/EXISTS 来改写

select * from order where customerId not in (select customerId from customer)

 集合相关的

union、unionAll、intersect、except

main{val lst = List(StudentAge(1, "Alice", 18),StudentAge(2, "Andy", 19),StudentAge(3, "Bob", 17),StudentAge(4, "Justin", 21),StudentAge(5, "Cindy", 20))val ds1 = spark.createDataset(lst)ds1.show()val rdd = spark.sparkContext.makeRDD(List(StudentHeight("Alice", 160),StudentHeight("Andy", 159),StudentHeight("Bob", 170),StudentHeight("Cindy", 165),StudentHeight("Rose", 160)))val ds2 = rdd.toDS// union、unionAll、intersect、except。集合的交、并、差val ds3 = ds1.select("name")val ds4 = ds2.select("sname")// union 求并集,不去重  去重使用distinctds3.union(ds4).show// 底层依旧调用的是unionds3.unionAll(ds4).show// intersect 求交ds3.intersect(ds4).show// except 求差ds3.except(ds4).show}// 定义第一个数据集case class StudentAge(sno: Int, name: String, age: Int)// 定义第二个数据集case class StudentHeight(sname: String, height: Int)

交集

差集

空值处理

na.fill、na.drop、na.replace、na.filter

    import spark.implicits._import org.apache.spark.sql.functions._val df1 = spark.read.json("src/main/resources/data/people.json")// NA表示缺失值,即“Missing value”,是“not available”的缩写// 删出含有空值的行df1.na.drop.show// 删除某列的空值和nulldf1.na.drop(Array("age")).show// 对全部列填充df1.na.fill("NULL").show// 对指定单列填充;对指定多列填充df1.na.fill("NULL", Array("address")).showdf1.na.fill(Map("age" -> 0, "address" -> "NULL")).show// 对指定的值进行替换df1.na.replace(Array("address"), Map("NULL" -> "Shanghai")).na.replace(Array("age"), Map(0 -> 100)).show// 查询空值列或非空值列。isNull、isNotNull为内置函数df1.where("address is null").showdf1.where($"address".isNull).showdf1.where(col("address").isNull).showdf1.filter("address is not null").showdf1.filter(col("address").isNotNull).show

 Action操作

与RDD类似的操作

show、 collect、 collectAsList、 head、 first、 count、 take、 takeAsList、 reduce

    // 隐式转换import spark.implicits._// show:显示结果,默认显示20行,截取(true)spark.read.json("src/main/resources/data/people.json").show(100, false)val df = spark.read.json("src/main/resources/data/people.json")println(df.count())// 输出数组arr   9df.collect().foreach(println)// 输出listdf.collectAsList().forEach(println)// 输出head3条 输出数组1df.head(3).foreach(println)println(df.head(3))// 输出第一条 head(1)println(df.first())// 底层调用的就是head  输出数组3df.take(3).foreach(println)// 底层调用take,再调用headdf.takeAsList(3).forEach(println)
 获取结构属性的操作

printSchema、explain、columns、dtypes、col

    val df1 = spark.read.json("src/main/resources/data/people.json")// 结构属性df1.columns.foreach(println) // 查看列名  address,age,namedf1.dtypes.foreach(println) // 查看列名和类型  (address,StringType) (age,LongType) (name,StringType)df1.explain() // 参看执行计划println(df1.col("name")) // 获取某个列df1.printSchema // 常用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软Data Formulator:用AI重塑数据可视化的未来

在数据驱动的时代,如何快速将复杂数据转化为直观的图表是每个分析师面临的挑战。微软研究院推出的开源工具 Data Formulator,通过结合AI与交互式界面,重新定义了数据可视化的工作流。本文将深入解析这一工具的核心功能、安装方法及使用技巧,助你轻松驾驭数据之美。 一、Dat…

本地部署deepseek-r1建立向量知识库和知识库检索实践【代码】

目录 一、本地部署DS 二、建立本地知识库 1.安装python和必要的库 2.设置主目录工作区 3.编写文档解析脚本 4.构建向量数据库 三、基于DS,使用本地知识库检索 本地部署DS,其实非常简单,我写了一篇操作记录,我终于本地部署了DeepSeek-R1(图文全过程)-CSDN博客 安装…

String、StringBuffer、StringBuiler的区别

可变性 String是不可变的,这是因为String内部用于存储数据的char[]数组用了final关键字修饰,而且是private的,并且没有对外提供修改数组的方法。 StringBuffer和StringBuilder是可变的,它们内部的char数组没有用final关键字修饰。…

Certd自动化申请和部署SSL证书并配置https

服务器使用的华为云,之前SSL证书通过配置Cloudflare的DNS实现的,最近华为云备案提示需修改解析至境内华为云IP,若解析境外IP,域名无需备案,需注销或取消接入备案信息,改为使用Certd自搭建证书管理工具&…

git tag以及git

git tag 以及git 一、先说收获吧 1. git bash 在windows上 类似于linux的bash提供的shell命令行窗口,可以执行很多linux命令,cd pwd ls vim cat touch mkdir,还可以用正则匹配查看标签。相当于在windows上装了一个小的linux。git init myproj…

ESP8266通过AT指令配置双向透传

一、固件烧录 IO0接地后上电,进入烧录模式,烧录完成后去掉即可 二、参数配置 1、服务器端 ATCWMODE_DEF2 ATCWSAP_DEF"ESP8266","12345678",5,3 ATSAVETRANSLINK1,"192.168.4.2",9090,"UDP",8080 2、客户端…

【3D模型】【游戏开发】【Blender】Blender模型分享-狮头木雕附导入方法

导入方法: [Blender] 如何导入包含纹理的 .blend 模型文件 在 3D 建模和渲染工作中,Blender 是一款功能强大的免费开源软件。很多时候,我们需要导入 .blend 后缀的模型文件,同时确保纹理(textures)文件夹…

C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)

C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原) 文章目录 C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)一、上位机开发中的CSV应用背景二、CSV读写实战教学1. 基本对…

Unity导出WebGL,无法显示中文

问题:中文无法显示 默认字体无法显示中文 在编辑器中设置了中文和英文的按钮,中文按钮无法显示 导出后无法显示中文 解决办法: 自己添加字体,导入项目,并引用 示例 下载一个字体文件,这里使用的阿里…

阅读《Vue.js设计与实现》 -- 02

接上一篇文章:阅读《Vue.js设计与实现》 – 01 文章目录 第二章提升用户的开发体验tips 控制框架代码的体积Tree-Shaking副作用 框架应该输出怎样的构建产物?注意这两个文件有什么区别? 特性开关如何实现? 处理错误TS支持 第二章 …

Mac:Ant 下载+安装+环境配置(详细讲解)

📌 下载 Ant 下载地址:https://ant.apache.org/bindownload.cgi 📌 无需安装 Apache官网下载 Ant 压缩包,无需安装,下载解压后放到自己指定目录下即可。 按我自己的习惯,我会在用户 jane 目录下新建了个…

蓝桥杯国赛子串2023动态规划,暴力

#include <bits/stdc.h> using namespace std; // string ss; #define int long long string s; //该方法通过动态规划&#xff0c;找到2023字串&#xff0c;而2023等于202加3&#xff0c;202等于202&#xff0c;20等于20&#xff1b; int f2() {int dp[4]{0};//dp[0]代表…

Vue3项目开发:状态管理实践指南

# Vue3项目开发&#xff1a;状态管理实践指南 一、引言 背景介绍 在Vue项目中&#xff0c;状态管理是一个非常重要的话题。合理的状态管理能够帮助我们更好地组织和管理数据&#xff0c;提升项目的可维护性和可扩展性。本文将深入探讨Vue3项目中状态管理的最佳实践&#xff0c;…

网络安全漏洞与修复 网络安全软件漏洞

文章目录 一、软件漏洞的概念 1、信息安全漏洞简述2、软件漏洞3、软件漏洞概念4、软件漏洞的成因分析 二、软件漏洞标准化管理 1、软件漏洞分类2、软件漏洞分级3、安全漏洞管理规范 一、软件漏洞的概念 1、信息安全漏洞简述 信息安全漏洞是信息安风险的主要根源之一&…

SpringBoot项目controller层接收对应格式请求的相关RequestMapping配置

目录 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; 注&#xff1a;此情况注意和&#xff08;4&#xff09;中情况进行区分 &#xff08;4&#xff09; 在几个springboot项目开发后&#xff0c;我总结了以下的一些常见的接收对应请求的…

2025年图生视频模型技术全景解析

一、开源图生视频模型 阿里通义万象Wan2.1系列 I2V-14B-480P&#xff1a; 14B参数基础模型支持480P分辨率图生视频显存需求16GB以上 I2V-14B-720P&#xff1a; 高清增强版模型采用分帧渲染技术&#xff0c;输出分辨率达1280720 技术特性&#xff1a; 支持中文提示词自动解析内置…

一场由 ES 分片 routing 引发的问题

一场由 ES 分片 routing 引发的问题 ES 结构 {"poroperties": {"joinType": {"type": "join","eager_global_ordinals": true,"relations": {"spu": "sku"}},"id":{"type&q…

Linux信号的处理

目录 一、信号处理概述&#xff1a;为什么需要“信号”&#xff1f; 二、用户空间与内核空间&#xff1a;进程的“双重人格” 三、内核态与用户态&#xff1a;权限的“安全锁” 四、信号捕捉的内核级实现&#xff1a;层层“安检” 五、sigaction函数&#xff1a;精细控制信…

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解 &#xff08;图1-1&#xff09; 一、鸿蒙中App、HAP、HAR、HSP是什么&#xff1f; &#xff08;1&#xff09;App Pack&#xff08;Application Package&#xff09; 是应用发布的形态&#xff0c;上架应用市场是以App Pa…

在C#的MVC框架framework项目的使用ajax,及源码下载

在C# MVC框架中使用AJAX实现异步请求,有助于提高应用程序的性能和用户体验。 在MVC框架framework项目中&#xff0c;ajax使用方法如下 1.在Controller类中&#xff0c;创建一个新的方法&#xff08;例如&#xff1a;GetRes&#xff09;&#xff0c;该方法处理AJAX请求并返回J…