spark中使用uuid:一不小心就会掉坑里

背景

项目使用pyspark开发一个大数据的程序,读入hive数据,各种运算后,得到一些结果写回到hive。

程序中,有一步是调用uuid生成一个32位的唯一ID。

df = df.withColumn('uuid', F.udf(lambda x: str(x.uuid1())))

然后紧接着使用这个uuid作为外键,先groupby,然后与df进行了一次关联。

问题

上面的第2步,竟然关联不上。

这就奇怪了,明明是用的同样的字段进行关联,没理由啊。

后来看了下两个表,uuid的值都不一样。

再做了点试验,在jupyter里,不断地执行df.show(),发现每次show()出来的uuid值都在变。

真是目瞪口呆!

解决

查了下uuid的原理,uuid会根据当前的时间、随机数、MAC地址这些信息生成一个唯一的32位id,这样就保证不会重复。

在python里或者java里执行uuid,是没有问题的。生成后,不论打印多少次,值都不会变。

但是pyspark是惰性(lazy)的,代码每次都是从头执行的。

所以上面的两个表join的时候,uuid都是从头计算生成的。

暂时没有找到能“固定”这个字段不让它重新计算的方法,目前只能使用一个笨办法:

先把带有uuid的df保存到hive里,再load进来。

这样就不会变了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值