当前位置: 首页 > 知识库问答 >
问题:

如何通过levenshtein距离按相似列合并行

戴嘉珍
2023-03-14

我正在使用AWS Athena,我正在尝试合并具有特定列且levenshtein_distance值小于5的所有行,并将归一化百分比相加。

该表的结构如下:

sql prettyprint-override">CREATE EXTERNAL TABLE `actions`(
  `id` string COMMENT 'from deserializer', 
  `text` string COMMENT 'from deserializer',
  `normalizedpercentage` float COMMENT 'from deserializer', 
  `timestamp` timestamp COMMENT 'from deserializer')
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://xxxxxx/db/actions'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'transient_lastDdlTime'='1566991410')
WITH t AS 
    (SELECT id,
         text,
         normalizedPercentage
    FROM actions
    WHERE actions.timestamp
        BETWEEN timestamp '2019-08-01 00:00:01'
            AND timestamp '2019-08-31 23:59:59' )
SELECT *,
         SUM(normalizedPercentage)
    OVER (PARTITION BY levenshtein_distance(text, EVERY_OTHER_TEXT_COLUMN) < 5) AS cumulative
FROM t

共有1个答案

南门嘉
2023-03-14

您可以根据您的函数计算临时表中的新列,然后使用该列在主查询中进行分区

WITH t AS 
(SELECT id,
     text,
     normalizedPercentage,case when  levenshtein_distance(text, EVERY_OTHER_TEXT_COLUMN) < 5 then 'groupA' else 'groupB' end as classification
FROM actions
WHERE actions.timestamp
    BETWEEN timestamp '2019-08-01 00:00:01'
        AND timestamp '2019-08-31 23:59:59' )
   SELECT *,
     SUM(normalizedPercentage)
OVER (PARTITION BY classification ) AS cumulative
FROM t
 类似资料:
  • 我使用Levenshtein算法来查找两个字符串之间的相似性。这是我正在制作的程序的一个非常重要的部分,所以它需要有效。问题是算法没有发现以下示例相似: CONAIR AIRCON 编辑:我还研究了“Damerau-Levenshtein”算法,它增加了换位。问题是这种转换只针对相邻的字符(而不是多个字符)。

  • 问题内容: 在Python + Sqlite中是否有可用的字符串相似性度量,例如与模块有关? 用例示例: 此查询应匹配ID为1的行,但不匹配ID为2的行: 如何在Sqlite + Python中做到这一点? 关于我到目前为止发现的注释: 该Levenshtein距离,即单字符编辑(插入,删除或替换)的最小数量需要改变一个字到另一个,可能是有用的,但我不知道是否SQLite中存在的正式实施(我看到一

  • 问题内容: 我用Java实现了Levenshtein算法,现在可以通过算法进行更正,也就是成本。这确实有一点帮助,但并没有太大帮助,因为我希望将结果表示为百分比。 所以我想知道如何计算那些相似点。 我也想知道你们的人民是如何做的以及为什么。 问题答案: 两个字符串之间的Levenshtein距离定义为将一个字符串转换为另一个字符串所需的最小编辑次数,允许的编辑操作为单个字符的插入,删除或替换。(维

  • 我使用Levenshtein距离算法将作为用户输入提供的公司名称与已知公司名称数据库进行比较,以找到最接近的匹配项。算法本身工作正常,但我想构建一个偏差,这样如果字符串的初始部分匹配,编辑距离就会被认为更低。 例如,如果搜索条件是“ABCD”,那么“ABCD Co.”和“XYX ABCD”具有相同的编辑距离。但是,我想增加一个事实,即第一个字符串的开头部分比第二个字符串更符合搜索条件。

  • 我必须将0到1之间的Levenshtein距离归一化。我看到不同的变化漂浮在所以。 null https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/similary/levenshteIndistance.html