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
版权声明:本文标题:关于org.apache.spark.sql.Row 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://it.en369.cn/IT/1694645114a254448.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论