我们在业务上 经常要不断的进行多张表的连接 查询,
比如 我们的 五要素,
我们使用 姓名作为 连接的数据,不好意思,姓名在中国基本会经常重复,
使用手机号,也不可以,手机号经常更换,可能 半年后的手机号就易主了,这样造成数据的匹配错误,
使用 银行卡号,也不好,万一此人没有银行卡号呢,或者银行卡 挂失再易主呢,,或者有附属卡存在。
那使用身份证号呢,一般人都有吧,这个基本不会重复,确实,不过有时候我们从客户那里拿不到身份证 这就无解了,
申请日期就更不可以了,同一天大量申请 肯定重复多了,以上单个都不可以,
那用 业务 id 比如主键呢,也不可以,不同库表 业务主键没有统一,另外 hive 本身也没有主键id 这个东西,那怎么办 ,
要不我们把五要素拼到一起怎么样,也不可以,太繁琐,这个很容易出错,
我们最后希望 ,可以由位数固定,基本不会重复的一段没有业务意义却可以代表区分 不同数据的,
好,当然就是一段 hash ,谁来生成 MD5 sha1都可以的,
业内通用 MD5,
我们在使用md5的时候,一定要确定这个md5 工具的稳定性 鲁棒性 扩展性,不可以经常更改,否则 再与之前的数据匹配就老困难了。
比如 五要素要必须是文本 ,不可以是数字 格式 时间格式,否则生成的md5 也是不一样的。
文本 统一 英文字符是否大型,五要素 拼接时中间是否要有空格,五要素 拼接的顺序 都要确定下来。
import hashlib
def md5s(text):
... m=hashlib.md5()
... print(text)
... m.update(("%s"%text).encode('utf-8'))
... return m.hexdigest()
大部分我们的数据在pandas 的dataframe中,如果使用for 来一条条遍历有点麻烦,不过 pandas 给我们 自带了 批量作用dataframe的方法 apply()
df['gid']=df[[ '姓名', 'id', 'mobile', 'card', 'apply']].apply(lambda x: md5s(x),axis=1)
参考这个
https://stackoverflow.com/questions/13331698/how-to-apply-a-function-to-two-columns-of-pandas-dataframe?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
上面的一个缺点是 拼接的时候没有空格 \t
如果你想要有空格 其实也是有办法的,就专门让某一列全是空格,作为拼接的元素放到里面就可以了