从Spark Row 到 GenericRowWithSchema

PySpark MLlib在2025年为何仍是大规模特征工程的确定性基座 分布式机器学习不是单纯追求模型新颖性,而是解决数据规模、状态一致性与生产稳定性之间的根本矛盾。当特征数据达TB级、窗口计算需事件时间语义、线上服务要求P99延迟<200ms时,‘可审计、可回滚、可横向扩展’的确定性能力比算法前沿性更关键。PySpark MLlib凭借Structured Streaming水印机制、Pipeline原子化契约、MLWritable模型持久化等工业级设计,将StringIndexer的handleInvalid策略、VectorAssembler的null处理逻辑等‘隐性工程 阅读详情

 

Dataframe.collect () 是常用的将分布式数据载入到Driver的方法,得到的是Array[GenericRowWithSchema]类型,常常需要从GenericRowWithSchema提取数据,具体所以了解GenericRowWithSchema类型是十分有必要的。 而GenericRowWithSchema继承自 org.apache.spark.sql.Row,自己本身并没有定义多少方法。所以从Row 先开始学习。

 

库引用:

import org.apache.spark.sql._

 

创建:

 // Create a Row from values.
 Row(value1, value2, value3, ...)
 // Create a Row from a Seq of values.
 Row.fromSeq(Seq(value1, value2, ...))

 

访问:两种方式,generic access方式 得到的都是Any类。 native primitive access得到的是指定类。

val row = Row(1, true, "a string", null)
 // row: Row = [1,true,a string,null]
 val firstValue = row(0)
 // firstValue: Any = 1
 val fourthValue = row(3)
 // fourthValue: Any = null

val firstValue = row.getInt(0)
 // firstValue: Int = 1
 val isNull = row.isNullAt(3)//没有getNull,只需判断即可
 // isNull: Boolean = true

常用函数:

anyNull(): Boolean  是否还有null元素

fieldIndex(java.lang.String name): Int 查找域名索引

get(int i)  和apply(int i)一样,得到位置i处的值,类型为Any

getAs(int i),实际用法是getAs[T](int i) 将位置i处的值按T类型取出 

getAs(java.lang.String fieldName)   不会用

get*(int i) 获取位置i处的值,并使其为*类型, *:Byte, Date, Decimal, Double, Float, JavaMap (i处需为array type), List(array type), Long, Map(map type), Seq(array type), Short, String, Structure( structure type 返回Row), Timestamp(data type),

getValuesMap(scala.collection.Seq<java.lang.String> fieldNames) 不会

 

mkString(String seq) 可看成是由各元素.toString后组成

mkString(java.lang.String start, java.lang.String sep, java.lang.String end) 带指定头尾

 

 toSeq()  用所有元素组成WrappedArray类返回,调用WrappedArray.to* 可转换为其他*类型

 

其他:copy(), equals(java.Obejct o),hashCode(), length() ,isNullAt(int i), size(), toString()

 

val r1=Row(1, true, "a string", null,Array(1,2,3))
val r2=Row(1,2,3,4) 
r1.mkString(",")
//res3: String = 1,true,a string,null,[I@117d8e07
r1.toSeq
//WrappedArray(1, true, a string, null, [I@117d8e07)
r2.toSeq
//res5: Seq[Any] = WrappedArray(1, 2, 3, 4)
print(r1)
//[1,true,a string,null,[I@117d8e07]res6: Unit = ()
print(r2)
//[1,2,3,4]res7: Unit = ()
r1.schema
r2.schema
//res8: org.apache.spark.sql.types.StructType = null
//res9: org.apache.spark.sql.types.StructType = null

 

GenericRow和GenericRowwithSchema 定义如下:

class GenericRow(protected[sql] val values: Array[Any]) extends Row {
  /** No-arg constructor for serialization. */
  protected def this() = this(null)

  def this(size: Int) = this(new Array[Any](size))

  override def length: Int = values.length

  override def get(i: Int): Any = values(i)

  override def toSeq: Seq[Any] = values.clone()

  override def copy(): GenericRow = this
}
class GenericRowWithSchema(values: Array[Any], override val schema: StructType)
  extends GenericRow(values) {

  /** No-arg constructor for serialization. */
  protected def this() = this(null, null)

  override def fieldIndex(name: String): Int = schema.fieldIndex(name)
}

 

