我有一个映射器。
for line in sys.stdin:
#if line is from file1
#process it based on some_arbitrary_logic
#emit k,v
#if line is from file2
#process it based on another_arbitrary_logic
#emit k, v
我需要通过带有-input file1
和另一个-input file2
的hadoop流式API来调用此映射器。
我如何实现这一目标?我怎么知道哪条线属于hadoop流媒体给我的STDIN
中的哪个文件?
更新
File1
Fruit, Vendor, Cost
Oranges, FreshOrangesCompany, 50
Apples, FreshAppleCompany, 100
File2
Vendor, Location, NumberOfOffices
FreshAppleCompany, NewZealand, 45
FreshOrangeCompany, FijiIslands, 100
我需要做的是打印他们销售橙子的办公室数量。
Oranges 100
。
因此两个文件都需要INPUT
到映射器。
答案 0 :(得分:4)
os.environ["map.input.file"]
应该给出映射器正在处理的块的文件名。
答案 1 :(得分:1)
这个问题有点模棱两可,因为就文件的目的而言,没有提供太多细节。所以我做了一些假设
如果file1和file2只是两组数据文件并且具有相同类型的数据,那么您需要确保的是处理文件...然后只需将文件复制到HDFS文件夹并确保该文件夹被识别为输入文件夹,你很好。两个文件中的数据将用于调用映射器......
如果是file1和file2有不同的目的。例如,file1是mapper的输入文件,但file2是你需要引用某些连接或等等的东西......然后是分布式缓存。请查看此Hadoop Streaming with multiple input
如果file1和file2都是输入文件并且是相关的,则需要进行连接。如果file1或file2很小,那么您可以使用常规文件或归档文件将其用作分布式缓存。但是,如果两个文件都很大,那么它有点复杂,因为您可能需要执行多个MR或将文件转换为可由Hive使用的格式并使用hive连接然后使用连接结果作为输入到您的Python Mapper作业。
希望这有帮助。