Tôi đang tìm kiếm một regex mà có thể được làm thức ăn cho một "tạo bảng bên ngoài" tuyên bố của Hive QL theo hình thứcHive RegexSerDe Multiline Log phù hợp với
"input.regex"="the regex goes here"
Điều kiện là các bản ghi trong các tập tin đó các RegexSerDe phải đọc có dạng sau:
2013-02-12 12:03:22,323 [DEBUG] 2636hd3e-432g-dfg3-dwq3-y4dsfq3ew91b Some message that can contain any special character, including linebreaks. This one does not have a linebreak. It just has spaces on the same line.
2013-02-12 12:03:24,527 [DEBUG] 265y7d3e-432g-dfg3-dwq3-y4dsfq3ew91b Some other message that can contain any special character, including linebreaks. This one does not have one either. It just has spaces on the same line.
2013-02-12 12:03:24,946 [ERROR] 261rtd3e-432g-dfg3-dwq3-y4dsfq3ew91b Some message that can contain any special character, including linebreaks.
This is a special one.
This has a message that is multi-lined.
This is line number 4 of the same log.
Line 5.
2013-02-12 12:03:24,988 [INFO] 2632323e-432g-dfg3-dwq3-y4dsfq3ew91b Another 1-line log
2013-02-12 12:03:25,121 [DEBUG] 263tgd3e-432g-dfg3-dwq3-y4dsfq3ew91b Yet another one line log.
tôi đang sử dụng tạo mã bảng bên ngoài sau:
CREATE EXTERNAL TABLE applogs (logdatetime STRING, logtype STRING, requestid STRING, verbosedata STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES
(
"input.regex" = "(\\A[[0-9:-] ]{19},[0-9]{3}) (\\[[A-Z]*\\]) ([0-9a-z-]*) (.*)?(?=(?:\\A[[0-9:-] ]{19},[0-9]|\\z))",
"output.format.string" = "%1$s \\[%2$s\\] %3$s %4$s"
)
STORED AS TEXTFILE
LOCATION 'hdfs:///logs-application';
Đây là điều:
Nó có thể kéo tất cả các LẦN ĐẦU TIÊN của mỗi nhật ký. Nhưng không phải các dòng nhật ký khác có nhiều hơn một dòng. Tôi đã thử tất cả các liên kết, thay thế \z
bằng \Z
ở cuối, thay thế \A
bằng ^
và \Z
hoặc \z
với $
, không có tác dụng. Tôi có thiếu một cái gì đó trong output.format.string của %4$s
? hoặc tôi không sử dụng regex đúng cách?
gì regex làm:
Nó phù hợp với dấu thời gian đầu tiên, tiếp theo là các loại log (DEBUG
hoặc INFO
hoặc bất cứ điều gì), thì ID
(hỗn hợp của trường hợp bảng chữ cái thấp hơn, con số và dấu gạch nối) tiếp theo là bất cứ điều gì, cho đến khi dấu thời gian tiếp theo được tìm thấy, hoặc cho đến khi kết thúc đầu vào được tìm thấy để khớp với mục nhập nhật ký cuối cùng. Tôi cũng đã thử thêm /m
vào cuối, trong trường hợp đó, bảng được tạo có tất cả các giá trị NULL.
tại sao bạn không tạo mảng cho em bé? (lol này không phải là ngay cả một động từ, nhưng stil ... bạn không thể đặt mỗi người vào một mảng? sau đó dòng đầu tiên sẽ là chìa khóa 0, thứ hai đa mục sẽ là 1, hai khác trong 2 và 3 và bạn có thể gọi chúng theo ý muốn) – user1576978