【发布时间】:2016-01-30 18:10:25
【问题描述】:
我想知道是否有人知道在 BigQuery 中测量字符串相似度的方法。
似乎拥有一个简洁的功能。
我的情况是我需要比较两个 url 的相似性,以确保它们引用的是同一篇文章。
我可以找到 examples using javascript 所以也许 UDF 是要走的路,但我根本没有使用过 UDF(或者 javascript :))
只是想知道是否有办法使用现有的正则表达式函数,或者是否有人可以让我开始将 javascript 示例移植到 UDF 中。
非常感谢任何帮助,谢谢
编辑:添加一些示例代码
因此,如果我将 UDF 定义为:
// distance function
function levenshteinDistance (row, emit) {
//if (row.inputA.length <= 0 ) {var myresult = row.inputB.length};
if (typeof row.inputA === 'undefined') {var myresult = 1};
if (typeof row.inputB === 'undefined') {var myresult = 1};
//if (row.inputB.length <= 0 ) {var myresult = row.inputA.length};
var myresult = Math.min(
levenshteinDistance(row.inputA.substr(1), row.inputB) + 1,
levenshteinDistance(row.inputB.substr(1), row.inputA) + 1,
levenshteinDistance(row.inputA.substr(1), row.inputB.substr(1)) + (row.inputA[0] !== row.inputB[0] ? 1 : 0)
) + 1;
emit({outputA: myresult})
}
bigquery.defineFunction(
'levenshteinDistance', // Name of the function exported to SQL
['inputA', 'inputB'], // Names of input columns
[{'name': 'outputA', 'type': 'integer'}], // Output schema
levenshteinDistance // Reference to JavaScript UDF
);
// make a test function to test individual parts
function test(row, emit) {
if (row.inputA.length <= 0) { var x = row.inputB.length} else { var x = row.inputA.length};
emit({outputA: x});
}
bigquery.defineFunction(
'test', // Name of the function exported to SQL
['inputA', 'inputB'], // Names of input columns
[{'name': 'outputA', 'type': 'integer'}], // Output schema
test // Reference to JavaScript UDF
);
我尝试使用以下查询进行测试:
SELECT outputA FROM (levenshteinDistance(SELECT "abc" AS inputA, "abd" AS inputB))
我得到错误:
错误:TypeError:无法读取第 11 行第 38-39 列未定义的属性“substr” 错误位置:用户自定义函数
似乎 row.inputA 可能不是字符串,或者由于某种原因字符串函数无法处理它。不确定这是类型问题还是关于 UDF 默认可以使用哪些实用程序的有趣之处。
再次感谢任何帮助,谢谢。
【问题讨论】:
-
能否请您分享至少 5 个示例,以便更好地为您提供正则表达式或 JS 解决方案的建议。
标签: javascript regex google-bigquery udf