背景
项目使用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进来。
这样就不会变了。