【基础】【flink sql】hdfs到hive的逻辑处理一:通过正则解析日志数据

本文介绍了如何利用Flink SQL解析HDFS上的日志文件,通过自定义UDF提取关键字段,并将处理后的数据写入到Hive表中,适用于企业实战场景。主要涉及Flink 1.12.7版本的连接器和SQL操作。

一、需求描述

通过正则获取HDFS log日志中指定字段的数据,并输出到HIVE表中。

flink版本1.12.7。

 
 

二、实现

1. 主要连接器依赖


        <!-- filesystem连接器 -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-files</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-csv</artifactId>
            <version>${flink.version}</version>
        </dependency>

 

2. udf:正则获取字段数据

package com.gao.function;

import org.apache.flink.table.annotation.DataTypeHint;
import org.apache.flink.table.annotation.FunctionHint;
import org.apache.flink.table.functions.TableFunction;
import org.apache.flink.types.Row;
import org.apache.flink.types.RowKind;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexpExtractTupleUdf extends TableFunction<Row> {

    @FunctionHint(output = @DataTypeHint("ROW<arr ARRAY<STRING>>"))
    public void eval(String raw, String pattern) {
        if (raw == null || pattern == null) {
            return;
        }
        List<String> list = new ArrayList<>();
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(raw);
        if (m.find()) {
            for (int i = 1; i <= m.groupCount(); i++) {
                list.add(m.group(i));
            }
        }
        String[] arr = list.toArray(new String[0]);
        RowKind rowKind = RowKind.fromByteValue((byte) 0);
        Row row = new Row(rowKind, 1);
        row.setField(0, arr);
        collect(row);
    }
}

 

3. sql

CREATE TEMPORARY SYSTEM FUNCTION regexp_extract_tuple AS 'com.gao.function.RegexpExtractTupleUdf';
CREATE TABLE source
(
  `raw_message` string
) WITH (
      'connector' = 'filesystem',
      'path' = 'hdfs:xxx',
      'format'= 'raw'
      );
CREATE TABLE sink
(
  `gif` string,
  `referer` string,
  `mid` string
) WITH (
       'connector' = 'filesystem',
       'path' = 'hdfs://xxx',
       'format'= 'csv',
       'csv.field-delimiter'='\t', --字段分隔符,用于hive字段识别,使用\t
       'csv.disable-quote-character' = 'true', --字符串类型的数据不加双引号输出
       'csv.null-literal' = 'null' -- 数据为空是 输出为null
      );
 CREATE TEMPORARY VIEW source_1 AS
 select
 raw_message
,REGEXP_EXTRACT(raw_message, '(\?|&|<)gif=([^& \">]*)', 2) as `gif` -- 通过正则取gif字段内容
,REGEXP_EXTRACT(raw_message, '(\?|&|<)_referer=([^& \">]*)', 2) as `referer`
,REGEXP_EXTRACT(raw_message, '(\?|&|<)mid=([^& \">]*)', 2) as `mid`
 from source S
;
 insert into sink
 select
 `gif` as `gif`,
`referer` as `referer`,
`mid` as `mid`
 from source_1;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值