更新时间:2022-08-17 GMT+08:00

正则表达式分隔半结构化文本

在创建表/文件迁移作业时,对简单CSV格式的文件,CDM可以使用字段分隔符进行字段分隔。但是对于一些复杂的半结构化文本,由于字段值也包含了分隔符,所以无法使用分隔符进行字段分隔,此时可以使用正则表达式分隔。

正则表达式参数在源端作业参数中配置,要求源连接为对象存储或者文件系统,且“文件格式”必须选择“CSV格式”

图1 正则表达式参数
在迁移CSV格式的文件时,CDM支持使用正则表达式分隔字段,并按照解析后的结果写入目的端。正则表达式语法请参考对应的相关资料,这里举例下面几种日志文件的正则表达式的写法:

Log4J日志

  • 日志样例:
    2018-01-11 08:50:59,001 INFO  [org.apache.sqoop.core.SqoopConfiguration.configureClassLoader(SqoopConfiguration.java:251)] Adding jars to current classloader from property: org.apache.sqoop.classpath.extra
  • 正则表达式为:
    ^(\d.*\d) (\w*)  \[(.*)\] (\w.*).*
  • 解析出的结果如下:
    表1 Log4J日志解析结果

    列号

    样值

    1

    2018-01-11 08:50:59,001

    2

    INFO

    3

    org.apache.sqoop.core.SqoopConfiguration.configureClassLoader(SqoopConfiguration.java:251)

    4

    Adding jars to current classloader from property: org.apache.sqoop.classpath.extra

Log4J审计日志

  • 日志样例:
    2018-01-11 08:51:06,156 INFO  [org.apache.sqoop.audit.FileAuditLogger.logAuditEvent(FileAuditLogger.java:61)] user=sqoop.anonymous.user    ip=189.xxx.xxx.75    op=show    obj=version    objId=x
  • 正则表达式为:
    ^(\d.*\d) (\w*)  \[(.*)\] user=(\w.*)    ip=(\w.*)    op=(\w.*)    obj=(\w.*)    objId=(.*).*
  • 解析结果如下:
    表2 Log4J审计日志解析结果

    列号

    样值

    1

    2018-01-11 08:51:06,156

    2

    INFO

    3

    org.apache.sqoop.audit.FileAuditLogger.logAuditEvent(FileAuditLogger.java:61)

    4

    sqoop.anonymous.user

    5

    189.xxx.xxx.75

    6

    show

    7

    version

    8

    x

Tomcat日志

  • 日志样例:
    11-Jan-2018 09:00:06.907 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
  • 正则表达式为:
    ^(\d.*\d) (\w*) \[(.*)\] ([\w\.]*) (\w.*).*
  • 解析结果如下:
    表3 Tomcat日志解析结果

    列号

    样值

    1

    11-Jan-2018 09:00:06.907

    2

    INFO

    3

    main

    4

    org.apache.catalina.startup.VersionLoggerListener.log

    5

    OS Name:Linux

Django日志

  • 日志样例:
    [08/Jan/2018 20:59:07 ] settings     INFO     Welcome to Hue 3.9.0
  • 正则表达式为:
    ^\[(.*)\] (\w*)     (\w*)     (.*).*
  • 解析结果如下:
    表4 Django日志解析结果

    列号

    样值

    1

    08/Jan/2018 20:59:07

    2

    settings

    3

    INFO

    4

    Welcome to Hue 3.9.0

Apache server日志

  • 日志样例:
    [Mon Jan 08 20:43:51.854334 2018] [mpm_event:notice] [pid 36465:tid 140557517657856] AH00489: Apache/2.4.12 (Unix) OpenSSL/1.0.1t configured -- resuming normal operations
  • 正则表达式为:
    ^\[(.*)\] \[(.*)\] \[(.*)\] (.*).*
  • 解析结果如下:
    表5 Apache server日志解析结果

    列号

    样值

    1

    Mon Jan 08 20:43:51.854334 2018

    2

    mpm_event:notice

    3

    pid 36465:tid 140557517657856

    4

    AH00489: Apache/2.4.12 (Unix) OpenSSL/1.0.1t configured -- resuming normal operations