机器数据分析平台

  • 机器数据分析平台 > 产品手册 > SPL参考手册 > eval

    eval

    最近更新时间:2019-11-07 15:03:44

    eval 命令计算表达式并将结果加入搜索结果中。

    语法:

    eval <field>=<expression>["," <field>=<expression>]...

    参数说明

    field:通过计算表达式⽣成的计算值的⽬标字段名称。如果字段名称已经存在于您的数据,eval 将覆盖该值.

    expression:计算表达式。

    • eval 语句的计算结果不允许是布尔型,否则 eval 会清除结果字段。
    • 若表达式引⽤了名称包含⾮字⺟、数字字符的字段,需要⽤单引号将字段名称括起。例如,若字段名称为
      server-1,您可以将字段名称指定为 new=count+'server-1'。
    • 若表达式引⽤了⽂本字符串,需要⽤双引号将⽂本字符串引起来。例如,若您要使⽤的字符串为 server-,您
      可以将其指定为 new="server-".host
    • 如果表达式中引用了现有字段的值作为新字段(目标字段)的名称,并将另一个字段的值赋给该字段(目标字段)。需用{}将现有字段名称括起来。如下数据:
    name value
    a 100

    表达式 eval {name}=value 返回

    a
    100

    您可在⼀个搜索中使⽤逗号将多个 eval 表达式链接起来。该搜索从前⾄后处理多个 eval 表达式,并允许您在后续表达式中引⽤之前已计算过的字段。

    ... | eval full_name = first_name + last_name, low_name = lower(full_name)
    

    eval 和 stats 的区别:

    stats 命令计算字段的统计信息。eval 命令使⽤现有字段和任意表达式新建字段(或覆盖现有字段)。

    eval 命令支持的函数

    数学函数

    函数 描述 示例
    pi() 计算圆周率 eval pi=pi()
    abs(X) 计算绝对值 eval v=abs(a-1)
    ceil(X),ceiling(X) 向上取整 eval v=ceil(a)
    floor(X) 向下取整 eval v=floor(a)
    exp(X) 计算e的X次方 eval v=exp(a)
    ln(X) 计算以e为底X的对数 eval v=ln(a)
    sqrt(X) 计算X的开平方 eval v=sqrt(a)
    pow(X,Y) 计算X的Y次方 eval v=pow(a, 2)
    round(X) 将X四舍五入到整数 eval v=round(a)
    round(X,N) 为X保留N位小数 eval v=round(a, 4)
    log(X) 计算以10位底,X的对数 eval v=log(a)
    log(X,Y) 计算以Y为底数,X的对数 eval v=log(a, 2)
    hypot(X,Y) 计算以X,Y为直角边的直角三角形的斜边长度 eval v=hypot(3, 4)
    acos(X) 计算反余弦函数,返回值在[0,pi]的弧(radians)区间内 eval v=acos(a)
    asin(X) 计算反正弦函数,返回值在[-pi/2, pi/2]的弧区间内 eval v=asin(a)
    atan(X) 计算反正切函数,返回值在[-pi/2, pi/2]的弧区间内 eval v=atan(a)
    acosh(X) 计算反双曲余弦函数,返回值单位为弧 eval v=acosh(a)
    asinh(X) 计算反双曲正弦函数,返回值单位为弧 eval v=asinh(a)
    atanh(X) 计算反双曲正切函数,返回值单位为弧 eval v=atanh(a)
    sin(X) 计算正弦函数 eval v=sin(a)
    cos(X) 计算余弦函数 eval v=cos(a)
    tan(X) 计算正切函数 eval v=tan(a)
    sinh(X) 计算双曲正弦函数 eval v=sinh(a)
    cosh(X) 计算双曲余弦函数 eval v=cosh(a)
    tanh(X) 计算双曲正切函数 eval v=tanh(a)

    时间函数

    函数 描述 示例
    year(X, ZoneOffset) 取给定时间的年份
    第1个参数为Unix epoch timestamp [13位,毫秒级时间戳];同时该函数具备一定的时间日期解析功能,对于"2019-08-01T07:30:45.123+0800"的日期时间格式(ISO 8601),可以直接解析,也可作为第1个参数。
    第2个参数(可选)为表示时区的整数,e.g. 8表示东八区,-7表示西七区。
    eval v=year(_time, 7)
    month(X, ZoneOffset) 取给定时间的月份
    参数同 year 函数
    eval v=month(_time)
    day(X, ZoneOffset) 取给定时间在当前月份的第几天
    参数同year函数
    eval v=day(_time)
    week(X, ZoneOffset) 取给定时间的在当前年的第几周
    参数规格同year函数
    eval v=week(_time)
    hour(X, ZoneOffset) 取给定时间的小时
    参数同year函数
    eval v=hour(_time)
    minute(X, ZoneOffset) 取给定时间的分钟
    参数同year函数
    eval v=minute(_time)
    second(X, ZoneOffset) 取给定时间的秒数
    参数同year函数
    eval v=second(_time)
    isWeekday(X, ZoneOffset) 判断当天是否是工作日,返回bool结果
    参数同year函数
    eval v=isWeekday(_time)
    isWeekend(X, ZoneOffset) 判断当前是否是周末参数同year函数 eval v=isWeekend(_time)
    datediff(X, Y, TimeUnit) 计算时间差,接受2个或3个参数
    参数1和参数2既可以是13位的毫秒级时间戳也可以是形如"2019-08-01"的ISO 8601日期时间格式的字符串
    参数3(可选),用于指定函数计算结果的时间单位。可选值有(注:使用双引号而非单引号):"s", "m", "h", "d". 若没有指定该参数,则返回值是毫秒级的时间差。
    eval v=datediff(time1, time2)
    nextWeekday(X, Y, ZoneOffset) 返回下个工作日的时间,接受1~3个参数
    参数1既可以是13位的毫秒级时间戳也可以是形如"2019-08-01"的ISO 8601日期时间格式的字符串
    参数2(可选),表示从参数1的日期算起,第Y个工作日
    参数3(可选),表示时区的整数,e.g. 8表示东八区,-7表示西七区。
    eval t=nextWeekday(_time)
    now 返回当前的毫秒精度时间戳 eval n=now()

    转换函数

    函数 描述 示例
    printf("format",arguments) 采用c风格的方式格式化字符串 eval s=printf("%04.4f, %5s", field1, field2)
    toNumber(X,BASE) 将字符串按照指定进制,转换成10进制数字,如eval("1000", 2),对应结果为8
    第1个参数应为含有数值的字符串,e.g. "1000", "3.1415"。如果第1个参数是个double字符串,那么返回该double数值
    第2个参数(可选),为表示进位制基数的数值。toNumber函数将以该进制解析第1个参数中的整数,将其转换成易读的十进制形式。若给参数未被传递,则默认为10
    eval n=toNumber("1000")
    toString(X) 将数值或 Bool 值转化成字符串 eval s=toString(a)
    toReadableTime(X, TIMEFORMAT, ZoneOffset) 将Unix epoch时间戳转换成可读的形式
    第1个参数是Unix epoch 时间戳(支持秒级[10位]、毫秒级[13位]、微秒级[16位]、纳秒级[19位]的时间戳)
    第2个参数(可选),TIMEFORMAT 为时间格式字符串,用来指定转换后所期望的时间格式,若没有该参数,则默认按照形如"2019-08-06T17:56:55+08:00"的格式(ISO 8601)显示
    第3个参数(可选),用于补充该时间戳的时区信息,应传入表示时区的整数,e.g. 8表示东八区,-7表示西七区。由于时间戳本身不包含时区信息,因此理论上需要补充时区信息之后才能转换成可读形式。若无该参数,则默认为东八区。
    eval t=toReadableTime(_time)
    toTimestamp(X, TIMEFORMAT, ZoneOffset) 和toReadableTime作用相反,将时间字符串按照TIMEFORMAT解析为毫秒精度时间戳。参数形式也与toReadableTime相对称
    第1个参数,日期时间字符串
    第2个参数,指定日期时间字符串的解析格式
    第3个参数(可选),指定时区,e.g. 8表示东八区,-7表示西七区。默认为东八区。若日期时间字符串中已有时区信息,并且解析格式要求解析时区,与此同时,如若指定了第3个参数,那么仍以日期时间字符串中的时区为准
    当解析出的结果中缺少年份信息时,则自动补上默认时区或第3个参数指定时区的当前年份,再转换成Unix epoch时间戳
    当缺少日期信息时,则自动补上默认时区或第3个参数指定时区的日期,再转换成时间戳
    若缺少时分秒信息,则自动补上00:00:00,再转换成时间戳。
    eval t=toTimestamp("2019-03-10", "yyyy-MM-dd")

    条件函数

    函数 描述 示例
    if(X, V1, V2) 如果X为true,则返回V1, 如果为false则返回V2。 eval err=if(status==200, "OK", "Error")
    case(X1, Y1, X2, Y2 ..., Default) 分支条件函数,如果X1为true,则返回Y1,如果X1为false,则判断X2是否为true,如果为true,则返回Y2,以此类推,如果所有分支都不满足,则返回Default eval description=case(status==200, "OK", status==404, "Not Found", "Error")
    contains(X, STRING) 判断字符串X是否包含字符串STRING eval contains=contains(_raw, "aaa")
    match(X, Pattern) 判断字符串X是否匹配正则表达式Pattern eval is_IP=match(f0, "^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$")
    like(X, Like) 判断字符串X是否匹配Like模式,类似于SQL中的like子句 eval is_png=like(f6, "%png")
    in(X, Y1 ...) 判断X值在(Y1, Y2...)集合中 eval error=if(in(status, "404", "500", "503"), "true", "false")
    isNull(X) 判断字段是否存在 eval existed=isNull(f100)
    isNotNull(X) <判断字段是否存在 eval existed=isNotNull(f100)

    字符串处理函数

    函数 描述 示例
    len(X) 返回字符串长度 eval l=len(_raw)
    lower(X) 将字符串转为小写 eval l=lower(_raw)
    upper(X) 将字符串转为大写 eval l=upper(_raw)
    trim(X) 将字符串前后的空白去除 eval s=trim(_raw)
    urldecode(X) URL解码 eval decodedURL=urldecode("https%3A%2F%2Fwww.google.com.hk%2F")
    substr(X, from, length) 计算字符串的子串
    第2个参数,from从1计起,指定子串的起始位置。可以是负数,e.g. -4表示倒数第4个字符。若from==0,其效果等同于from==1
    第3个参数(可选),length是子串长度。若未填写该参数,则默认一直截取到末尾。
    eval s=substr(_raw, 1, len(_raw)-1)
    replace(X, origin, targe) 将X字段中的原始文本替换成目标文本。参数2和参数3可以使用正则表达式 eval r=replace("08/01/2019", "(\d{1,2})/(\d{1,2})/", "$2/$1/")
    concat(X, Y, .....) 将多个字符串连接到一起,至少接收两个参数 eval c=concat("my host is: ", host)
    contains(X, Y) 计算字符串的X是否包含另一个字符串Y eval a=contains(_raw, "keyword")

    加密函数

    函数 描述 示例
    md5(X) 计算文本md5值 eval value=md5("Phoenix")
    sha1(X) 计算文本sha1值 eval value=sha1("Phoenix")
    sha256(X) 计算文本sha256值 eval value=sha256("Phoenix")
    sha512(X) 计算文本sha512值 eval value=sha512("Phoenix")

    eval 命令支持的运算符

    类型 运算符 示例
    逻辑运算 AND OR NOT eval v=(a>1 AND b<2)
    比较运算 < <= = > >= eval v=(a>=b)
    算术 + - * / () eval v=(a+3)*b

    说明:
    1.运算符 ( + ) 可以对两个数值进行加法运算,或对两个字符串进⾏连接。
    2.运算符 <>、<=、!= 和 == 接受两个数字或两个字符串为参数。

    eval 使用示例

    原始日志如下:

    name grade
    John grade=86
    May grade=90
    Billy 45
    Alice 70
    Joey 95

    需求:根据分数<60为不及格,分数<90为良好,分数>90为优秀的标准统计出每个成绩对应的级别,并计算每个成绩级别的平均值、最大值、最小值。

    eval level=case(grade<=60, "failed", grade>60 AND grade<=90, "good", grade>90,
    "excellent") | stats avg(grade),min(grade),max(grade) by Description

    返回结果如下:

    level avg(grade) min(grade) max(grade)
    failed 45 45 45
    good 78 70 86
    excellent 92.5 90 95
    以上内容是否对您有帮助?
  • Icon helper
    Icon free helper
    Close