【发布时间】:2019-02-27 04:48:49
【问题描述】:
我正在处理一些数据以摄取到 Hive 中。问题是,我的历史数据被覆盖了,所以我需要在文本文件中包含文件名,以便我可以处理在后续文件中更新的重复行。
我选择解决此问题的方法是使用 awk 将文件名添加到每个文件,然后在我摄取到 Hive 后,我可以使用 HQL 过滤掉我不推荐使用的行。
这是我的示例数据(制表符分隔):
animal legs eyes
hippo 4 2
spider 8 8
crab 8 2
mite 6 0
bird 2 2
我把它命名为long_name_20180901.txt
我已经知道如何从this post 添加我的新列:
awk '{print FILENAME (NF?"\t":"") $0}' long_name_20180901.txt
导致:
long_name_20180901.txt animal legs eyes
long_name_20180901.txt hippo 4 2
long_name_20180901.txt spider 8 8
long_name_20180901.txt crab 8 2
long_name_20180901.txt mite 6 0
long_name_20180901.txt bird 2 2
但是,作为一个初学者,我不知道如何将这个命令扩充为:
- 使列名(第一行)类似于“file_name”
- 在 awk 中实现正则表达式,只提取我需要的文件名部分,然后处理其余部分。我真的只是想要
"long_name_(.{8,}).txt"(捕获组中的东西。
目标输出是:
file animal legs eyes
20180901 spider 8 8
20180901 crab 8 2
20180901 mite 6 0
20180901 bird 2 2
感谢您的宝贵时间!!我是awk 的新手。
【问题讨论】:
-
简单地使用 HQL 函数怎么样?参看。 stackoverflow.com/a/16719530/5162372
-
感谢您的创造性思维。我可能会走这条路,因为我所有的文件都被压缩了,实现 awk 所需的解压缩/重新压缩时间没有意义。