[Scala] 关于org.apache.spark.sql.Row

本文深入探讨了Apache Spark SQL中的Row对象,详细介绍了如何在Scala中创建Row对象,包括使用RowFactory.create()、Row.apply()、Row.fromSeq()和Row.fromTuple()方法。此外,还解释了如何通过索引、字段名或模式匹配来访问Row对象中的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

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

构造Row

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

import org.apache.spark.sql.Row

// Create a Row from values.
scala> Row(1, "hello")
res0: org.apache.spark.sql.Row = [1,hello]

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

// Created a Row from a Seq of values.
scala> Row.fromSeq(Seq(1, "hello"))
res1: org.apache.spark.sql.Row = [1,hello]

// Created a Row from a Tuple of values.
scala> Row.fromTuple((0, "hello"))
res2: org.apache.spark.sql.Row = [0,hello]

解析Row值

一般来说,我们可以通过索引(generic access by ordinal)的通用访问来访问Row值

import org.apache.spark.sql.Row

scala> val row = Row(1, true, "a string", null)
row: org.apache.spark.sql.Row = [1,true,a string,null]

// by index
scala> val firstValue = row(0)
firstValue: Any = 1

scala> val fourthValue = row(3)
fourthValue: Any = null

// by get
scala> val firstValue = row.get(0)
firstValue: Any = 1

scala> val fourthValue = row.get(3)
fourthValue: Any = null

// by apply
scala> val firstValue = row.apply(0)
firstValue: Any = 1

scala> val fourthValue = row.apply(3)
fourthValue: Any = null

按顺序进行的通用访问(使用索引、apply或get)返回Any类型的值。可以使用带索引的getAs查询具有适当类型的字段。

val row = Row(1, "hello")

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

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

Row与模式匹配

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

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

参考资料

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值