scala中json4s 使用详解

Scala处理json格式数据 摘要:本文展示了使用Scala和fastjson处理JSON数据的两种方法。对于单个JSON字符串,通过JSON.parseFull()或JSON.parseObject()进行解析,并过滤错误数据。处理JSON数组时,需先拼接字符串再解析,对于格式错误的JSON数据采用字符串替换和分割的方式处理。示例中包含正确的JSON数据和人为构造的错误数据,演示了如何通过异常捕获和字符串操作来容错处理。最后定义了Student样例类作为数据模型。 阅读详情

预备知识

json4s的数据结构AST (Abstract Syntax Tree)。

sealed abstract class JValue
case object JNothing extends JValue // 'zero' for JValue
case object JNull extends JValue
case class JString(s: String) extends JValue
case class JDouble(num: Double) extends JValue
case class JDecimal(num: BigDecimal) extends JValue
case class JInt(num: BigInt) extends JValue
case class JBool(value: Boolean) extends JValue
case class JObject(obj: List[JField]) extends JValue
case class JArray(arr: List[JValue]) extends JValue

type JField = (String, JValue)

我们可以通过 json4s 对json所做的操作如下图所示,中间为 Json AST (简单理解就是一个用JValue表示的 JSON)。
在这里插入图片描述

另外,org.json4s下定义了很多scala原生数据转JValue的隐式转换(即多数操作下可以把原生数据当做JValue直接使用)
在这里插入图片描述
但是注意:Tuple不能自动转为JValue,在需要转换的时候,render先转一下,如:json merge render("height",175)

一、 创建json对象

{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "url":"http://www.nosqlnocry.wordpress.com"}

方式1:parse函数

// parse from string example,得到的是JValue对象
var json = parse("""{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "url":"http://www.nosqlnocry.wordpress.com"}""")

方式2:dsl创建

org.json4s中定义了从tuple到JValue的操作符

