近日分析师提供一批样本数据,需要根据id和时间进行匹配,样本数据格式如下:
但是时间数仓中的数据时间却是年月日时分秒拼接而成的字符串,导致两者匹配失败,所以需要转换,数仓的数据:
-
不能使用hive 自带的date_format方法。 因为表中的月日时分秒前面没有补0,使用date_format会造成数据失真,例如下图时分秒的值是错误的:
(因为是时分秒不全,所以转换之前先拼接 :00 )
-
自定义一个spark的udf去实现,我用的python
from pyspark.sql.functions import udf
from pyspark.sql.types import StructType, StructField, StringType
# 实现过程 ,根据空格,冒号,斜杠分割,不够两位数的前面补0,然后再拼接起来,最后拼接00就可以
def get_new_applydatetime(x):
return '{}00'.format(''.join([str(z).zfill(2) for i in x.split('/') for j in i.split(' ') for z in j.split(':') ]))
# 注册成spark的udf
get_new_applydatetime_udf = udf(get_new_applydatetime,StringType())
# 使用spark的dataframe调用udf
df_sample = df_sample.withColumn("user_applydatetime_raw",get_new_applydatetime_udf("user_applydatetime"))
最终实现的结果:



