我有一堆长号,有时是字符串“INFINITY”或“NaN”。 假设A是记录而B是长:
我试过......
FOREACH A GENERATE (B is not null?B:-1)
虽然上述情况并不准确,但有时“B”显然是一个字符串。 是否有一些条件或复合条件来检查它是否为空并且1)不是字符串或2)转换B使得我可以确保它不为空并且不以条件中的“NaN”开头? / p>
我的目标是让long转换为数字(如果是“NaN”则为-1,如果不是则保持不变)。
描述A将显示以下内容(如果不存在则显示NaN):
{ “B”:28.2524232 }
答案 0 :(得分:1)
也许是这样的:
FOREACH A GENERATE (B is not null ? (B matches 'NaN' OR B matches 'INFINITY' ? -1 : (int) B):-1)
因为" NaN"和" INFINITY"猪可能推断出bitearray或chararray,检查DESCRIBE为GoBrewers14推荐。
虽然您可以使用模式加载并将其指定为chararray,然后按照我的方式进行转换:)
注意:" B不为空"不应该是必要的,但如果是;)
答案 1 :(得分:1)
试试这个,
首先将长数据加载为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;
希望它能为我工作和工作。