// DSL example,是JObject对象
var json = ("name","luca") ~ ("id","1q2w3e4r5t") ~ ("age",26) ~ ("url","http://www.nosqlnocry.wordpress.com")
// tuples can be defined also like this: ("id" -> "1q2w3e4r5t")
println(json)
JObject(List((name,JString(luca)), (id,JString(1q2w3e4r5t)), (age,JInt(26)), (url,JString(http://www.nosqlnocry.wordpress.com))))

二、常用操作

2.1 新增一个field

注意,以下两个方法都不会覆盖,若原json中已有height,则新json中会有两个height.

//法1:使用dsl,JObject才有~方法
json = json ~ ("height" -> 175) 
//法2: 使用merge,要求类型和左边一致,所以json为parse出来的JValue时,要用render生成JValue再merge
json = json merge render("height",175)

2.2 更新一个field

使用 transformField

json = json transformField {
    case JField("name", _) => ("NAME", JString("Luca")) //还可重命名
    case JField("age", JInt(age)) => ("age", JInt(age+1))//更新值
}

json = json merge render("age",26) //若json 中已有"age"

2.3 删除一个field

json = json removeField {
    case JField("NAME", _) => true //被删除
    case JField(`field`, _) => true //被删除,filed为变量
    case _ => false
}
// 或等价的
json = json.removeField(x=>x._1.equals(field))
// 或等价的
json = json filterField {
    case JField("NAME", _) => false 
    case _ => true //被保留
    }

// 以上都是递归的删除,会如果inner json体中有同名字段,也会被删除。
// 非递归删除,只删除最顶层的
json  = json match {
  case JObject(l) => JObject(l.filter {
    case (name, _) => name != field
  })
}

2.4 获取一个field

println(compact(json \\ "age")) // 27 嵌套获取-见下
println(compact(json \ "age"))  // 27
println(compact(json.children(1))) // 27

2.5 JArray遍历第一层

jArr.arr//获得List[JValue]

三、高阶操作

{
	"name": "luca",
	"id": "1q2w3e4r5t",
	"age": 26,
	"url": "http://www.nosqlnocry.wordpress.com",
	"url": "https://nosqlnocry.wordpress.com",
	"loginTimeStamps": [
		1434904257,
		1400689856,
		1396629056
	],
	"messages": [
		{
			"id": 1,
			"content": "Please like this post!"
		},
		{
			"id": 2,
			"content": "Forza Roma!"
		}
	],
	"profile": {
		"id": "my-nickname",
		"score": 123,
		"avatar": "path.jpg"
	}
}

3.1 选取field

println(JSON)
//JObject(List((name,JString(luca)), (id,JString(1q2w3e4r5t)), (age,JInt(26)), (url,JString(http://www.nosqlnocry.wordpress.com)), (url,JString(https://nosqlnocry.wordpress.com)), (loginTimeStamps,JArray(List(JInt(1434904257), JInt(1400689856), JInt(1396629056)))), (messages,JArray(List(JObject(List((id,JInt(1)), (content,JString(Please like this post!)))), JObject(List((id,JInt(2)), (content,JString(Forza Roma!))))))), (profile,JObject(List((id,JString(my-nickname)), (score,JInt(123)), (avatar,JString(path.jpg)))))))


println(JSON\\"id") //获取所有嵌套的id数据
// prints: JObject(List((id,JString(1q2w3e4r5t)), (id,JInt(1)), (id,JInt(2)), ...

println(JSON\"id")//获取第一层的id数据
// prints: JString(1q2w3e4r5t)

println(JSON\"url") //如果第一层有多个,则返回JArray
// prints: JArray(List(JString(http://www...), JString(https://nosqlnocry...

val messagesIds = (JSON \ "messages") \ "id" //获取JAray中的id数据
println(messagesIds)
// prints: JArray(List(JInt(1), JInt(2)))
println(messagesIds.values)
// prints: List(1,2)
//或用for语句
val messagesIds2=  for {
      JObject(child) <- JSON
      JField("id", JInt(id)) <- child
    } yield id
 println(messagesIds2)
 // prints: List(1,2)

for语句的<-在JValue中做了特殊处理,会返回所有匹配项。

    for {
      JObject(child) <- JSON //这回匹配所有JObject,不管是不是嵌套
    }{
      println(child)
    }
//List((name,JString(luca)), (id,JString(1q2w3e4r5t)), (age,JInt(26)), (url,JString(http://www.nosqlnocry.wordpress.com)), (url,JString(https://nosqlnocry.wordpress.com)), (loginTimeStamps,JArray(List(JInt(1434904257), JInt(1400689856), JInt(1396629056)))), (messages,JArray(List(JObject(List((id,JInt(1)), (content,JString(Please like this post!)))), JObject(List((id,JInt(2)), (content,JString(Forza Roma!))))))), (profile,JObject(List((id,JString(my-nickname)), (score,JInt(123)), (avatar,JString(path.jpg))))))
//List((id,JInt(1)), (content,JString(Please like this post!)))
//List((id,JInt(2)), (content,JString(Forza Roma!)))
//List((id,JString(my-nickname)), (score,JInt(123)), (avatar,JString(path.jpg)))

JValue的<-调用的是

    def foreach(f: JValue => Unit): Unit =
      self.filter(p).foreach(f)

Array的<-调用的是

  def foreach[U](f: A => U): Unit = {
    var i = 0
    val len = length
    while (i < len) { f(this(i)); i += 1 }
  }

3.2 取出field

println(compact(render(JSON \ "messages")))
// prints: [{"id":1,"content":"Please like this post!"},{"id":2,"content":"Forza Roma!"}]
println(pretty(render((JSON \ "messages")\"content")))
// prints: [ "Please like this post!", "Forza Roma!" ] // note it is not compacted anymore

println(pretty(render(JSON \ "age")))
// prints: 26

println(compact(render(JSON \ "name")))
// prints: "luca" // note the apostrophes

var name = for { JString(x) <- (JSON \\ "name") } yield x //或用for表达式去掉双引号
println(name(0))
// prints: luca

var name = (JSON \ "name") //或用values去掉双引号,保留对应基本类型时,推荐这种方法
println(name.values)
// prints: luca

implicit val formats = DefaultFormats
val name = (JSON \ "name").extract[String]//或直接extract,已知需要的类型时推荐这种方法
println(name)
// prints: luca

name.values 原理:在这里插入图片描述

3.3 查找和过滤filed

//返回第一个遇到的元素
val URL = JSON findField {
case JField("url", _) => true
case _ => false
}
println(URL)
// prints: Some((url,JString(http://www.nosqlnocry.wordpress.com)))

// 返回所有符合条件的元素
val URLs = JSON filterField {
case JField("url", _) => true
case _ => false
}
println(URLs)
// prints: List((url,JString(http://www.nosqlnocry...)), (url,JString(https://nosqlnocry...)

3.4 合并与差异另一个Json2:merge和diff

{
	"messages": [
		{
			"id": 3,
			"content": "how to merge?"
		}
	],
	"url": "anotherURL",
	"loginTimeStamps": 1400689856,
	"profile": {
		"avatar": "new.jpg"
	},
	"new": "new value"
}

Json1 merge Json2

  1. 如果字段法Json1/f1与Json2/f1结构不同,或者仅具有简单结构,则Json2会替换Json1的f1
  2. 若结构相同且为复杂结构,则会合并
  3. 若Json2/f1在Json1中不存在,则新增
    在这里插入图片描述
    diff 获取两个JSon间的不同(用得少):
val newUserJSON = """
 {
   "name":"luca",
   "id": "anotherID",
   "age": 26,
   "url":"http://www.nosqlnocry.wordpress.com",               
   "profile":{"id":"another-nickname", "score":99999, "avatar":"path.jpg"}
}
"""    
val Diff(changed, added, deleted) = JSON diff parse(newUserJSON)

println(compact(render(changed)))
println(added)
println(pretty(render(deleted)))
/* print:
{"id":"anotherID","profile":{"id":"another-nickname","score":99999}}
JNothing
{
  "url" : "https://nosqlnocry.wordpress.com",
  "loginTimeStamps" : [ 1434904257, 1400689856, 1396629056 ],
  "messages" : [ {
    "id" : 1,
    "content" : "Please like this post!"
  }, {
    "id" : 2,
    "content" : "Forza Roma!"
  } ]
}*/

3.5 类和JSon间的转换:decompose, extract, write和read

case class Item(info: String, rank: Int)
case class Item2(info: String, rank: Int, name:String)
implicit val formats: Formats = DefaultFormats

val vMap=Map("info" -> "abcd", "rank" -> 123, "other" -> "dsf")
val jsonStr = write(vMap)
println(jsonStr)
//{"info":"abcd","rank":123,"other":"dsf"}

val json = parse(jsonStr)
println(json)
 val json2 = Extraction.decompose(vMap)//可以理解为等价于parse(write(vMap))
println(json2)


val json=parse(jsonStr)
//val json2=
println(json.extract[Map[String,Any]])
//Map(info -> abcd, rank -> 123, other -> dsf)
println(read[Map[String,Any]](jsonStr))//可理解为和json.extract效果一样,但是跳过了将str转为JValue对象的过程
//Map(info -> abcd, rank -> 123, other -> dsf)


println(json.extract[Item])//case class 的字段名要和json的field一致,可少不可多与json有的field
//Item(abcd,123)
println(read[Item](jsonStr))
//Item(abcd,123)

println(json.extract[Item2])//不可多于json有的field
//报错,org.json4s.MappingException: No usable value for name

println(read[Item2](jsonStr))
//报错,org.json4s.MappingException: No usable value for name

不用默认格式:(非scala基类作为父类的话,默认格式解析会出错)

  trait Animal
  case class Dog(name: String) extends Animal
  case class Fish(weight: Double) extends Animal
  case class Animals(animals: List[Animal])


    implicit val formats1: Formats = DefaultFormats
    val formats2: Formats = Serialization.formats(ShortTypeHints(List(classOf[Dog], classOf[Fish])))
    implicit val mf = manifest[Animals]

    val ser1 = write(Animals(Dog("pluto") :: Fish(1.2) :: Nil))(formats1)
    val ser2 = write(Animals(Dog("pluto") :: Fish(1.2) :: Nil))(formats2)

    println(ser1)
    //{"animals":[{"name":"pluto"},{"weight":1.2}]}
    println(ser2)
    //{"animals":[{"jsonClass":"BasicTest$Dog","name":"pluto"},{"jsonClass":"BasicTest$Fish","weight":1.2}]}



    println(read[Animals](ser2)(formats2, mf))
    //Animals(List(Dog(pluto), Fish(1.2)))
    println(parse(ser2).extract[Animals](formats2,mf))
    //Animals(List(Dog(pluto), Fish(1.2)))
    println( read[Animals](ser2)(formats1,mf))// 报错
    //org.json4s.MappingException: No usable value for animals,No constructor for type Animal, JObject(List((jsonClass,JString(BasicTest$Dog)), (name,JString(pluto))))


    println( read[Animals](ser1))//等价于println( read[Animals](ser1)(formats1,mf)) ,报错
    //org.json4s.MappingException: No usable value for animals No constructor for type Animal, JObject(List((name,JString(pluto))))
    println(parse(ser1).extract[Animals])//报错
    //org.json4s.MappingException: No usable value for animals No constructor for type Animal, JObject(List((name,JString(pluto))))
    println(parse(ser2).extract[Animals])//报错
    //org.json4s.MappingException: No constructor for type Animal, JObject(List((jsonClass,JString(BasicTest$Dog)), (name,JString(pluto))))

参考

官方教程
WORKING WITH JSON IN SCALA USING THE JSON4S LIBRARY (PART ONE)
WORKING WITH JSON IN SCALA USING THE JSON4S LIBRARY (PART TWO)
Purpose of render in json4s

使用Scala解析JSON对象的方法 在Scala中解析JSON对象是一项常见的任务,它可以帮助我们处理和操作来自外部数据源的结构化数据。本文将介绍如何使用Scala的库来解析JSON对象,并展示一个示例代码。需要注意的是,以上示例代码仅仅是解析JSON对象的基本用法。对象的字段,我们可以获取JSON数据的值。对于解析JSON对象,我们可以使用许多Scala的第三方库。该库提供了一个简单而强大的API,可以轻松地解析和操作JSON数据。对象的字段来获取JSON数据的值,并将其打印出来。对象的字段,我们可以获取JSON数据的值。 阅读详情

相关推荐

MaxEnt软件的下载与安装

1、下载网站:http://lucky-boy.ys168.com/ (这是之前在网上搜到的,里面有许多软件安装包,感谢网页主的资源共享,违权必删)

weixin_42191203的博客 2万+

Scala中解析json工具对比

1, 做少量文件解析,优先用json4s,因为json4s时基于Scala开发的,对scala使用场景支持更好2. 做大量数据的解析,追求序列化、反序列化速度时,考虑用fastjson,但是fastjson是基于java开发的,涉及自定义类的提取时,支持不好。所以,除非遇到性能提升问题,再用fastjson。可选工具:fastjsongsonjson4s(jackson的scala版本)lift-jsonspray-jsoncircleplay-json。

Code_LT的博客 2145

从TCGA官网获取新版count数据并精准转换为TPM的实战指南

本文详细介绍了从TCGA官网获取新版count数据并精准转换为TPM的实战指南。通过TCGAbiolinks工具下载原始count数据,结合GENCODE v36注释文件计算基因有效长度,最终实现count到TPM的标准化转换,确保数据完整性和分析可靠性。文章包含完整代码示例和常见问题解决方案,特别适合生物信息学研究人员参考。

weixin_27310417的博客 284

Scala解析和组装json(使用orj.json/json4s)————附带详细代码和示例

文章目录0 背景1 数据准备(读入数据)2 解析json文件3 组装json4 json写入到文件4.1 直接写入4.2 格式化json字符串后写入4 使用json4s 0 背景 因为项目项目需要实现修改json数据后重新写入,原本解析json使用的json4s(Scala3貌似可以去使用circe-json),但是要实现替换json中的值然后重新写回到文件中实现起来方便(没有找到相对应的借口),于是去寻找了一个相对易用的包。找到了org.json,于是就用此包实现了相对应的功能。 1 数据准备(读入数据)

韩江雪de 小屋 3672

实战教程:如何用Python+小波变换+CNN搞定医学影像中的条纹噪声(附完整代码)

本文提供了一套完整的实战方案,指导如何利用Python结合小波变换与卷积神经网络(CNN)去除医学影像中的条纹噪声。该方法通过小波变换精准定位噪声,再使用轻量化CNN进行针对性清除,有效保护图像细节,并附有可运行的完整代码,为医学影像处理与AI分析提供高效工具。

weixin_29056101的博客 269

数据仓库的复用性:设计和构建一个高复用性的数仓

数据仓库的复用性是指在数据仓库的设计和使用过程中,能够实现数据、模型、流程、工具等多个层面的重复利用,减少重复开发,提高开发效率,降低维护成本,并增强灵活性和可扩展性。

z1941563559的博客 1307

使用json4s,在scala语言里面解析json

json4s的使用,来自官方

caocry的博客 770

STM32L151C8T6低功耗实战:RTC闹钟唤醒停机模式的配置与优化

本文详细介绍了如何在STM32L151C8T6微控制器上配置与优化RTC闹钟唤醒停机模式,以实现极致的低功耗设计。文章从核心原理出发,结合STM32CubeMX配置实战,深入讲解了进入停机模式前的关键准备工作、唤醒后的系统恢复流程,并分享了将功耗降至个位数微安级的深度优化技巧与常见问题解决方案。

weixin_29166013的博客 301

scala json4s使用

使用最多的就是Map和Json字符串转换 导入maven依赖 &lt;dependency&gt; &lt;groupId&gt;org.json4s&lt;/groupId&gt; &lt;artifactId&gt;json4s-jackson_2.10&lt;/artifactId&gt; &lt;ver...

小狐狸的博客 1407

RK平台以太网设置中添加代理设置

以太网中配置Configuration的时候可以IpConfiguration的初始化函数来设置代理类型和代理参数。通过添加一个KEY_ETH_PROXY的选项来设置代理的配置,然后再设置以太网静态或者动态的类型时候下发给系统进行设置。

Android系统开发笔记 656

从 CDS 到对外接口:彻底吃透 SAP Business Service Definition 与 Service Binding

SAP ABAP开发中的Business Service(业务服务)已成为连接数据模型与外部消费的关键枢纽。Service Definition定义了要暴露的CDS实体,而Service Binding则负责将定义绑定到具体协议(如OData V2/V4)并发布为可消费服务。这种分层设计实现了同一服务定义在不同协议间的复用,符合SAP的解耦技术路线和Clean Core原则。从CDS视图到最终服务的完整链路清晰:先定义CDS模型,再通过Service Definition暴露实体,最后用Service Bi

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 159

在scala中利用org.json4s 操作json

https://github.com/json4s/json4s/tree/v.3.2.0_scala2.10 SON4S  At this moment there are at least 6 json libraries for scala, not counting the java json libraries. All these libraries

leehbing的博客 1万+

rk3588上适配wifi模组aic8800

记录一下在rk3588上调试aic8800,调试分为Debian11以及Android12两个平台,这里主要是讲过程以及修改的过程,以补丁的形式来提供解决方法。在Debian11下主要通过配置设备树、编译驱动并自动加载固件完成调试,详细介绍了设备树修改、驱动编译脚本调整和驱动加载流程。

m0_60805802的博客 1006

JSON4S 完整教程:从零开始掌握Scala JSON处理

JSON4S是Scala生态中功能强大的JSON处理库,为开发者提供了简单易用的API来处理JSON数据。无论你是Scala新手还是有经验的开发者,JSON4S都能帮助你轻松实现JSON解析、序列化和数据转换。🚀 ## 为什么选择JSON4S? JSON4S解决了Scala原生JSON处理的痛点,提供了统一的数据抽象和丰富的操作功能。通过 **Json AST(抽象语法树)** 作为核心数据

gitblog_00429的博客 526

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

开发工具-scala处理json格式利器-json4s

1.为什么是json4s 从json4s的官方描述 At this moment there are at least 6 json libraries for scala, not counting the java json libraries. All these libraries have a very similar AST. This project aims to provide a single AST to be used by other scala json libraries.

Hoult丶吴邪 795

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

scala基于json4s json转map json转list map转json

scala基于json4s json转map json转list import org.json4s.DefaultFormats import org.json4s.jackson.{JsonMethods, Serialization} /** * @Auther xiaojin * @Date 2020-12-22 7:51 下午 */ object test { def main(args: Array[String]): Unit = { val aa = Map(

xjxjin的博客 958

SAP B1中文培訓教材_SDK

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

Scala之Json4s解析json

import com.alibaba.fastjson.{JSON, JSONObject} import org.apache.spark.rdd.RDD /** * Created by maokm on 2020/1/3. */ /* """ |platformId;//渠道编码 | loanTerm;//贷款其次 |creditCode;//营业执照号 |riskId;//授信业务号 |status;//状态 |customerOpenId;//商户号 可以为空 | ap..

857技术社区 1206

scala-json-json4s-工具类

汇总基于json4s类库的scala语言的json工具类import java.text.SimpleDateFormatimport org.apache.spark.SparkContext import org.apache.spark.sql.{DataFrame, SQLContext} import org.json4s.jackson.JsonMethods._ import org.

program哲学 1376

Scala中json4s的使用例子

最近开始使用json4s来解析和生成JSON。 引入依赖<dependency> <groupId>org.json4s</groupId> <artifactId>json4s-jackson_2.10</artifactId> <version>3.2.11</version> </dependency> 构造JSON字符串 例1implicit val f

肖韬的BLOG 1万+

scala:json4s库常用操作

API:https://static.javadoc.io/org.json4s/json4s-core_2.9.1/3.0.0/org/json4s/JsonAST$$JValue.html 替换操作replace: import org.json4s.JsonDSL._ import org.json4s.jackson.JsonMethods....

weixin_33690963的博客 199

defuddle 数学公式字面文本的保真与安全:`\texttt{<div>}` 类公式如何在 Markdown 序列化中不被转义改写

本文讲解 defuddle 在将网页正文提取为 Markdown 时,如何对待 LaTeX 公式中"字面文本"(literal text)的特殊处理策略。当公式里出现 `<div>`、`<b>` 这类标签样字符、或 `[x]: value` 这类链接样片段时,常规转义会破坏公式的语义与空格结构,甚至给 Markdown 注入面留下可乘之机;defuddle 通过识别字面文本命令(`\text`、`

gitblog_00002的博客 481

Scala json4s Json解析工具类

package com.sm.utils import java.util import com.sm.common.utils.DateUtil import org.apache.commons.lang3.StringUtils import org.json4s._ import org.json4s.jackson.JsonMethods._ import org.json4s.jackson.Serialization import org.json4s.jackson.Serializa.

L, there! 846

AgentScope 2.0 速通指南:如何用 3 段代码跑起可控的智能体

很多人以为多智能体协作必须手写每一步编排,模型一失控就只能下线重来。其实还有一条路:把全过程流式成事件,每次工具调用前插一道权限检查,把决策权还给模型。AgentScope 2.0 就是这样的多智能体框架:它把智能体的推理、工具调用与协作变成可回放的事件流,并内置权限管控与沙箱隔离。 [![AgentScope 2.0 多智能体框架架构总览:事件系统、权限系统与工作区三层结构](https://

gitblog_00280的博客 810

scala:json4s库—Json与对象转换

github: https://github.com/json4s/json4s 使用 json4s库 依赖: val json4sNative = "org.json4s" %% "json4s-native" % "3.2.11" 数据类型: sealed abstract class JValue case object JNothing ...

weixin_33709364的博客 547

JSON4S 使用教程

JSON4S 使用教程 项目介绍 JSON4S 是一个用于 Scala 语言的 JSON 处理库,旨在提供简单且一致的 API 来处理 JSON 数据。它支持多种 JSON 解析和生成方式,并且可以与多种 Scala 框架(如 Spark 和 Flink)无缝集成。JSON4S 提供了丰富的功能,包括 JSON 解析、生成、查询、转换和序列化等。 项目快速启动 安装依赖 首先,需要在项目中添加 J...

gitblog_00875的博客 628

【总结】使用Json4s实现Scala对象转Json

object JsonExample extends App {import org.json4s.JsonDSL._import org.json4s.jackson.JsonMethods._//第一部分,官网例子case class Winner(id: Long, numbers: List[Int])case class Lotto(id: Long, winnin...

weixin_33919941的博客 493
上一篇: HiveQL 语句 优先级
下一篇: 【spark】序列化和反序列化,transient关键字的使用
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值