计算`Spark Dataframe的连续行上的编辑距离-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

计算`Spark Dataframe的连续行上的编辑距离

2018-12-12 15:05:54 2405 1

我有一个数据框如下:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.Column
import org.apache.spark.sql.functions._
import spark.implicits._

// some data...
val df = Seq(
(1, "AA", "BB", ("AA", "BB")),
(2, "AA", "BB", ("AA", "BB")),
(3, "AB", "BB", ("AB", "BB"))
).toDF("id","name", "surname", "array")

df.show()
我期待计算连续行中“数组”列之间的编辑距离。作为示例,我想计算第1列(“AA”,“BB”)中的“数组”实体与第2列(“AA”,“BB”)中的“数组”实体之间的编辑距离。这是我正在使用的编辑距离函数:

def editDist2A: Int = {
val startRow = (0 to b.size).toList
a.foldLeft(startRow) { (prevRow, aElem) =>

(prevRow.zip(prevRow.tail).zip(b)).scanLeft(prevRow.head + 1) {
  case (left, ((diag, up), bElem)) => {
    val aGapScore = up + 1
    val bGapScore = left + 1
    val matchScore = diag + (if (aElem == bElem) 0 else 1)
    List(aGapScore, bGapScore, matchScore).min
  }
}

}.last
}
我知道我需要为这个函数创建一个UDF,但似乎无法做到。如果我按原样使用该函数并使用Spark Windowing来获取前一行:

// creating window - ordered by ID
val window = Window.orderBy("id")

// using the window with lag function to compare to previous value in each column
df.withColumn("edit-d", editDist2(($"array"), lag("array", 1).over(window))).show()
我收到以下错误:

:245: error: type mismatch;
found : org.apache.spark.sql.ColumnName
required: Iterable[?]

   df.withColumn("edit-d", editDist2(($"array"), lag("array", 1).over(window))).show()
取消 提交回答
全部回答(1)
  • 社区小助手
    2019-07-17 23:20:13

    可以使用Spark自己的levenshtein功能。此函数需要两个字符串进行比较,因此不能与数组一起使用。

    // creating window - ordered by ID
    val window = Window.orderBy("id")

    // using the window with lag function to compare to previous value in each column
    df.withColumn("edit-d", levenshtein(($"name"), lag("name", 1).over(window)) + levenshtein(($"surname"), lag("surname", 1).over(window))).show()
    给出所需的输出:

    idnamesurnamearrayedit-d
    1AABB[AA, BB]null
    2AABB[AA, BB]0
    3ABBB[AB, BB]1
    0 0
相关问答

1

回答

Spark RDD是具体怎么容错的,基本原理是什么?

2021-12-13 19:38:34 4154浏览量 回答数 1

1

回答

spark当中的 RDD具体是什么意思?

2021-12-12 20:58:42 392浏览量 回答数 1

1

回答

spark中RDD的特点有哪些?

2021-12-10 13:13:54 156浏览量 回答数 1

1

回答

Spark中的获取RDD的方法有什么?

2021-12-10 14:06:29 208浏览量 回答数 1

1

回答

spark中RDD产生的背景是什么?

2021-12-10 13:11:37 147浏览量 回答数 1

1

回答

Spark RDD是怎么容错的,基本原理是什么?

2021-12-08 21:16:08 94浏览量 回答数 1

1

回答

spark 中对多次使用的RDD进行持久化应该怎么做最好?

2021-12-07 20:29:04 101浏览量 回答数 1

1

回答

spark中避免创建重复的RDD该怎么做?

2021-12-07 20:27:51 93浏览量 回答数 1

1

回答

Spark和RDD的关系是怎样的?

2021-12-06 20:40:40 242浏览量 回答数 1

1

回答

spark中的RDD的特性是什么?

2021-12-07 06:48:49 286浏览量 回答数 1
+关注
社区小助手
社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。
12
文章
824
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载