我有這組資料:
dump data;
這是一個示例輸出:(這個資料集幾乎有一百萬行長)。
("0",60,0,1,"Fri")
("1",47,0,1,"Mon")
("1",23,1,0,"Tue")
("1",60,0,0,"Sat")
("1",50,1,1,"Fri")
我想將值替換為:Sat、Fri、Mon 到周數,我知道如何使用 REPLACE 一次僅更改 1 個值,但我必須重復多次才能更改一周中的所有日期:
data_day_of_week = FOREACH data GENERATE $0,$1,$2,$3,REPLACE($4, 'Mon', '1');
有沒有辦法只在一個宣告中做到這一點?
uj5u.com熱心網友回復:
您可以結合 Pig ToDate 和 ToString 函式:
data_day_of_week = FOREACH data GENERATE $0,$1,$2,$3,
ToString(ToDate($4, 'EEE'), 'e') as day_of_week;
ToDate函式會將chararray星期幾轉換為 Pig 日期時間格式。然后ToString會將其轉換為您選擇的格式。
根據Java 檔案,單個 e 或 c 應該給出星期幾的數字格式,其中星期一是 1。
uj5u.com熱心網友回復:
您應該使用 CASE WHEN THEN 陳述句
data_day_of_week = FOREACH data GENERATE
CASE
WHEN $4 == 'Mon' THEN '1'
WHEN $4 == 'Tue' THEN '2'
...
WHEN $4 == 'Sun' THEN '7'
END AS day_number;
您還應該命名您的關系,以便不要使用 $1、$2 等。如果您將 $4 命名為 day_number,那么當您從 CASE 陳述句中將變數宣告為 day_number 時,它將“覆寫”您之前的資料。
uj5u.com熱心網友回復:
您可以將 JOIN 與對如下映射的參考一起使用:
(Mon,1)
(Tue,2)
(Wed,3)
(Thu,4)
(Fri,5)
(Sat,6)
(Sun,7)
加盟宣告:
outer_left = join your_data by $4 left outer, day_mapping by day;
uj5u.com熱心網友回復:
saph_top,是更接近回答我的問題的人,但是在測驗它正在解決空白輸出之后,我將補充他的答案:
'Mon' 與“Mon”不同,因此當我使用:CASE WHEN $4 == 'Mon' THEN '1' 它沒有替換任何東西,導致空白結果:data_day_of_week。
為了解決這個問題,我只需添加“”(條件中的雙引號):
data_day_of_week = FOREACH data GENERATE
CASE
WHEN $4 == '"Mon"' THEN '1'
WHEN $4 == '"Tue"' THEN '2'
...
WHEN $4 == '"Sun"' THEN '7'
END AS day_number;
之后,為了重建資料,我將以下內容添加到 GENERATE 子句:
data_day_of_week = FOREACH data GENERATE $0,$1,$2,$3,
CASE
WHEN $4 == '"Mon"' THEN '1'
WHEN $4 == '"Tue"' THEN '2'
...
WHEN $4 == '"Sun"' THEN '7'
END AS day_number;
現在輸出完成了:dump data_day_of_week;
("0",60,0,1,5)
("1",47,0,1,1)
("1",23,1,0,2)
("1",60,0,0,6)
("1",50,1,1,5)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460158.html
上一篇:hiveQL查詢selectclassID,studNamefromtable1wheregrade=Max(grade)groupbyclassID,studName;
