Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spark隐式转换 toDf_隐式转换是什么

spark隐式转换 toDf_隐式转换是什么

作者头像
全栈程序员站长
发布于 2022-11-10 08:24:03
发布于 2022-11-10 08:24:03
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

一. 生产问题背景

如上就是此blog产生的背景,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Spark SQL 中,
	DF.select()

select 报错 不能导入
	spark sql Cannot resolve overloaded method 'select'

咨询大佬后,隐式转换的原因 ,导入Spark的隐式转换后即可
	import spark.implicits._

二. 隐式转换开荒

没有隐式转换,只能从 精度较高的—–>精度低的

但是从 精度低—–> 精度高的。就会报错

2.1 隐式转换函数 参数

解决方案就是自己定义一个隐式转换函数,double2int。这个隐士函数的功能也需要是唯一的

用强转换也行,那隐士转换可有可无?

RichFile
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.File
import scala.io.Source

object implicit2 { 
   
  def main(args: Array[String]): Unit = { 
   

    //java.io.File 只封装了文件的元数据,文件内容必须通过IO
    //所以File 后无法直接获取context
    val context:String = new File("").readContext
  }

}

隐式转换更多的应用在此,想要实现File 后 直接获取readContext 必须自己封装这个方法,然后实现隐式转换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object implicit2 { 
   
  def main(args: Array[String]): Unit = { 
   
    //声明隐式转换
    implicit def file2RichFile(file: File):RichFile = new RichFile(file)
    

    //java.io.File 只封装了文件的元数据,文件内容必须通过IO
    //所以File 后无法直接获取context
    val context:String = new File("").readContext
  }

}

class RichFile(file:File){ 
   
  //自己封装一个,让File后能readContext
  def readContext:String = { 
   
    Source.fromFile(file).mkString
  }
}

整理一下这个流程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.io.File 无 readContext方法
	查找implicit函数
		传入参数为File , 返回方法当中有没有一个方法为readcontext
		以上匹配关系必须唯一
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
implicit def int2Date(int: Int):RichDate = new RichDate(int)

    val ago:String = "ago"
    val later:String = "later"
    val day2 = 2.days(ago)

class RichDate(day:Int){
  def days(when : String) = {
    if("ago"==when)
      LocalDate.now().plusDays(-day).toString
    else if("later"==when)
      LocalDate.now().plusDays(day).toString
    else
      println("later or age error")
  }
}

2.2 隐式类

注意,隐式函数引用的时候,implict 关键字标黄了 这是啥意思呢?

这是在说:your code is as same sa the shit

since Scala2.10

