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 = 1val fourthValue = row(3)// fourthValue: Any = nullval firstValue = row.getInt(0)// firstValue: Int = 1val 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.lengthoverride 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

从Spark Row 到 GenericRowWithSchema相关推荐

  1. Spark Row对象入门到熟悉

    简单实用举例 // Create a Row from values. //可以直接创建row对象private val row: Row = Row("a", "b&q ...

  2. Spark读写XML文件及注意事项

    最近有粉丝问浪尖spark 如何读写xml格式的文件,尤其是嵌套型的,spark本身是不支持xml格式文件读取的,但是databricks开源了一个jar,支持xml文件的读写,浪尖这里给大家介绍一下 ...

  3. Spark初步 从wordcount开始

    Spark初步-从wordcount开始 spark中自带的example,有一个wordcount例子,我们逐步分析wordcount代码,开始我们的spark之旅. 准备工作 把README.md ...

  4. Spark-SQL性能极致优化: Native Codegen Framework

    EMR团队探索并开发了SparkSQL Native Codegen框架,为SparkSQL换了引擎,新引擎带来最高4倍性能提升,为EMR再次获取世界第一立下汗马功劳.来自阿里云EMR团队的周克勇将详 ...

  5. Spark:如何替换sc.parallelize(List(item1,item2)).collect().foreach(row={})为并行?

    代码场景: 1)设定的几种数据场景,遍历所有场景:依次统计满足每种场景条件下的数据,并把统计结果存入hive: 2)已有代码如下: case class IndoorOTTCalibrateBuild ...

  6. Spark 创建 hive表报错 ROW FORMAT DELIMITED is only compatible with 'textfile', not 'parquet'

    场景: 在spark分析数据时,创建hive表失败. 提示异常 : 19/10/09 10:59:18 INFO execution.SparkSqlParser: Parsing command: ...

  7. Spark创建hive表报错 ROW FORMAT DELIMITED is only compatible with ‘textfile‘, not ‘orc‘

    创建hive表失败: 报错异常信息: Operation not allowed: ROW FORMAT DELIMITED is only compatible with 'textfile', n ...

  8. 【大数据开发】SparkSQL——Spark对接Hive、Row类、SparkSQL函数、UDF函数(用户自定义函数)、UDAF函数、性能调优、SparkSQL解决数据倾斜

    文章目录 一.Spark对接Hive准备工作 1.1 集群文件下载 1.2 导入依赖 1.3 打开集群metastore服务 二.Spark对接Hive 2.1 查询Hive 2.2 读取MySQL中 ...

  9. python中row什么意思_如何在Spark(Python)中订购我的Row对象的字段

    But is there any way to prevent the Row object from ordering them? 只需使用普通元组: rdd = sc.parallelize([( ...

最新文章

  1. form表单只提交数据而不进行页面跳转的解决方案
  2. mysql server5.0使用_sco openserver 5.0.5安装使用mysql4.0.21的方法Windows系统 -电脑资料...
  3. Chrome 双击关闭标签,新窗口打开新地址,一个插件搞定,安装方便,自带hosts
  4. 3578. 最大中位数
  5. 怎么在html显示已登录状态,jQuery Ajax 实现在html页面实时显示用户登录状态
  6. poj 3621 Sightseeing Cows 01分数规划
  7. Android学习笔记---26_网络通信之资讯客户端,使用pull解析器,解析,从网络中获得的自定义xml文件
  8. 辐流式重力浓缩池计算_污泥浓缩池工作方式
  9. python基础之函数式编程
  10. 数据库JDBCUtil 工具类 增加连接池操作
  11. further occurrences of HTTP header parsing errors will be logged at DEBUG level.
  12. android imagebutton的点击事件,Android 点击ImageButton时有“按下”的效果的实现
  13. 手机wap网站制作教程
  14. linux驱动编译成kext,Hackintosh:制作AppleALC以驱动原生AppleHDA
  15. SSM框架使用拦截器和过滤器实现登录的拦截
  16. 如何在MAC上查看系统运行信息、内存使用率等
  17. abc F - Endless Walk
  18. Git版本库深入剖析
  19. python框架支持套接字么_Python的框架比较:Django,金字塔,水瓶,Sanic,旋风,BottlePy等等...
  20. 2023级安全岗面试题及面试经验分享

热门文章

  1. python正则表达式匹配汉字
  2. centos挂载盘到根下_Centos挂载硬盘完整图文教程
  3. 今天TD卡激活了,让我想起当年的笑话“喂喂操”!
  4. python发送多人邮件_【Python3】 发送邮件给多人
  5. AS5600磁角度传感器开发记录
  6. 计算机工作健康危害,电脑对健康的危害有哪些 这些危害勿轻视
  7. 民生银行爆闷雷!利润下滑、不良高企,刘永好的新希望进出频繁
  8. 比较给你看!Pixel 3做出数字变焦与拟光学变焦的差距
  9. Pytorch之permute函数
  10. 欢乐潜水艇洋流计算表