regex—使用python标识表中的加密列

ufj5ltwl  于 2021-05-29  发布在  Spark
关注(0)|答案(0)|浏览(223)

我有一个表,其中一些列是加密的。例如,first_name列是加密的,因此该列的示例值类似于&w1myjn/!加密是随机使用字母数字和特殊字符。空值不加密。我需要创建一个应用程序,这样当我输入表名时,它将列出表中所有加密的列。
目前,我正在使用python获取dataframe中的所有数据,然后迭代每列的df,并计算特殊字符旁边的特殊字符的行数。然后我将这个计数除以非空行的总数,得到%,如果它大于30,则分类为加密列。如果df有<10k行,那么这段代码就可以工作,但是我需要将它应用到有数十亿行的表中。对于这么大的表,我的代码运行了几个小时。我不能使用数据的子集,因为该子集可能包含所有空值,所以我需要使用所有行获取%。
如何优化此代码?有没有办法让spark df列并行运行?
下面是我的代码:

def getAvg(col_name):
    li=[]
    total_cnt=0
    null_cnt=0

    for index,row in df_member_details.iterrows():
        val = str(row[col_name]).strip()
        val_len = int(len(str(val).strip()))
        if val_len>0 and val != "null" :
            total_cnt += 1  
        else:
            null_cnt += 1            
        regex=0
        for i in range(val_len-1):
            if not val[i].isalnum() and not val[i+1].isalnum() and val[i]!= " " and val[i+1]!= " ":
                regex += 1    
        li.append(regex)
    if total_cnt == 0:
        op=0
    elif (null_cnt/num_rows)>0.7:
        op="too many nulls"
    else:
        op = round((sum(li)/total_cnt)*100,2)
    return op

op=[]

op.append("col_name | Encrypted")
for k,v in d.items():
    if v=="too many nulls":
        op.append(str(k) + '|' + 'too many nulls, please check manually')
    elif v>30:
        op.append(str(k) + '|' + 'Y')

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题