是否可以在使用pig的generate条件中强制转换long to字符串?

vuktfyat  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(314)

我有一个长串,有时是字符串“无限”或“南”。假设a是记录,b是长记录:
我试过。。。

FOREACH A GENERATE (B is not null?B:-1)

尽管上面的说法并不准确,因为有时“b”显然是一个字符串。是否有一些条件或复合条件来检查它是否不为null,1)不是字符串或2)强制转换b,以便我可以确保它不为null,并且在条件中不以“nan”开头?
我的目标是使long转换成一个数字(如果是“nan”,则为-1,如果不是,则保持不变)。
如果存在,描述将显示以下内容(如果不存在,则显示nan):
{“b”:28.2524232}

t40tm48m

t40tm48m1#

可能是这样的:

FOREACH A GENERATE (B is not null ? (B matches 'NaN' OR B matches 'INFINITY' ? -1 : (int) B):-1)

因为“nan”和“infinity”pig可能会推断出一个bitearray或chararray,所以请检查描述为gobrewers14的建议。
尽管您可以加载模式并将其指定为chararray,然后像我那样进行转换:)
注意:不需要“b is not null”,但如果是;)

mhd8tkvw

mhd8tkvw2#

试试这个,
首先将长数据加载为chararray格式,然后对其执行条件,然后再转换回long格式。例如,

A = load 'data_file' as (B:chararray);
result1 = FOREACH A GENERATE (B matches '(.*)NaN(.*)'?'-1':(B matches '(.*)INFINITY(.*)'?'-1':B)) as B;
result2 = FOREACH result1 GENERATE (long)B;

希望对我有用。

相关问题