我想使用 Apache Pig 构建一个大键 -> 值映射,在映射中查找内容,然后遍历键。然而,做这些事情似乎没有语法;我检查了手册、wiki、示例代码、大象书、谷歌,甚至尝试解析解析器源。每个示例都从文件中加载地图文字......然后从不使用它们。如何使用 Pig 的地图?
首先,似乎没有办法将 2 列 CSV 文件直接加载到地图中。如果我有一个简单的map.csv
:
1,2
3,4
5,6
我尝试将其加载为地图:
m = load 'map.csv' using PigStorage(',') as (M: []);
dump m;
我得到三个空元组:
()
()
()
所以我尝试加载元组然后生成地图:
m = load 'map.csv' using PigStorage(',') as (key:chararray, val:chararray);
b = foreach m generate [key#val];
ERROR 1000: Error during parsing. Encountered " "[" "[ "" at line 1, column 24.
...
语法的许多变体也失败了(例如,generate [$0#$1]
)。
好的,所以我将我的地图转换为 Pig 的地图文字格式map.pig
:
[1#2]
[3#4]
[5#6]
并加载它:
m = load 'map.pig' as (M: []);
现在让我们加载一些键并尝试查找:
k = load 'keys.csv' as (key);
dump k;
3
5
1
c = foreach k generate m#key; /* Or m[key], or... what? */
ERROR 1000: Error during parsing. Invalid alias: m in {M: map[ ]}
Hrm,好吧,可能因为涉及到两个关系,我们需要一个join:
c = join k by key, m by /* ...um, what? */ $0;
dump c;
ERROR 1068: Using Map as key not supported.
c = join k by key, m by m#key;
dump c;
Error 1000: Error during parsing. Invalid alias: m in {M: map[ ]}
失败。如何引用地图的键(或值)?映射模式语法似乎不允许您命名键和值(邮件列表说无法分配类型)。
最后,我只想能够在我的地图中找到他们所有的键:
d = foreach m generate ...oh, forget it.
猪的地图类型是半生不熟的吗?我错过了什么?