从Spark Row 到 GenericRowWithSchema_spark genericrowwithschema-程序员宅基地

技术标签: GenericRowWithSchema  Spark  Spark Row  

 

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Code_LT/article/details/87719115

智能推荐

Python获取Cookie时遇到重定向的情况_python爬虫获取重定向返回的cookie-程序员宅基地

文章浏览阅读5k次,点赞6次,收藏15次。问题描述和解决:在模拟登录教务处的时候,需要通过获取cookie来进行后面一系列操作。但是刚开始,python模拟登录一直失败,提示的没权限。通过网页抓包分析,最后看到每次输入地址进行登录时候,会发生302重定向,重定向后的地址和原来一样,但是会在地址后面传入一段随机值。通过Burpsuite抓包查看每次登录请求头部信息,提交的Cookie有两个字段。在以前的时候一直是 :Cookie: ..._python爬虫获取重定向返回的cookie

JavaScript日常练习:二维数组转置、冒泡排序、插入排序、模板:省份城市的三级联动_js二维数组转置两种方法-程序员宅基地

文章浏览阅读615次,点赞2次,收藏2次。1.二维数组转置:如:转置前arr[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’],[‘g’,‘h’,‘i’],[‘j’,‘k’,‘l’],]转置后res[[‘a’,‘d’,‘g’,‘j’],[‘b’,‘e’,‘h’,‘k’],[‘c’,‘f’,‘i’,‘l’],]我们得出规律:res[i][j]=arr[i][j],且res数组长度=arr元素长度,res元素..._js二维数组转置两种方法

OpenGLES:GLSurfaceView实现Android Camera预览_android opengles-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏14次。本篇博文主题:使用OpenGLES和GLSurfaceView实现在Android相机预览_android opengles

Mysql 查找乱码数据_mysql乱码数据如何快速查找分类-程序员宅基地

文章浏览阅读2.6k次。线上课程名称出现乱码数据,或者是"???"或者是类似 “ä¿èº«æ˜¯ä¸­å›½ä¼ 统政æ”完全摸不着头脑的,想要先做一次数据修复,但是课程表有2,3万的数据,一条条看下来有没有乱码,还是很费时的。想通过sql来筛选出这些数据,可以借助sql的编码转换函数convert,使用latin1字符集来区分正常的和非正常的。SELECT Id,Title FROM Course WHE_mysql乱码数据如何快速查找分类

opa847方波放大电路_积分电路的原理解析和电路调试-程序员宅基地

文章浏览阅读6.9k次,点赞3次,收藏24次。积分电路是模拟电路的重要电路之一,主要用于波形变换、放大电路失调电压的消除及反馈控制中的积分补偿等场合。教科书在讲解积分电路时都是用高等数学的积分公式来表述,当ui在一段时间内是一个负向的阶跃电压时,在理想的条件下,与之对应的输出电压变化表现为一个恒流源向C电容充电,如图1所示。R1 C1称为积分时间常数。 图 1这些表述很经典,但高职学生高数学得比..._方波积分电路

Android性能优化(一)—— 启动优化,冷启动,热启动,温启动_温启动优化-程序员宅基地

文章浏览阅读5.3k次,点赞10次,收藏26次。标签 : Android架构师之路APP启动方式App启动方式分三种:冷启动(cold start)、热启动(hot start)、温启动(warm start)▲ 冷启动系统不存在App进程(APP首次启动或APP被完全杀死)时启动APP此时,APP的启动将经历两个阶段:第一阶段1.加载并启动app;2.app启动后,第一时间为app显示一个空白的window;3.创建app进程第二阶段系统一旦创建了app进程,app进程就要负责做以下的任务:1.创建app对象;2_温启动优化

随便推点

云原生API网关 - 开源项目Hango网关设计与实践-程序员宅基地

文章浏览阅读2k次。解读开源Hango网关的云原生设计与实践,本文先从云原生溯源,解读云原生API网关选型特点;再进一步解读网易数帆开源Hango云原生API网关设计及大规模落地实践。云原生溯源什么是云原生C..._hango网关

改变input提示颜色_vue input 提示音颜色-程序员宅基地

文章浏览阅读191次。input:focus::-webkit-input-placeholder{color:#9b989b}改变input提示颜色input__control:placeholder-shown:not(:focus)+.ppvx_text-input__label{top:.6875rem;font-size:1rem;background-color:transparent}占位符-如图所示_vue input 提示音颜色

python中字符串逆序的编写_请编写一个C函数,将一个字符串逆序-程序员宅基地

文章浏览阅读720次。目前有两种思路,一个是申请一片辅助空间,然后将原字符串逆向拷贝到辅助空间,然后输出;另一种是原地逆序,不需要额外的辅助空间,方法就是字符串首尾交换。#include #include char* str_reverse(char* str){int n = strlen(str) / 2;int i = 0;char tmp = 0;for(i = 0; i < n; i++){tmp =..._给定一个字符串s,编写一个python函数,将字符串中的每个字符按照ascii码值逆序输出

Enfocus PitStop Pro 2019(PDF增强插件)-程序员宅基地

文章浏览阅读1.4w次。Enfocus PitStop Pro 2019 for Mac是一款安装在Adobe Acrobat中使用的PDF增强插件,pitstop 2019破解版具备PDF质量控制、PDF自动更正、PDF编辑等功能,它会自动检测PDF文件的错误,并进行自行修复,非常的实用,为大家提供pitstop2019破解版,赶紧试试吧!PitStop Pro 2019 mac破解教程PitStop Pr..._enfocus pitstop pro 2019

postman测试是否支持跨域_postman测试通过 axios还是报跨域问题【已解决】-程序员宅基地

文章浏览阅读3.1k次。问题调用接口报错误:Access to XMLHttpRequest at ‘http://xxxx/api/Order/OrderList’ from origin ‘http://xxx.xx.xx.xx:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on th..._postman解决跨域问题

解决SecureCRT(linux远程访问工具)中中文乱码问题_securecrt中文乱码怎么办-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏12次。一般情况下,服务器都在远地机房,维护linux系统都不是在本地,所以我们都是通过远程访问工具来操作、维护Linux系统的,我自己是安装了SecureCRT这款软件,但其实远程访问工具有很多,选择一个自己比较上手就ok。 解决SecureCRT中文乱码的方法如下: 首先点开选项—>会话选项 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2..._securecrt中文乱码怎么办

推荐文章

热门文章

相关标签