2013-09-27 25 views
0

我有數據的格式如下:如何加載和處理數據爲MAP豬?

isotimestamp source service info serviceid msg hostname requsetid 

2013-08-22T13:23:18.226220+01:00 indiana service2q info 255 " processing 
request " host1 e2cerd22 

我能夠通過UDF到ISO時間戳轉換成datetime。消息由空格分隔,消息長度不固定。當我嘗試通過pig-storage('')加載數據時(由於消息位由空格分隔),它將檢索下一位消息作爲其他列數據。

在上面的例子中,如果我生成主機名,它給了我消息的請求位。有沒有什麼特定的方法來處理像MAP這樣的數據?我試圖使用TO-MAP,但未能實現所需的地圖轉換。

tomapdata = FOREACH data GENERATE myudf.test(dt)as date, 
      TOMAP(source,service,info,serviceid,msg,hostname,requestid)as m; 

getdata = FOREACH tomapdata GENERATE dt, m#hostname, m#serviceid; 

是否可以將日期作爲chararray和其餘部分數據加載爲地圖?

load 'data.log' as (dt:chararray , m:MAP[chararray]); 
Foreach data generate m#source ; 

問題:

任何一個可以指導我在加載數據的豬MAP?
任何人都可以提供一些關於在Pig中加載/處理數據的建議嗎?

**需要的地圖:

source#indiana 

service#service2q 

msg#"processing request" 

hostname#host1 

requestid#ec2cerd22** 

回答

0

據我所知,你cannont使用任何內置的功能來加載數據的地圖,由於在文件中缺少[]認爲會顯示地圖開始和地圖結束。

這就是說我想我已經知道爲什麼你的TOMAP失敗了。映射由鍵值對組成,因此TOMAP的輸入必須是偶數,因爲它將每個第一列作爲關鍵字,並將每個第二列作爲值。你的TOMAP有七個參數,最後一個參數缺失。如果您希望所有要與一個鍵相關聯的數據,你承擔責任:水災做到以下幾點:

(例如目的源被認爲是關鍵)

tomapdata = FOREACH數據來生成myudf.test(DT )作爲日期, TOMAP(source,TOTUPLE(service,info,serviceid,msg,hostname,requestid))爲 m;

這將有關鍵的來源和其他一切的元組作爲值。

如果你只是忘了添加一列,只需在TOMAP結尾添加一列,它就可以工作。

如果你想把所有東西都作爲一個集合,並且將它放在鍵值對中並不重要,那麼你可能只能使用TOTUPLE或TOBAG。

+0

Broada非常感謝如何在我嘗試按以下方式生成鍵值對時彈出了無法投射chararray以與模式源進行映射:map error ** FOREACH數據生成myudf.test(dt)作爲日期,源#'service'; ** – user2667326

0

盡我所知,您的問題並不在於創建地圖,而是您希望Pig尊重您的數據中的"標記,而不是在它們之間的空格上分割。如果你知道msg是要具有這樣的報價只有場,這裏是一個黑客:

predata = LOAD 'input' USING PigStorage('"') AS (initial:chararray, msg:chararray, final:chararray); 
data = 
    FOREACH predata 
    GENERATE 
     FLATTEN(STRSPLIT(initial, ' ', 5) AS (
      isotimestamp:chararray, 
      source:chararray, 
      service:chararray, 
      info:chararray, 
      serviceid:chararray), 
     msg, 
     FLATTEN(STRSPLIT(final, ' ', 2) AS (
      hostname:chararray, 
      requestid:chararray); 

和遠離你去。你不需要地圖。

0

我喜歡戴維斯布羅達的答案,這一點,但遺憾的是試圖用下面類似的東西:

----sample_data.txt 
open,apache,another,pig 
open,apache,apache,pig 
apache,hadoop 

----my.pig 
A = LOAD '$input' AS chararray; 
B = FOREACH A GENERATE 
    STRSPLIT($0,',').$0 AS myvals:chararray 
    , TOMAP(STRSPLIT($0,',').$0,STRSPLIT($0,',').$1) AS mymap:map [(i:chararray)]; 
-- this fails , TOMAP(STRSPLIT($0,',')) AS mymap:map [(i:chararray)]; 
C = FOREACH B GENERATE $1#'open'; 
DUMP C; 
DESCRIBE C; 

$>pig -x local -param input=sample_data.txt my.pig 
(apache) 
(apache) 
() 
C: {(i: chararray)} 

但遺憾的是,雖然STRSPLIT的輸出是一個元組,我得到一個空的地圖對象和沒有價值了。似乎動態地圖創建不允許在豬身上0.11