我有一个表,其中一些列是加密的。例如,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')
暂无答案!
目前还没有任何答案,快来回答吧!