我有不一致的日志文件,我想使用动态分区与Hive进行分区。文件示例:
20/06/13 20:21:42.637 FLW CPTView :: OnInitialUpdate nRemoveAppShareQSize0 = 50000 \ n
20/06/13 20:21:42.638 FLW \ n
BandwidthGlobalSettings:Old Bandwidth common定义\ n
有时,日志文件包含以某个与日期不同的单词开头的行。每行用\ n。
分隔我正在运行命令:
CREATE EXTERNAL TABLE IF NOT EXISTS log_messages_temp (date STRING,time STRING,severity STRING,message STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\040' LOCATION '/examples/hive/tmp';
CREATE EXTERNAL TABLE IF NOT EXISTS log_messages_partitioned (time STRING,severity STRING,message STRING) PARTITIONED BY (date STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\040' LOCATION '/examples/hive/partitions';
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
FROM log_messages_temp pvs INSERT OVERWRITE TABLE log_messages_partitioned PARTITION(date) SELECT pvs.time, pvs.severity, pvs.message, pvs.date;
结果创建了两个动态分区:date = 20/06/13 and date = BandwidthGlobalSettings:Old
我想将Hive定义为忽略以非日期字符串开头的行。
我该怎么做?或者可能存在其他解决方案 感谢。
答案 0 :(得分:0)
我认为您可以编写一个UDF,它将使用正则表达式仅采用日期格式(例如:20/06/13)并丢弃所有其他类似“ BandwidthGlobalSettings:Old ”。您可以在插入最终表时在上一个查询中使用此UDF。
我希望这个解释有助于你的要求。