所以,要想得到GenericRowwithSchema内部的值,可调用:

GenericRowwithSchema.toSeq :WrappedArray[SchemaType],相应位置的元素类型由自带Schema决定

若想得到某个位置的数据则用GenericRowwithSchema.getT(位置),如grs.getString(1)

 

Row.toSeq: 得到WrappedArray[Any]对象(实际上是Seq[Any]对象), 再调用WrappedArray.toT 转换为其他T[Any]类型或

(推荐使用)WrappedArray.asInstanceof(Seq[T])转换为WrappedArray[T]对象(即Seq[T]对象)。注意,直接转为WrappedArray.asInstanceof(Array[T])是不行的,会报错。

 

 

WrapperedArray的相关信息参见: Scala 数组(Array, WrapperedArrary)

 

具体示例可见:

 

参考资料:

https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/rows.scala

https://spark.apache.org/docs/1.5.1/api/java/org/apache/spark/sql/Row.html

fieldIndex on a Row without schema is undefined 这种情况可能是因为第一次 flatMap 操作改变了原始 Dataset 的结构或类型,导致后续的操作失去了原有的 schema 信息。为了解决这个问题,你需要确保在 flatMap 中处理的数据仍然保持有 schema 信息。有些bug网络上可能没有对应的解决方式,不同是spark版本可能遇到不同的问题,我们可以根据给出的异常提示进行不同的尝试。明显能打印出schema信息,下面去尝试解决这个问题。我们直译一下大概就是你用row.getAs(“字段名”)的时候代码根本不清楚你这个row里面有哪些字段。 阅读详情

相关推荐

Argoverse轨迹预测实战:从数据加载到地图API应用全解析

本文详细解析了Argoverse数据集在轨迹预测中的应用,从数据加载到地图API的实战技巧全涵盖。通过具体代码示例展示如何高效处理轨迹数据、实现可视化及基础预测模型,帮助开发者快速掌握自动驾驶轨迹预测的核心技术。特别介绍了Argoverse地图API的深度应用和性能优化经验。

weixin_29182481的博客 241

记录spark rdd内存溢出的一次问题

通过debug发现rdd的时候使用row对象就会创建 GenericRowWithSchema,而row.getAs 也会创建 GenericRowWithSchema ,尤其是row.getValueMap 有多少字段创建多少GenericRowWithSchema。这是导致GenericRowWithSchema创建多的原因。尽量少用getValueMap,rdd的每一次map也会多创建一次GenericRowWithSchema,所以能一次map搞定,不要多次map搞。

Bducke的博客 545

AWS-解析mysql binlog同步数据方案

虽然是公有云的鼻祖,AWS在某些产品的实现却太不给力;可能是习惯了阿里云喂到嘴边的感觉,AWS很多方案需要自己折腾,蛋疼!比如这里要讲的mysql数据同步方案。 阿里云产品DTS,点几下就OK了,AWS,只能通过插件安装、配置、调试、蹚坑……,具体就是用msk的debezium插件连接器。没见识过的一脸懵逼,下面说下配置步骤和一些注意的坑。

sdmei 1407

Spark SQL & Elasticsearch

踩坑Spark SQL读写Elasticsearch全流程

heartsdance的博客 2113

DeepSeek API调用太复杂?OneAPI一站式聚合解决方案

本文介绍了OneAPI如何作为一站式聚合解决方案,简化DeepSeek API的调用流程。通过统一接口、智能路由和模型映射等核心功能,OneAPI大幅降低了多API适配的复杂性,提升开发效率。文章还提供了详细的部署指南和高阶使用技巧,帮助开发者快速实现API聚合管理。

weixin_27215337的博客 381

2021秋招IC验证面经-ARM中国/中科芯/飞腾/地平线/中兴

中科芯 (央企福利待遇好,但是百分百不解决户口,适合当地人进去躺平。) 现场面试,三个面试官,时间大约40min 首先介绍一下自己,介绍一下项目。所做项目用到了FIFO吗,深度是多少,位宽是多少,仲裁算法是什么? 验证环境中的reference model是自己写的还是本身就有的,仲裁怎么在参考模型中实现,参考模型怎么获取寄存器的值? 怎么配置RTL寄存器,通过平台的寄存器模型进行寄存器配置,寄存器模型里边的方法,写一个寄存器或读一个寄存器怎么实现? 寄存器如何实现前门访问和后门访问,后门访问时

