AWS Glue无法分类我的数据,附相关HTML文件结构求助
解决AWS Glue无法分类HTML内嵌预格式化数据的方案
我来帮你搞定这个问题!你的核心痛点是:AWS Glue默认的HTML分类器只会解析HTML标签结构,根本不会去提取<pre>标签里的业务数据——而你真正要处理的恰恰是<pre>里那串固定格式的日志内容。下面给你两种实用的解决思路,按需选择:
1. 用Glue ETL脚本直接处理(最灵活)
先把HTML内容读成字符串,手动提取<pre>里的内容,再拆分结构化字段:
第一步:提取<pre>内的原始数据
写个简单的UDF函数,用正则把<pre>和</pre>之间的内容抠出来:
import re from pyspark.sql.types import StringType from pyspark.sql.functions import udf, col def pull_pre_content(html_text): # 用DOTALL模式匹配跨行内容 pre_match = re.search(r'<pre>(.*?)</pre>', html_text, re.DOTALL) if pre_match: # 去掉首尾的空白字符 return pre_match.group(1).strip() return None # 注册UDF extract_pre_udf = udf(pull_pre_content, StringType()) # 读取HTML文件后,新增一列存提取出的pre内容 processed_df = raw_html_df.withColumn('pre_data', extract_pre_udf(col('content')))
这里的content是你读取HTML文件后得到的原始内容列,根据你的实际表结构调整就行。
第二步:拆分结构化字段
看你给出的示例数据14V-IG-TEST-DATA - SERVC - EXEC# 4515 [11| Blubb,abcons, Port: 18 For: ...,是用-、|、逗号这些符号分隔的,直接用Spark的split函数拆就行:
from pyspark.sql.functions import split # 按" - "拆分前三个字段 final_df = processed_df.withColumn('record_type', split(col('pre_data'), ' - ').getItem(0)) .withColumn('service_category', split(col('pre_data'), ' - ').getItem(1)) .withColumn('execution_info', split(col('pre_data'), ' - ').getItem(2)) # 再拆分exec_info里的细节,比如用"|"拆分 .withColumn('exec_id', split(col('execution_info'), '\|').getItem(0))
根据你实际的字段规则调整拆分逻辑就行,要是格式有变体,也可以用更灵活的正则拆分。
2. 用Glue爬虫的自定义分类器(适合自动建表)
如果是用Glue爬虫自动发现表结构,那你可以创建一个自定义正则分类器,直接跳过HTML标签,匹配<pre>里的行格式:
- 先写个匹配你数据行的正则,比如针对你的示例开头:
^\w+-IG-TEST-DATA - \w+ - EXEC# \d+ \[\d+\| .* - 去Glue控制台的「分类器」页面,新建一个正则分类器,把这个正则填进去,设置优先级高于默认的HTML分类器;
- 下次爬虫运行时,就会优先用这个分类器识别
<pre>里的行数据,自动生成对应的表结构。
几个注意点
- 确保你的HTML文件里
<pre>标签是标准格式,没有嵌套或者异常闭合的情况,不然正则提取会出错; - 先拿几个样本文件测试你的提取和拆分逻辑,没问题再批量跑;
- 如果数据有多种格式变体,可能需要多个自定义分类器,或者在ETL里加分支判断处理。
内容的提问来源于stack exchange,提问作者S. Read
相关产品推荐
相关产品推荐

