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

spark隐式转换 toDf_隐式转换是什么文章目录一.生产问题背景二.隐式转换开荒2.1隐式转换函数参数RichFile2.2隐式类2.3隐式解析机制三.回归主题一.生产问题背景如上就是此blog产生的背景,SparkSQL中, DF.select()select报错不能导入 sparksqlCannotresolveoverloadedmethod’select’咨询大佬后,隐式转换的原因,导入Spark的隐式转换后即可 importspark.implicits._二.隐式转换开

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一. 生产问题背景

在这里插入图片描述
如上就是此blog产生的背景,

Spark SQL 中,
	DF.select()

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

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

二. 隐式转换开荒

在这里插入图片描述

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

在这里插入图片描述
但是从 精度低—–> 精度高的。就会报错

在这里插入图片描述

2.1 隐式转换函数 参数

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

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

RichFile
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 必须自己封装这个方法,然后实现隐式转换

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
  }
}

整理一下这个流程:

java.io.File 无 readContext方法
	查找implicit函数
		传入参数为File , 返回方法当中有没有一个方法为readcontext
		以上匹配关系必须唯一
	
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

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

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

  /**
   * :: 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
  }
  /**
   * 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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java google 离线地图开发_如何发布google离线地图及二次开发API[通俗易懂]

    java google 离线地图开发_如何发布google离线地图及二次开发API[通俗易懂]相关教程:1.说明离线地图开发环境支持谷歌地图、百度地图、高德地图等等所有常用地图类型,支持在局域网内的地图部署、二次开发。2.实现第一步:下载安装离线地图开发环境下载安装好之后,启动软件,如下图所示:①如果你的电脑连接到网络,这里可以直接点击【进入】;如果未能链接网络,请插上离线地图加密锁点击【进入】。②这里有离线地图二次开发的相关说明以及帮助信息。点击【进入】后,如下图:①:添加离线地图-…

  • 30个特色网站

    30个特色网站原文:http://www.360doc.com/showWeb/0/0/360001.aspx周游世界不再是有钱人的专利  穷游网:http://www.go2eu.com  在德国花3欧元就能住一晚,同5个人共花5欧元就能乘火车出城甚至出国……穷游网的热心“驴友”以自己的实战经验教你如何竭尽省钱之能事,以最有限的资金获得最In、最High的异域体验。囊中再羞涩也无法阻挡我们环球游历的愿

    2022年10月29日
  • java input.nextline_关于java:Scanner#nextLine()留下一个剩余的换行符[通俗易懂]

    java input.nextline_关于java:Scanner#nextLine()留下一个剩余的换行符[通俗易懂]我一直遇到Scanner#nextLine的问题。根据我的理解,nextLine()应该返回当前输入流的其余部分,然后继续进行下一行。while(true){try{System.out.println(“Pleaseenteramonthinnumericform”);month=input.nextInt();System.out.println(“Pleaseenter…

  • linux系统日志文件查看方法_linux系统日志保存期限

    linux系统日志文件查看方法_linux系统日志保存期限Linux系统日志rsyslogdrsyslogd是linux系统提供的一个守护进程,用来处理系统日志。rsyslogd守护进程既能够接受用户进程输出的日志,也能够接受内核日志。ispurs-virtual-machine:~$psaux|greprsyslogdsyslog60330.00.02565883328?Ssl2月180:00/usr/sbin/rsyslogd-n1.syslog函数用户进程可以通过syslog函

  • cuda包卸载_之前安装过cuda卸载不彻底

    cuda包卸载_之前安装过cuda卸载不彻底不小心把/usr/local/cuda删除了,卸载cuda后安装cuda后/usr/local下没有cuda文件夹.运行:sudoapt-getautoremove–purgecuda

  • CNN卷积神经网络原理讲解+图片识别应用(附源码)[通俗易懂]

    CNN卷积神经网络原理讲解+图片识别应用(附源码)[通俗易懂]一、机器如何识图先给大家出个脑筋急转弯:在白纸上画出一个大熊猫,一共需要几种颜色的画笔?——大家应该都知道,只需要一种黑色的画笔,只需要将大熊猫黑色的地方涂上黑色,一个大熊猫的图像就可以展现出来。我们画大熊猫的方式,其实和妈妈们的十字绣很接近——在给定的格子里,绣上不同的颜色,最后就可以展现出一幅特定的“图片”。而机器识图的方式正好和绣十字绣的方式相反,现在有了一幅图片,机器通过识别图片中…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号