Hive将带有斜杆的时间拼接成字符串
遇到的问题近日分析师提供一批样本数据,需要根据id和时间进行匹配,样本数据格式如下:但是时间数仓中的数据时间却是年月日时分秒拼接而成的字符串,导致两者匹配失败,所以需要转换,数仓的数据:解决问题分析过程:不能使用hive 自带的date_format方法。 因为表中的月日时分秒前面没有补0,使用date_format会造成数据失真,例如下图时分秒的值是错误的:(因为是时分秒不全,所以转换之前先拼接
·
遇到的问题
近日分析师提供一批样本数据,需要根据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())
df_sample = df_sample.withColumn("user_applydatetime_raw",get_new_applydatetime_udf("user_applydatetime"))
# 方法二:注册成spark-sql可用的udf
spark.udf.register("user_applydatetime_hive",get_new_applydatetime)
df_sample.createOrReplaceTempView('t1')
spark.sql("""select user_applydatetime_hive(user_applydatetime) from t1 """).show()
最终实现的结果:
更多推荐
所有评论(0)