在PIG中,如何在shell中传递
{20160218,20160219,20160220,20160221,20160222,20160223,20160224}
通过shell代码:
pig -f cart_abandonment.pig -param input='{20160218..20160224}'
使用扩展功能? 上述操作无效,因为单引号省略了扩展。
如果没有单引号,似乎只有20160218过去了。 PIG脚本如下:
list = load '/inserteddate={$input}'
USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') as cartjson:map[];
答案 0 :(得分:2)
尝试使用双引号命令替换(template<typename F>
void ApplyToFields(const NodeStatus &ns1, const NodeStatus &ns2, F func) {
func(ns1.float_val, ns2.float_val);
func(ns1.int_val, ns2.int_val);
}
struct add_print
{
template<typename T>
void operator() (T a, T b) {
std::cout << b + a << std::endl;
}
};
):
$(...)
正如您所发现的,brace expansion仅在使用未加引号时有效。
但是,为了将生成的所有数字作为option-argument pig -f cart_abandonment.pig -param input="$(echo {20160218..20160224} | tr ' ' ',')"
的一部分传递,数字列表必须双引号
这是通过使用command substitution(input=
)生成数字列表(并将其回显到stdout,命令替换捕获)来实现的,这是 double -quoted ,以便shell将其输出视为单个字,以便$(...)
形成单选项参数。< / p>
input=num1 num2 ...
在这种情况下需要以逗号分隔的值,而传递给pig
的大括号扩展会产生以空格分隔的值因此需要使用echo
将空格转换为逗号。