【问题标题】:How to write an UDF in Spark to map indexes to string labels?如何在 Spark 中编写 UDF 以将索引映射到字符串标签?
【发布时间】:2019-11-01 02:05:28
【问题描述】:

我正在使用 Spark,并且在名为 predictions 的列之一中有一个具有特定字符串格式的表。格式始终为 - 0=some_probability,1=some_other_probability,2=some_other_probability 类型。

以下是该表中的一些示例记录 -

val table1 = Seq(
("0=0.5,1=0.3,2=0.2"),
("0=0.6,1=0.2,2=0.2"),
("0=0.1,1=0.1,2=0.8")
).toDF("predictions")

table1.show(false)
+-----------------+
|predictions      |
+-----------------+
|0=0.5,1=0.3,2=0.2|
|0=0.6,1=0.2,2=0.2|
|0=0.1,1=0.1,2=0.8|
+-----------------+

现在,我还有关于每个索引的元数据信息 - 0,1,2...n 在单独的字符串中。元数据字符串看起来像 -

val metadata = "AA::BB::CC"

我想在 Scala 中编写一个 UDF 来将这些索引映射到字符串中的每个元素。该 UDF 的输出应该给我一个看起来像这样的新列 -

+--------------------+
|labelled_predictions|      
+--------------------+
|AA=0.5,BB=0.3,CC=0.2|
|AA=0.6,BB=0.2,CC=0.2|
|AA=0.1,BB=0.1,CC=0.8|
+--------------------+

所以,0AA 替换,因为AAmetadata 字符串中始终被:: 分割的第一个元素。

如何在 Scala-Spark 中编写 UDF 来做到这一点?

【问题讨论】:

  • 您使用的是哪个 Spark 版本?没有 UDF 的潜在解决方案对您有用吗?

标签: scala apache-spark


【解决方案1】:

val metadata = "AA::BB::CC"

根据给定的数据,这应该适合您:

def myUDF(metadata:String) = udf((s: String) => {
  val metadataSplit = metadata.split("::")
  val dataSplit = s.split(",")
  val output = new Array[String](dataSplit.size)
  for (i <- 0 until dataSplit.size) {
    output(i) = metadataSplit(i) + "=" + dataSplit(i).split("=")(1)
  }
  output.mkString(",")
})
table1.withColumn("labelled_predictions", myUDF(metadata)(col("predictions"))).select("labelled_predictions").show(false)

输出:

+--------------------+
|labelled_predictions|
+--------------------+
|AA=0.5,BB=0.3,CC=0.2|
|AA=0.6,BB=0.2,CC=0.2|
|AA=0.1,BB=0.1,CC=0.8|
+--------------------+

【讨论】:

  • 谢谢,那行得通。我正在创建一个 UDF 来接受 2 个参数而不是 1 个。第一个参数是预测字符串,第二个参数是元数据本身。如何使用 lit() 函数将元数据作为参数添加到 UDF?
  • 我已经更新了我的答案。您可以使用currying函数来添加参数。
猜你喜欢
  • 2017-09-09
  • 2017-07-06
  • 2014-10-01
  • 2021-12-25
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多