再一次简化隐式转换,直接把类写在里面即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object implicit3 {
  def main(args: Array[String]): Unit = {

    val ago : String = "ago"
    val later : String = "later"

    println(3.days(later))

    implicit class RichDate(day:Int){
      def days(when:String): Unit ={
        if ("ago" == when){
          LocalDate.now().plusDays(-day).toString
        }else if("later" == when){
          LocalDate.now().plusDays(day).toString
        }
      }
    }
  }

隐式类要求 (1)其所带的构造参数有且只能有一个 (2)隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的。

2.3 隐式解析机制

之前有一些提到,

(1)首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。(一般是这种情况) (2)如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象

三.回归主题

开头提到 一个 DF.select

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  /**
   * :: Experimental ::
   * (Scala-specific) Implicit methods available in Scala for converting
   * common Scala objects into `DataFrame`s.
   *
   * {
  
  {
  
  {
   *   val sparkSession = SparkSession.builder.getOrCreate()
   *   import sparkSession.implicits._
   * }}}
   *
   * @since 2.0.0
   */
  @Experimental
  @InterfaceStability.Evolving
  object implicits extends SQLImplicits with Serializable {
    protected override def _sqlContext: SQLContext = SparkSession.this.sqlContext
  }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  /**
   * Selects a set of column based expressions.
   * {
  
  {
  
  {
   *   ds.select($"colA", $"colB" + 1)
   * }}}
   *
   * @group untypedrel
   * @since 2.0.0
   */
  @scala.annotation.varargs
  def select(cols: Column*): DataFrame = withPlan {
    Project(cols.map(_.named), logicalPlan)
  }

DF. 没有select 需要用隐式转换成DS 然后用ds.select

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183246.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spark SQL | Spark,从入门到精通
欢迎阅读美图数据技术团队的「Spark,从入门到精通」系列文章,本系列文章将由浅入深为大家介绍 Spark,从框架入门到底层架构的实现,相信总有一种姿势适合你。
美图数据技术团队
2019/04/19
2.1K0
Spark SQL | Spark,从入门到精通
大数据开发语言scala:源于Java,隐式转换秒杀Java
在多年的学习路上,也掌握了几门比较常见的语言,例如Java、Python以及前端Vue生态中包含的语言。很多时候,各种语言相似功能的框架都会被放在一起比较,来评判语言本身的优劣。
叫我阿柒啊
2024/06/21
3610
大数据开发语言scala:源于Java,隐式转换秒杀Java
Spark SQL 快速入门系列(2) | SparkSession与DataFrame的简单介绍
  在老的版本中,SparkSQL 提供两种 SQL 查询起始点:一个叫SQLContext,用于Spark 自己提供的 SQL 查询;一个叫 HiveContext,用于连接 Hive 的查询。
不温卜火
2020/10/28
2.4K0
Spark SQL 快速入门系列(2) | SparkSession与DataFrame的简单介绍
Spark SQL从入门到精通
熟悉spark sql的都知道,spark sql是从shark发展而来。Shark为了实现Hive兼容,在HQL方面重用了Hive中HQL的解析、逻辑执行计划翻译、执行计划优化等逻辑,可以近似认为仅将物理执行计划从MR作业替换成了Spark作业(辅以内存列式存储等各种和Hive关系不大的优化);
Spark学习技巧
2019/05/09
1.2K0
Spark SQL从入门到精通
scala的隐式转换学习总结(详细)
1) 隐式转换函数的函数名可以是任意的,与函数名称无关,只与函数签名(函数参数和返回值类型)有关。
全栈程序员站长
2022/11/07
8160
2021年大数据Spark(二十五):SparkSQL的RDD、DF、DS相关操作
Spark 2.0开始,SparkSQL应用程序入口为SparkSession,加载不同数据源的数据,封装到DataFrame/Dataset集合数据结构中,使得编程更加简单,程序运行更加快速高效。
Lansonli
2021/10/09
1.5K0
Note_Spark_Day07:Spark SQL(DataFrame是什么和数据分析(案例讲解))
使得Spark SQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行针对性的优化,最终达到大幅提升运行时效率
Maynor
2021/12/07
2.5K0
Note_Spark_Day07:Spark SQL(DataFrame是什么和数据分析(案例讲解))
第三天:SparkSQL
Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用。 我们已经学习了Hive,它是将Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduc的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢。所有Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快!
sowhat1412
2020/11/05
13.6K0
第三天:SparkSQL
Spark和Spring整合处理离线数据
如果你比较熟悉JavaWeb应用开发,那么对Spring框架一定不陌生,并且JavaWeb通常是基于SSM搭起的架构,主要用Java语言开发。但是开发Spark程序,Scala语言往往必不可少。
大数据学习与分享
2020/08/10
1.2K0
Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets Guide | ApacheCN
本文介绍了基于Spark的SQL编程的常用概念和技术。首先介绍了Spark的基本概念和架构,然后详细讲解了Spark的数据类型和SQL函数,最后列举了一些Spark在实际应用中的例子。
片刻
2018/01/05
26.7K0
大数据技术Spark学习
Spark SQL 是 Spark 用来处理结构化数据的一个模块,它提供了一个编程抽象叫做 DataFrame,并且作为分布式 SQL 查询引擎的作用。 我们已经学习了 Hive,它是将 Hive SQL 转换成 MapReduce 然后提交到集群上执行,大大简化了编写 MapReduce 的程序的复杂性,由于 MapReduce 这种计算模型执行效率比较慢。所以 Spark SQL 的应运而生,它是将 Spark SQL 转换成 RDD,然后提交到集群执行,执行效率非常快!
黑泽君
2019/05/10
5.5K0
大数据技术Spark学习
Spark之【SparkSQL编程】系列(No1)——《SparkSession与DataFrame》
上一篇博客已经为大家介绍完了SparkSQL的基本概念以及其提供的两个编程抽象:DataFrame和DataSet,本篇博客,博主要为大家介绍的是关于SparkSQL编程的内容。考虑到内容比较繁琐,故分成了一个系列博客。本篇作为该系列的第一篇博客,为大家介绍的是SparkSession与DataFrame。
大数据梦想家
2021/01/27
1.7K0
Spark之【SparkSQL编程】系列(No1)——《SparkSession与DataFrame》
04.Scala:高阶函数、隐式转换
scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是“头等公民”,它和Int、String、Class等其他类型处于同等的地位,可以像其他类型的变量一样被传递和操作。
Maynor
2021/04/09
1K0
Scala基础——隐式转换
Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicitconversion function。定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用。Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另外一种类型的对象并返回。这就是“隐式转换”。 通常建议将隐式转换函数的名称命名为“one2one”的形式。 隐式转换函数与普通函数唯一的语法区别就是,要以implicit开头,而且最好要定义函数返回类型。
羊羽shine
2019/08/16
7850
Spark基础-scala学习(八、隐式转换与隐式参数)
大纲 隐式转换 使用隐式转换加强现有类型 导入隐式转换函数 隐式转换的发生时机 隐式参数 隐式转换 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可。Scala会自动使用隐式转换函数。隐式转换函数与普通函数唯一的语法区别就是,要以implicit开头,而且一定要定义函数返回类型 案例:特殊售票窗口(只接受特殊人群,比如学生、老人等) scala> :paste // Entering paste mode (ctrl-D to finish) class SpecialPerson(val nam
老梁
2019/09/10
1.4K0
慕课网Spark SQL日志分析 - 5.DateFrame&Dataset
DataFrame 不是Spark Sql提出的。而是在早起的Python、R、Pandas语言中就早就有了的。
Meet相识
2018/09/12
7570
慕课网Spark SQL日志分析 - 5.DateFrame&Dataset
Spark SQL 快速入门系列(6) | 一文教你如何自定义 SparkSQL 函数
强类型的Dataset和弱类型的DataFrame都提供了相关的聚合函数, 如 count(),countDistinct(),avg(),max(),min()。除此之外,用户可以设定自己的自定义聚合函数
不温卜火
2020/10/28
1.6K0
Spark SQL 快速入门系列(6) | 一文教你如何自定义 SparkSQL 函数
Spark2.4.0源码分析之WorldCount FinalRDD构建(一)
Spark2.4.0源码分析之WorldCount FinalRDD构建(一) 更多资源 github: https://github.com/opensourceteams/spark-scala-maven-2.4.0 主要内容描述 Spark dataSet执行计算转成FinalRDD FinalRdd从第一个RDD到最到一个RDD的转化过程 RDD之间的依赖引用关系 ShuffleRowRDD默认分区器为HashPartitioning,实际new Partitioner,分区个数为200 Fina
thinktothings
2019/01/16
1.3K0
Spark2.4.0源码分析之WorldCount FinalRDD构建(一)
不可不会的scala隐式转换
从类型S到类型T的隐式转换由具有函数类型S => T的隐式值定义,或者通过可转换为该类型的值的隐式方法来定义。隐含转换适用于两种情况:
Spark学习技巧
2021/03/05
7970
不可不会的scala隐式转换
SparkSQL的两种UDAF的讲解
Spark的dataframe提供了通用的聚合方法,比如count(),countDistinct(),avg(),max(),min()等等。然而这些函数是针对dataframe设计的,当然sparksql也有类型安全的版本,java和scala语言接口都有,这些就适用于强类型Datasets。本文主要是讲解spark提供的两种聚合函数接口:
Spark学习技巧
2018/08/01
2.7K0
相关推荐
Spark SQL | Spark,从入门到精通
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验