我有两个数据集,一个是源数据,另一个是元数据。
source data
============
name city state country
Ram Agra UP India
John Aligarh UP India
Shyam Merrut UP India
Isha Kanpur UP India
Metadata
=========
column_input flag
name Y
city Y
state N
country N
FINAL OUTPUT
============
name city
Ram Agra
John Aligarh
Shyam Merrut
Isha Kanpur
我们根据元信息从源代码中需要很少的列,我们需要首先引用/读取元数据数据集,逻辑标志应该是'Y',这里是'city'和'state'所以我们只需要拉这些来自源数据的两列。
我能够从元数据数据集中获取列名,现在我可以将此列名传递给源以获取相应的列数据。
meta_data_read = LOAD '/user/aidb' USING PigStorage(',') AS (column_input,flag);
filter_flag = FILTER meta_data_read by LOWER(TRIM(Flag)) == 'y' ;
gen_required_col = FOREACH filter_flag GENERATE column_input;
dump gen_required_col ;
(city)
(state)
答案 0 :(得分:0)
如果必须针对同一元数据处理所有数据行,我将创建一个小(shell)脚本,处理元文件并以逗号分隔回复字段名称。然后将其存储在pig变量中并使用该变量来投影所需的字段。 这是一个例子(注意:我没有创建刚刚声明PROJECT变量的shell脚本,但脚本很简单)
set pig.pretty.print.schema true;
%default PROJECT 'a,c'
data = LOAD 'SO/simple.txt' USING PigStorage(',') AS (a:chararray, b:chararray, c:chararray, d:chararray);
DESCRIBE data;
dump data;
data_p = FOREACH data GENERATE
$PROJECT;
DESCRIBE data_p;
DUMP data_p;
因此PROJECT变量包含需要投影的字段,只需在FOREACH语句中使用它。 描述结果如下:
data: {
a: chararray,
b: chararray,
c: chararray,
d: chararray
}
data_p: {
a: chararray,
c: chararray
}
我希望这能解决你的问题。