scala中数组项的索引

scala中数组项的索引,scala,apache-spark,Scala,Apache Spark,我有一个带有数组列的表,如下所示: +-Name-+ array 0: {"given_name":"B. A.", "surname":"Name1"} 1: {"given_name":"A.", "surname":"Name2"} 2: {"given_name":"C." "surname":"Name3"} 我想在数组中再添加一个以1开头的元素项“index”,以查找作者的序列,如 +-Name-+ array 0: {"given_name":"B. A.",

我有一个带有数组列的表,如下所示:

+-Name-+
 array
  0: {"given_name":"B. A.", "surname":"Name1"}
  1: {"given_name":"A.", "surname":"Name2"}
  2: {"given_name":"C." "surname":"Name3"}
我想在数组中再添加一个以1开头的元素项“index”,以查找作者的序列,如

+-Name-+
array
  0: {"given_name":"B. A.", "surname":"Name1", "index":"1"}
  1: {"given_name":"A.", "surname":"Name2", "index":"2"}
  2: {"given_name":"C." "surname":"Name3", "index":"3"}

如何在Scala中实现这一点,我们非常感谢您的帮助。

下面是一种使用UDF的方法,它将数组类型列的每个元素映射到元素索引中:

import org.apache.spark.sql.Row
import org.apache.spark.sql.functions._
import spark.implicits._

case class Name(given_name: String, surname: String)
case class NameIdx(given_name: String, surname: String, index: Int)

val df = Seq(
  Seq(Name("John", "Doe"), Name("Jane", "Smith"), Name("Mike", "Davis")),
  Seq(Name("Rachel", "Smith"), Name("Steve", "Thompson"))
).toDF("name")

val addIndex = udf((names: Seq[Row]) => names.map{
  case name @ Row(gn: String, sn: String) => NameIdx(gn, sn, names.indexOf(name) + 1)
})

df.select(addIndex($"name").as("name")).show(false)
// +----------------------------------------------+
// |name                                          |
// +----------------------------------------------+
// |[[John,Doe,1], [Jane,Smith,2], [Mike,Davis,3]]|
// |[[Rachel,Smith,1], [Steve,Thompson,2]]        |
// +----------------------------------------------+
要生成JSON值,请将
应用于\u JSON
,如下所示:

df.select(to_json(addIndex($"name")).as("name")).show(false)
// +-----------------------------------------------------------------------------------------------------------------------------------------------------+
// |name                                                                                                                                                 |
// +-----------------------------------------------------------------------------------------------------------------------------------------------------+
// |[{"given_name":"John","surname":"Doe","index":1},{"given_name":"Jane","surname":"Smith","index":2},{"given_name":"Mike","surname":"Davis","index":3}]|
// |[{"given_name":"Rachel","surname":"Smith","index":1},{"given_name":"Steve","surname":"Thompson","index":2}]                                          |
// +-----------------------------------------------------------------------------------------------------------------------------------------------------+

Hi@Leo,它正在数组中添加索引值,但是数组项应该有一个类似于//+--------------------------------------------------------------+//| name |/+---------------------------------------------------------------------------------------+/-[[给定名称:John,姓氏:Doe,索引:1],[给定名称:Jane,姓氏:Smith,索引:2],[给定名称:Mike,姓氏:Davis,索引:3]]|//+------------------------------------------------------------+@VSr,如果您想要JSON值而不是
struct
s的数组,只需将
应用于\u JSON
,如展开的答案所示。您好@Leo,我得到的原因是:scala.MatchError:[Jane,null](类org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema)输入中有空值时出错。并获取错误:“:”应为,但找到了标识符。当我在项目标签中有“-”时,例如:“给定名称”如何处理?