遇到的问题

近日分析师提供一批样本数据,需要根据id和时间进行匹配,样本数据格式如下:
在这里插入图片描述
但是时间数仓中的数据时间却是年月日时分秒拼接而成的字符串,导致两者匹配失败,所以需要转换,数仓的数据:
在这里插入图片描述

解决问题分析过程:

  1. 不能使用hive 自带的date_format方法。 因为表中的月日时分秒前面没有补0,使用date_format会造成数据失真,例如下图时分秒的值是错误的:
    (因为是时分秒不全,所以转换之前先拼接 :00 )
    在这里插入图片描述

  2. 自定义一个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()

最终实现的结果:
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