PIG - Scalar 在输出中有不止一行。 1s
Posted
技术标签:
【中文标题】PIG - Scalar 在输出中有不止一行。 1s【英文标题】:PIG - Scalar has more than one row in the output. 1s 【发布时间】:2014-06-25 12:43:52 【问题描述】:我有以下格式的数据集:
100000853384|RETAIL|OTHER|4.625|280000|360|02/2012|04/2012|31|31|1|23|801|NO|CASH-OUT REFINANCE|SF|1|INVESTOR|CA|945||FRM
100003735682|RETAIL|SUNTRUST MORTGAGE INC.|3.99|466000|360|01/2012|03/2012|80|80|2|30|788|NO|PURCHASE|SF|1|PRINCIPAL|MD|208||FRM
100006367485|CORRESPONDENT|PHH MORTGAGE CORPORATION|4|229000|360|02/2012|04/2012|67|67|2|36|794|NO|NO CASH-OUT REFINANCE|SF|1|PRINCIPAL|CA|959||FRM
第 4 条记录是 ORIGINAL_INTEREST_RATE。 现在我的问题是
大多数人贷款的利率是多少。
我写以下代码
加载数据集
loanAqiData = LOAD 'hdfs://masterNode:8020/home/hadoop/hadoop_data/LOAN_Acquisition_DATA/Acquisition_2012Q1.txt'
USING PigStorage('|')
AS
(
LOAN_IDENTIFIER:chararray
, CHANNEL:chararray
, SELLER_NAME:chararray
, ORIGINAL_INTEREST_RATE:float
, ORIGINAL_UNPAID_PRINCIPAL_BALANCE :float
, ORIGINAL_LOAN_TERM :float
, ORIGINATION_DATE:chararray
, FIRST_PAYMENT_DATE:chararray
, ORIGINAL_LOAN_TO_VALUE:float
, ORIGINAL_COMBINED_LOAN_TO_VALUE :float
, NUMBER_OF_BORROWERS:float
, DEBT_TO_INCOME_RATIO:float
, CREDIT_SCORE:float
, FIRST_TIME_HOME_BUYER_INDICATOR:chararray
, LOAN_PURPOSE:chararray
, PROPERTY_TYPE:chararray
, NUMBER_OF_UNITS:chararray
, OCCUPANCY_STATUS:chararray
, PROPERTY_STATE:chararray
, ZIP:chararray
, MORTGAGE_INSURANCE_PERCENTAGE:float
, PRODUCT_TYPE:chararray
);
//- 按利率分组
grouped_by_interest_rate = group loanAqiData by ORIGINAL_INTEREST_RATE;
个人利率的计数数
count_for_specific_interest = FOREACH grouped_by_interest_rate GENERATE group as INTEREST_RATE, COUNT(loanAqiData) as NO_OF_PEOPLE;
转储
转储 count_for_specific_interest
输出
(3.625,1) (3.75,2) (3.875,26) (3.99,8) (4.0,21) (4.1,1) (4.125,15) (4.25,16) (4.375,15) (4.376,26) (4.5,10) (4.625,3)
但我想得到 (3.875,26) 和 (4.376,26)
如何获得?
另外,如果我想获得最少没有人贷款的贷款利息..
【问题讨论】:
请正确使用代码标签。 【参考方案1】:我建议您使用 MAX() 函数 (http://pig.apache.org/docs/r0.11.0/func.html#max) 来确定最大人数,然后按此数字进行过滤。
这是一个应该可以工作的代码示例(未经测试):
FOREACH count_for_specific_interest
max_value= MAX($1.NO_OF_PEOPLE);
GENERATE INTEREST_RATE, NO_OF_PEOPLE, max_value;
RESULT = FILTER count_for_specific_interest BY NO_OF_PEOPLE==max_value;
对于 min,您可以使用完全相同的脚本将 MAX() 替换为 MIN()
【讨论】:
【参考方案2】:终于解决了。 让我把步骤写下来
1) 加载
2) 按兴趣分组
grp = group loanAqiData by ORIGINAL_INTEREST_RATE;
3) 统计每个兴趣的人数
cntForEachGrp = FOREACH grp GENERATE group as
INTEREST_RATE, COUNT(loanAqiData) as NO_OF_PEOPLE;
输出
(3.625,1) (3.75,2) (3.875,26) (3.99,8) (4.0,21) (4.1,1) (4.125,15) (4.25,16) (4.375,15) (4.376) ,26) (4.5,10) (4.625,3)
4) 将它们全部分组放在同一个 BAG 中
grpALL = GROUP cntForEachGrp ALL;
(全部,(3.625,1),(3.75,2),(3.875,26),(3.99,8),(4.0,21),(4.1,1),(4.125,15),( 4.25,16),(4.375,15),(4.376,1),(4.5,10),(4.625,3),(4.75,5),(4.875,4),(5.0,2),(5.25, 1))
5) 计算 BAG 中的最大人数
maxVal = FOREACH grpALL
max_value= MAX(cntForEachGrp.NO_OF_PEOPLE);
GENERATE cntForEachGrp.INTEREST_RATE, cntForEachGrp.NO_OF_PEOPLE, max_value as
max_no;
grunt> describe maxVal;
maxVal: (INTEREST_RATE: float),(NO_OF_PEOPLE: long),max_no: long
转储最大值;
((3.625),(3.75),(3.875),(3.99),(4.0),(4.1),(4.125),(4.25),(4.375),(4.376),(4.5),( 4.625),(4.75),(4.875),(5.0),(5.25),(1),(2),(26),(8),(21),(1),(15),( 16),(15),(1),(10),(3),(5),(4),(2),(1),26)
6)过滤掉最大人数的贷款利息
RESULT=FILTER cntForEachGrp BY NO_OF_PEOPLE == maxVal.max_no ;
转储后,我们得到利率 -3.875,最大人数为 26。
为什么我们必须这样做
grpALL = GROUP cntForEachGrp ALL;
和
(5)中嵌套foreach的内在含义是什么
【讨论】:
以上是关于PIG - Scalar 在输出中有不止一行。 1s的主要内容,如果未能解决你的问题,请参考以下文章