欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于org.apache.spark.sql.Row

程序员文章站 2022-07-13 17:07:33
...

前言

Row表示关系运算符的一行输出。 它是一个通用行对象,具有有序的字段集合,可以通过序数/索引(通过序数进行通用访问,generic access by ordinal)字段名(也称为primitive access)或使用Scala的模式匹配来访问
要创建新Row,请在Java中使用RowFactory.create()或在Scala中使用Row.apply()。

Row也称为Catalyst Row。

构造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, ...))

Row的伴生对象提供工厂方法,可以从元素集合(apply),元素序列(fromSeq)和元组(fromTuple)创建Row实例。

scala> Row(1, "hello")
res0: org.apache.spark.sql.Row = [1,hello]

scala> Row.fromSeq(Seq(1, "hello"))
res1: org.apache.spark.sql.Row = [1,hello]

scala> Row.fromTuple((0, "hello"))
res2: org.apache.spark.sql.Row = [0,hello]

Row对象可以合并Row实例。

scala> Row.merge(Row(1), Row("hello"))
res3: org.apache.spark.sql.Row = [1,hello]

解析Row的值

一般来说,我们可以通过序数的通用访问来访问行的值,即generic access by ordinal

 import org.apache.spark.sql._

 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

而在Scala中,还可以在模式匹配中提取Row对象中的字段。 例子如下:

import org.apache.spark.sql._

val pairs = sql("SELECT key, value FROM src").rdd.map {
   case Row(key: Int, value: String) =>
     key -> value
}

按索引进行字段访问 —— apply和get方法

可以使用apply或get通过索引(从0开始)访问Row实例的字段。

scala> val row = Row(1, "hello")
row: org.apache.spark.sql.Row = [1,hello]

scala> row(1)
res0: Any = hello

scala> row.get(1)
res1: Any = hello

按顺序进行的通用访问(使用apply或get)返回Any类型的值

指定类型来获取字段 —— getAs方法

你可以使用带索引的getAs查询具有适当类型的字段

val row = Row(1, "hello")

scala> row.getAs[Int](0)
res1: Int = 1

scala> row.getAs[String](1)
res2: String = hello

Row与Schema

我们可以为Row实例定义Schema。

除非你自己实例化Row(使用Row Object),否则Row使用同一个Schema。

当数据集上的toDF或通过DataFrameReader实例化DataFrame时,RowEncoder负责为一个Row分配一个schema。

Row与匹配模式

Row可用于模式匹配(因为Row Object附带unapplySeq)。

scala> Row.unapplySeq(Row(1, "hello"))
res5: Some[Seq[Any]] = Some(WrappedArray(1, hello))

Row(1, "hello") match { case Row(key: Int, value: String) =>
  key -> value
}

参考资料

Row (Spark 2.4.3 JavaDoc)
Row · The Internals of Spark SQL

相关标签: Row