ADX中Base36与Base10互转:内置函数查询及自定义函数调用问题
问题解答
1. ADX是否提供Base36与Base10互相转换的内置函数?
ADX目前没有提供Base36与Base10直接互相转换的内置函数,这类转换需要通过自定义函数实现。
2. 自定义函数无法在extend中调用的解决办法
你的自定义函数返回的是表格型结果(通过range生成表格后用summarize聚合),而extend语句需要的是标量值,因此会触发语义错误。需要将函数修改为标量函数,避免使用表格型操作,改用标量字符串/数组处理逻辑。
修改后的标量函数代码
.create-or-alter function with (folder = "utils", docstring = "将Base36后缀的VM名称转换为带Base10后缀的格式(xxx-xxx-vmss000001 -> xxx-xxx-vmss_1)", skipvalidation = "true") convert_to_base10(node:string) { let suffix_len = 6; // 提取Base36后缀(最后6位) let base36_suffix = substring(node, strlen(node) - suffix_len, suffix_len); // 提取VM前缀(到vmss结尾) let prefix = substring(node, 0, indexof(node, 'vmss') + 4); // Base36字符到数值的映射 let char_map = dynamic({'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9, 'a':10,'b':11,'c':12,'d':13,'e':14,'f':15,'g':16,'h':17,'i':18,'j':19, 'k':20,'l':21,'m':22,'n':23,'o':24,'p':25,'q':26,'r':27,'s':28,'t':29, 'u':30,'v':31,'w':32,'x':33,'y':34,'z':35}); // 反转后缀字符串,方便按位计算权重 let reversed_suffix = reverse(base36_suffix); // 计算每个字符的权重并求和 let base10_value = array_sum(array_map(range(0, strlen(reversed_suffix)-1, 1), (i) => tolong(char_map[tostring(substring(reversed_suffix, i, 1))]) * pow(36, i) )); // 拼接前缀和转换后的Base10数值 strcat(prefix, '_', tostring(base10_value)) }
使用示例
修改后即可在extend语句中直接调用:
// 假设存在包含VM名称的表格 VMs | extend converted_name = convert_to_base10(vm_name)
内容的提问来源于stack exchange,提问作者A. Scobie
相关产品推荐
相关产品推荐

