时间格式 :04/Jun/2021:22:11:18 +0800
这个时间是个并非Nginx的标准时间格式 ,原始的为 :[04/Jun/2021:22:11:18 +0800],可以在代码里面自行截取,使用subString方法.
1,自己实现UDF函数
2,打包上传到HDFS
3,创建UDF
1.1 导入maven依赖
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>hive-udf</id>
<url>https://maven.aliyun.com/repository/spring-plugin/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.3.7</version>
</dependency>
</dependencies>
1.2 创建Java类
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
@Description(
name = "formatNginxDate",
value = "_FUNC_(strNginxDate) - 输入格式为 04/Jun/2021:22:11:18 +0800",
extended = "格式化nginx日志时间:格式为 yyyy-MM-dd"
)
public class format_nginxDate extends UDF {
public String evaluate(String nginxTime){
String resTime = null;
try {
SimpleDateFormat dateFormat = null;
SimpleDateFormat resFormat = null;
if (nginxTime.trim().length() > 24) {
dateFormat = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z", Locale.ENGLISH);
// 转化为 Date
Date parseDate = dateFormat.parse(nginxTime);
//进行格式化
resFormat = new SimpleDateFormat("yyyy-MM-dd");
resTime = resFormat.format(parseDate);
}
}catch ( Exception e ){
return null;
}finally {
return resTime;
}
}
}
2.1 打包 mvn package
hive-udf-1.0-SNAPSHOT.jar
2.2 上传到HDFS
su hdfs
hdfs dfs -mkdir /lib
linux本地包路径 /developers/hive-udf-1.0-SNAPSHOT.jar
hdfs dfs -put /developers/hive-udf-1.0-SNAPSHOT.jar /lib
3,创建UDF函数
登录到Hive命令行
3.1 创建临时函数
add jar hdfs://nameservice1:8020/lib/hive-udf-1.0-SNAPSHOT.jar
如果添加不成功,去掉两头的单引号再次进行尝试
create temporary function format_nginxDate as 'com.tiens.hiveUDF.format_nginxDate';
3.2 创建永久函数
CREATE FUNCTION format_nginxDate AS 'com.tiens.hiveUDF.format_nginxDate' USING JAR 'hdfs://nameservice1:8020/lib/hive-udf-1.0-SNAPSHOT.jar';
3.3 删除函数
DROP FUNCTION IF EXISTS format_nginxDate
下一章:Nginx原始数据写入HDFS如何使用正则跟Hive表做映射