Scala 序号方法调用别名
Scala Ordinal Method Call Aliasing
在 Spark SQL 中,我们有 Row
个对象,其中包含构成一行的记录列表(想想 Seq[Any]
)。 Row
具有序数访问器,例如 .getInt(0)
或 getString(2)
。
说序号 0 = ID 和序号 1 = 姓名。很难记住序数是什么,使代码混乱。
例如我有以下代码
def doStuff(row: Row) = {
//extract some items from the row into a tuple;
(row.getInt(0), row.getString(1)) //tuple of ID, Name
}
问题变成了如何为 Row 对象中的这些字段创建别名?
我想我可以创建采用隐式 Row 对象的方法;
def id(implicit row: Row) = row.getInt(0)
def name(implicit row: Row) = row.getString(1)
然后我可以将上面的重写为;
def doStuff(implicit row: Row) = {
//extract some items from the row into a tuple;
(id, name) //tuple of ID, Name
}
有better/neater方法吗?
您可以隐式地将这些访问器方法添加到行:
implicit class AppRow(r:Row) extends AnyVal {
def id:String = r.getInt(0)
def name:String = r.getString(1)
}
然后将其用作:
def doStuff(row: Row) = {
val value = (row.id, row.name)
}
另一种选择是将 Row
转换为特定领域的案例 class,恕我直言,这会使代码更具可读性:
case class Employee(id: Int, name: String)
val yourRDD: SchemaRDD = ???
val employees: RDD[Employee] = yourRDD.map { row =>
Employee(row.getInt(0), row.getString(1))
}
def doStuff(e: Employee) = {
(e.name, e.id)
}
在 Spark SQL 中,我们有 Row
个对象,其中包含构成一行的记录列表(想想 Seq[Any]
)。 Row
具有序数访问器,例如 .getInt(0)
或 getString(2)
。
说序号 0 = ID 和序号 1 = 姓名。很难记住序数是什么,使代码混乱。
例如我有以下代码
def doStuff(row: Row) = {
//extract some items from the row into a tuple;
(row.getInt(0), row.getString(1)) //tuple of ID, Name
}
问题变成了如何为 Row 对象中的这些字段创建别名?
我想我可以创建采用隐式 Row 对象的方法;
def id(implicit row: Row) = row.getInt(0)
def name(implicit row: Row) = row.getString(1)
然后我可以将上面的重写为;
def doStuff(implicit row: Row) = {
//extract some items from the row into a tuple;
(id, name) //tuple of ID, Name
}
有better/neater方法吗?
您可以隐式地将这些访问器方法添加到行:
implicit class AppRow(r:Row) extends AnyVal {
def id:String = r.getInt(0)
def name:String = r.getString(1)
}
然后将其用作:
def doStuff(row: Row) = {
val value = (row.id, row.name)
}
另一种选择是将 Row
转换为特定领域的案例 class,恕我直言,这会使代码更具可读性:
case class Employee(id: Int, name: String)
val yourRDD: SchemaRDD = ???
val employees: RDD[Employee] = yourRDD.map { row =>
Employee(row.getInt(0), row.getString(1))
}
def doStuff(e: Employee) = {
(e.name, e.id)
}