我有如下一行:
evnt=redeem&lid=1030023&upt=1679&pid=000000000001076056,000000000001072654,000000000001067925&ppt=996,246,366&qty=1,2,3
我有兴趣从行中提取盖子、pid、ppt 和 qty,并为 pid、ppt 和 qty 中的每个条目创建一个元组。请注意,规则是:
- 除了盖子之外的所有东西都可以有多个值。当值中有逗号时,有多个值
- pid 可以有多个值,并且这些值与其他值具有相同的顺序。例如,
lid=4&pid=1,2&qty=2,3&ppt=123,232
表示 iflid=4
andpid=1
thenqty=2
andppt=123
,and iflid=4
andpid=2
thenqty=3
andppt=232
。 - ppt 遵循与 qty 相同的规则,因为它与 pid 相关。
我已经能够通过以下方式为这些字段的盖子和 pid 完成此操作:
logs = foreach logs generate
REGEX_EXTRACT(original_path, 'lid=([^&]+)', 1) as login_id,
FLATTEN(TOKENIZE(REPLACE(REGEX_EXTRACT(original_path, '.*pid=([^&]+)', 1), ',', ' '))) as pid;
这给了我:
1030023 000000000001076056
1030023 000000000001072654
1030023 000000000001067925
但是,我也想对其他两个字段执行此操作(将其保留为三个元组),并且同一 foreach 语句中的多个展平不会给我想要的东西。
1030023 000000000001076056 996 1
1030023 000000000001072654 246 2
1030023 000000000001067925 366 3
我猜这将需要一个 UDF,但我想知道是否有另一种方法可以通过仅使用 Pig 中提供的函数来解决它。