gpt4 book ai didi

hadoop - 处理hadoop中的行数据以添加缺少的列

转载 作者:行者123 更新时间:2023-12-02 20:09:27 26 4
gpt4 key购买 nike

我有来自IIS的日志文件存储在hdfs中,但是由于Web服务器的配置,某些日志没有所有列,或者它们以不同顺序出现。我想生成具有通用架构的文件,因此可以在它们之上定义一个Hive表。

好日志示例:

#Fields: date time s-ip cs-method cs-uri-stem useragent
2013-07-16 00:00:00 10.1.15.8 GET /common/viewFile/1232 Mozilla/5.0+Chrome/27.0.1453.116

缺少列的示例日志(缺少cs-method和useragent):
#Fields: date time s-ip cs-uri-stem 
2013-07-16 00:00:00 10.1.15.8 /common/viewFile/1232

需要将缺少列的日志映射到完整的架构,如下所示:
#Fields: date time s-ip cs-method cs-uri-stem useragent
2013-07-16 00:00:00 10.1.15.8 null /common/viewFile/1232 null

错误日志可以启用列的任何组合,并且顺序可以不同。

如何根据日志文件中的“字段”行将可用列映射到完整架构?

编辑:
通常,我会通过将列架构定义为将列名称映射到索引的dict来实现此目的。即:col ['date'] = 0 col ['time'] = 1等等。然后,我将从文件中读取#Fields行并解析出已启用的列,并生成 header dict将 header 名称映射到文件中的列索引。然后对于剩余的数据行,我按索引知道它的标题,通过header = column name将其映射到我的列模式,并以正确的顺序生成新行,并插入包含空数据的缺失列。我的问题是我不了解如何在hadoop中执行此操作,因为每个 map 都单独执行,因此如何与每个 map 共享#Fields信息?

最佳答案

您可以使用this将 header 应用于创建 map 的列。在这里,您可以使用类似以下内容的UDF:

myudf.py

#!/usr/bin/python

@outputSchema('newM:map[]')
def completemap(M):
if M is None:
return None
to_add = ['A', 'D', 'F']
for item in to_add:
if item not in M:
M[item] = None
return M

@outputSchema('A:chararray, B:chararray, C:chararray, D:chararray, E:chararray, F:chararray')
def completemap_v2(M):
if M is None:
return (None,
None,
None,
None,
None,
None)
return (M.get('A', None),
M.get('B', None),
M.get('C', None),
M.get('D', None),
M.get('E', None),
M.get('F', None))

将缺少的元组添加到 map 中。

输入样例:
csv1.in             csv2.in
------- ---------
A|B|C D|E|F
Hello|This|is PLEASE|WORK|FOO
FOO|BAR|BING OR|EVERYTHING|WILL
BANG|BOSH BE|FOR|NAUGHT

示例脚本:
A = LOAD 'tests/csv' USING myudfs.ExampleCSVLoader('\\|') AS (M:map[]); 
B = FOREACH A GENERATE FLATTEN(myudf.completemap_v2(M));

输出:
B: {null::A: chararray,null::B: chararray,null::C: chararray,null::D: chararray,null::E: chararray,null::F: chararray}
(,,,,,)
(,,,PLEASE,WORK,FOO)
(,,,OR,EVERYTHING,WILL)
(,,,BE,FOR,NAUGHT)
(,,,,,)
(Hello,This,is,,,)
(FOO,BAR,BING,,,)
(BANG,BOSH,,,,)

关于hadoop - 处理hadoop中的行数据以添加缺少的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18343215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com