有没有办法使用文件的行号将多个文件加载到Hive表中?我可以在文件中加载每个条目,我知道你可以使用input__file__name来获取代码所来自的文件的名称,那么类似的方法是提取代码来自哪个文件行?
鉴于这三个任意文件:
a.txt b.txt c.txt
a1 b1 a3
b2 b2 b3
c3 c3 c4
有没有办法将它们加载到Hive表中,其中包含文件的行号?注意:实际文件没有附加数字。 结果,我想要这个结果:
SELECT * FROM result;
将屈服:
Line_Number code
1 a1
1 b1
1 c1
2 a2
2 b2
2 c2
3 a3
3 b3
3 c3
答案 0 :(得分:0)
仅使用HiveQL这是不可能的,因为文件是可拆分的并且被许多映射器读取。分裂不是线条。文件在字节而不是行边界处分成分裂。并且分割器由映射器独立处理。 Mappers对彼此一无所知。
简单的方法是预处理文件并使用shell / etc添加行号,然后将它们加载到定义了line_number列的表中。例如,使用awk
:
awk '{printf "%s\t%s\n",NR,$0}' a.txt > a1.txt
这将添加一个包含行号的列,制表符分隔。 a.txt
- 输入文件a1.txt
- 结果文件
如果您想为此目的使用Map-reduce,则需要实现自己的TextInputFormat
/ LineRecordReader
以返回行号作为键而不是字节偏移量。此外,它不应该分割文件以生成序列号,这将打破并行性。使用自定义计数器来映射映射器之间的数字生成也许可以做到这一点。无论如何,以完全分布的方式做到这一点并不是那么容易的事。所以,我建议在加载到表之前预处理文件并添加行号。