ขยายคอลัมน์ที่ใช้ตัวคั่นเป็นค่าไดนามิกใน Apache Pig

ฉันมีข้อมูลในรูปแบบที่น่าสนใจ มันเป็นเช่นนี้:

ID    Name    Info
1     Joe     quality=82,activity=23,age:rank:foo,21:0/1:30
2     Bob     activity=32,age:foo,22:31,quality=43
3     Mary    foo:age:rank,24:23:1/1,quality=62,activity=14

สิ่งที่ฉันพยายามแยกคือข้อมูล age:rank:foo ซึ่งแสดงเป็น:

age:rank:foo,(age value):(rank value):(foo value)

สำหรับทุกบันทึกอาจมีหรือไม่มีคีย์/ค่าเหล่านั้นบางส่วนหรือทั้งหมด และอาจอยู่ในลำดับใดก็ได้ ฉันกำลังพยายามแปลงข้อมูลดังนั้นฉันจึงได้สิ่งต่อไปนี้:

ID    Name    Quality  Age    Rank    Foo
1     Joe     82       21     0/1     30
2     Bob     43       22     NULL    31
3     Mary    62       23     1/1     24

เพื่อให้ได้คุณภาพฉันกำลังทำสิ่งนี้:

A = LOAD '...' ...;
B = FOREACH A GENERATE ID, Name, REGEX_EXTRACT(info, 'quality=([0-9]+),', 1) AS Quality;

แต่ฉันไม่รู้ว่าจะแปลงคีย์/ค่าที่ไม่สม่ำเสมอเป็นคอลัมน์ได้อย่างไร มีข้อเสนอแนะอะไรบ้าง? (และไม่ฉันไม่สามารถให้พวกเขาส่งข้อมูลในรูปแบบที่ดีกว่านี้ให้ฉันได้ :P )


person chrislondon    schedule 29.05.2014    source แหล่งที่มา
comment
ทำไมคุณไม่สามารถใช้ REGEX_EXTRACT หรือ REGEX_EXTRACT_ALL ต่อไปได้? นั่นคือสิ่งที่ฉันจะทำ   -  person reo katoa    schedule 29.05.2014
comment
@WinnieNicklaus ฉันไม่คิดว่าเป็นไปได้เพราะคีย์เปลี่ยนสถานที่เช่นสำหรับไฟล์หนึ่งอาจเป็น age:rank:foo,1:2:3 แต่อันถัดไปอาจเป็น rank:age:foo,2:1: 3. เว้นแต่ฉันจะคิดมากไปเอง...   -  person chrislondon    schedule 29.05.2014
comment
อาจมีมนตร์ดำที่คุณสามารถทำงานกับ regexes เพื่อให้ได้สิ่งที่คุณต้องการ ซึ่งอาจใช้บางอย่างที่แตกต่างกัน แต่วิธีที่อ่านง่ายที่สุดคือการเขียน UDF หากคุณต้องการอยู่ใน Pig จริงๆ คุณสามารถลองแท็กคำถามด้วย regex และเน้นประเด็นนั้น   -  person reo katoa    schedule 29.05.2014
comment
ฟังดูดี. ขอบคุณ!   -  person chrislondon    schedule 29.05.2014


คำตอบ (1)


คุณสามารถใช้ REGEX_EXTRACT/REGEX_EXTRACT_ALL สำหรับสิ่งนี้ได้ แต่มันยุ่งยาก เนื่องจากสามารถมีช่องอายุ/อันดับ/foo ได้ตั้งแต่ 1 ถึง 3 ช่องในลำดับใดๆ คุณจึงต้องมี 6 regexe สำหรับอินสแตนซ์ที่มีทั้ง 3 ช่องเพื่อให้ครอบคลุมการเรียงสับเปลี่ยนทั้งหมด และอีก 6 ช่องสำหรับอินสแตนซ์ที่มี 2 ช่อง และอีก 3 ช่องสำหรับช่องเดียว

คุณจะได้รับ 11 ฟิลด์แต่ละฟิลด์สำหรับอายุ/ยศ/foo จากสิ่งนี้ (6 จากการดึงข้อมูล 3 ฟิลด์, 4 จากการดึงข้อมูล 2 ฟิลด์, 1 จากการดึงข้อมูลฟิลด์เดียว) สำหรับแต่ละอายุ/ยศ/foo ให้เลือกผลลัพธ์ที่ไม่ใช่ค่าว่าง (เช่น (foo1 is not null ? foo1 : (foo2 is not null ? foo2 : (foo3 is not null ? foo3 : ... ))) as foo_final)

person user2303197    schedule 02.06.2014