admin管理员组

文章数量:1130349

关于org.apache.spark.sql.Row

关于org.apache.spark.sql.Row

      • 前言
      • 构造Row
      • 解析Row的值
      • 按索引进行字段访问 —— apply和get方法
      • 指定类型来获取字段 —— getAs方法
      • Row与Schema
      • Row与匹配模式
      • 参考资料

前言

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 = 1val 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 = helloscala> row.get(1)
res1: Any = hello

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

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

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

val row = Row(1, "hello")scala> row.getAs[Int](0)
res1: Int = 1scala> 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

关于org.apache.spark.sql.Row

关于org.apache.spark.sql.Row

      • 前言
      • 构造Row
      • 解析Row的值
      • 按索引进行字段访问 —— apply和get方法
      • 指定类型来获取字段 —— getAs方法
      • Row与Schema
      • Row与匹配模式
      • 参考资料

前言

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 = 1val 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 = helloscala> row.get(1)
res1: Any = hello

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

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

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

val row = Row(1, "hello")scala> row.getAs[Int](0)
res1: Int = 1scala> 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

本文标签: 关于orgapachesparksqlRow