关于org.apache.spark.sql.Row
程序员文章站
2022-07-13 17:07:33
...
关于org.apache.spark.sql.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 = 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
}
参考资料
上一篇: 微信、支付宝支付