weixin_48014653的博客 6319

org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to

将数据从DF转化为RDD后,会丢失原先的数据类型,此时如果想将RDD通过asInstanceOf[RDD[type]],重新封装为DF进行其他操作则会进行报错。博客二:以String为例进行元素数据转换。使用样例类对RDD中的逐个元素进行转换。博客一:直接用ROW进行数据处理。结果:未直接解决问题,但获得思路。

qq_44967205的博客 1625

openEuler服务器离线安装实战:从Docker到Samba的完整避坑指南

本文提供了一份详尽的openEuler服务器离线部署实战指南,重点解决了在无网络环境下安装Docker、Samba等软件的依赖难题。文章深入对比了`dnf install`、`rpm`直接安装及禁用仓库安装三种核心方法,并分享了构建本地DNF仓库的进阶策略,旨在帮助运维人员构建高效可靠的离线部署工作流。

weixin_29210759的博客 72

在spark计算RDD[Row]动态增加字段

关于在计算中,动态添加字段处理方式,参考网上的方式,进行整理如下,作个记录 package com.ku.test import org.apache.spark.rdd.RDD import org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema import org.apache.spark.sql.types._ import org.apache.spark.sql.{DataFrame, Row, SparkSession

wangsg2014的专栏 2708

保姆级教程:在Windows 10上为QT5.15.2配置Android开发环境(含SDK/NDK/JDK避坑指南)

本文提供了一份详细的Windows 10环境下为QT5.15.2配置Android开发环境的保姆级教程,涵盖SDK、NDK、JDK的安装与配置,以及常见问题的避坑指南。通过优化安装流程、解决Gradle下载慢等痛点,帮助开发者快速搭建稳定的编译环境,并提供了模拟器配置和调试技巧,确保开发效率。

weixin_30919571的博客 528

AFSim 2.9实战指南:从入门到精通的中文教程

本文是AFSim 2.9的实战中文教程,旨在帮助用户从零开始掌握这一先进的仿真框架。内容涵盖从环境安装、运行第一个“Hello World”仿真,到深入理解实体、组件、想定编辑器等核心概念,并进阶探讨动力学建模、传感器仿真与红蓝对抗想定构建。最后,指南还提供了效能分析与实战排错技巧,帮助用户将仿真结果转化为有价值的量化数据,适用于军事、航空航天等领域的复杂系统行为模拟研究。

weixin_29294395的博客 357

org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to scala.Tuple2

今天在写spark 提数的时候遇到一个异常,如下Caused by: java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to scala.Tuple2 at $anonfun$1$$anonfun$apply$1.apply(<co

乄浅醉的专栏 1万+

基于STM32的多传感器融合的设施农业小型搬运机器人避障控制系统设计

针对设施农业场景中狭窄通道、障碍物多样(如农机具、作物植株、水管)的特点,设计一款基于 STM32 的小型搬运机器人避障控制系统。系统通过多传感器融合实现 360° 环境感知,采用模糊 PID 控制算法实现平滑避障,满足温室、大棚等场景的搬运需求。通过在温室环境测试,系统可实现对直径≥5cm 障碍物的有效检测(检测距离误差≤5%),避障转向半径≤30cm,平均功耗≤15W。后续可通过增加激光雷达(如 TFmini)提升远距离障碍物检测能力,结合 SLAM 算法实现路径规划。

weixin_42300449的博客 860

对于DataFrame结构的理解

对于df结构的理解 1、DataFrame = Dataset[Row] DataFrame 在Spark1.6之后就没有单独保存此类,其实是装有Row对象的Dataset Dataset的创建一般会将 Row 封装为一个案例类 而虽然移除了DataFrame这个类,但是还是依旧保存这个方法,是因为它的创建方式灵活, 增加或者删除某个字段时操作方便,而Dataset需要增删某一个字段时,则需要根据需求 创建新的Row对象,程序性能较差 2、Row Row是一个特质,D.

chaohui2638457321的博客 383

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spark中给RDD[Row]中的Row动态增加一个或者多个字段

Spark 中动态的给Row新增字段 我们知道,在Spark中,我们读取csv或者MySQL等关系型数据库时,可以直接得到DataFrame.我们要想新增一个字段,可以通过DataFrame的API或者注册一个临时表,通过SQL语句能很方便的实现给增加一个或多个字段. 但是,当我们将DataFrame转化成RDD的时候,RDD里面的类型就是Row,如果此时,要想再增加一个字段,该怎么办呢? Sho...

TMH_ITBOY的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

spark RDD[Row] 字段太多优化处理

val buffer: mutable.Buffer[Object] = Row.unapplySeq(row).get.map(_.asInstanceOf[Object]).toBuffer buffer.append(要加的字段) val schema: StructType = row.schema.add("aaa", StringType)....

max_hello的博客 1452

java-spark 合并两个row的column

List<Row> tmpList = new ArrayList<Row>() { { add(row1); add(row2); } }; Seq<Row> tmpSeq =JavaConverters.asScalaIteratorConverter(tmpList.iterator()).asScala(...

码者人生的技术博客 1990

java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot

先准备构造一个DataFrame,其中scores字段是一个序列,里面的每一个元素是一个元组: import spark.implicits._ val df: DataFrame = Seq( ("A", Seq(("1", 5.0), ("3", 2.0))), ("B", Seq(("1", 4.0), ("2", 5.0))), ("C", Seq(("2", 5.0), ("3", 2.0))) ).toDF("userId", "scores") .cache() df.pr

w1016765655的博客 2453

Spark关于 ExpressionEncoder[T] 以及 RowEncoder 以及Spark怎么做外部数据和内部数据的转换

该方法,该方法是用来把表示涉及的属性,给映射到对应的计划的属性值上,这样我们计算的时候,就可以获取到对应的值,一般是调用。这里会涉及到两个ROW的转换,两个ROW的 Schema 是不一致的,如果要涉及到两个ROW之间的转换的时候,而且。的值,所以get(0)是 GenericRowWithSchema类型的ROW,也就是ROW类型。, 前者是 Spark 内部的使用的一行数据的表示,后者是给Spark开发者使用的行数据表示。可执行表达式,最最终绑定到表的特定属性上,从而获取对应的值。

monkeyboy_tech的博客 1087

Spark: scala.MatchError (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema

spark scala

chbxw 993

「报错」Spark: scala.MatchError (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema

场景:   多分类 出错代码: /** 词向量映射*/ val hashingTF = new HashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(500). transform(DF_classAndDoc) /** 计算逆向文本频率 */ val idf = new IDF

图特摩斯科技-博客 1万+

Spark如何处理Hive的集合类型?

上一篇中我们介绍了hive中的数据类型,其中一类比较重要的类型即集合类型,主要包括struct、map、array三种。那么我们在spark中处理这三种类型呢?本文就来介绍一下。1、数据...

abcdefg90876的博客 2000

spark 使用java如何定义返回类型,如何使用Spark UDF返回复杂类型

Hello and thank you in advance.My program is written in java and i can not move to scala.I am currently working with a spark DataFrame extracted from a json file using the following line:DataFrame dff...

weixin_34093995的博客 408

Spark报错ClassCastException:BigInteger无法转Long的排查与修复

在大数据处理中,Java泛型擦除机制让集合元素的真实类型在运行期难以被编译器感知。当Spark的JavaRDD声明为Long却混入BigInteger对象时,JVM在执行lambda聚合前会插入checkcast指令,于是抛出了常见的ClassCastException。这种异常看似神秘,实则源于数据链路中类型契约的破坏,比如Decimal列在Catalyst内部被物化成BigInteger,或跨语言边界丢失泛型信息。掌握从堆栈判断阶段、打印真实类型到回溯数据源schema的定位方法,能够快速锁定问题源头。

weixin_29058331的博客 206

scala之Tuple 元组

Tuple 元组 与列表一样,元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素。 元组的值是通过将单个的值包含在圆括号中构成的。例如: ...

Winyar的博客 304
上一篇: Spark中RDD的创建与存储
下一篇: Spark Streaming 中的DStream
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值