2017-11-29 4 views
0

여러 항목과 여러 열이 포함 된 가비지 값이 포함 된 드롭 레코드 ,하지만 여러 열의 여러 항목이있는 garbage value 양식 문자열을 제거하려고합니다.

샘플 코드 : -이 예에서

filter_list = ['$','#','%','@','!','^','&','*','null'] 

def filterfn(*x): 
    remove_garbage = list(chain(*[[filter not in elt for filter in 
    filter_list] for elt in x])) 
    return(reduce(lambda x,y: x and y, remove_garbage, True)) 

filter_udf = f.udf(filterfn, BooleanType()) 

original = original.filter(filter_udf(*[col for col in compulsory_fields])) 
original.show() 

는 "원래"내 원래 dataframe와 "compulsory_fields"입니다이 (가 여러 열을 저장하는) 내 배열입니다.

샘플 입력 : -

id  name   salary 
    #   Yogita   1000 
    2   Neha    ## 
    3   #Jay$deep##  8000 
    4   Priya   40$00& 
    5   Bhavana  $$%&^ 
    6   $%    $$&& 

샘플 출력 : -

id  name   salary 
    3   Jaydeep   8000 
    4   priya   4000 

답변

0

귀하의 요구 사항이 나에게 완전히 명확하지 않다, 그러나 당신이 유효 출력 레코드를 원하는 것 같다 "쓰레기"문자를 제거한 후

import pyspark.sql.functions as f 
from itertools import chain 
from pyspark.sql.functions import regexp_replace,col 
from pyspark.sql.types import BooleanType,StringType 

rdd = sc.parallelize((
    ('#','Yogita','1000'), 
    ('2', 'Neha', '##'), 
    ('3', '#Jay$deep##','8000'), 
    ('4', 'Priya', '40$00&'), 
    ('5', 'Bhavana', '$$%&^'), 
    ('6', '$%','$$&&')) 
) 

original = rdd.toDF(['id','name','salary']) 

filter_list = ['$','#','%','@','!','^','&','*','null'] 

compulsory_fields = ['id','name','salary'] 

def clean_special_characters(input_string):   
    cleaned_input = input_string.translate({ord(c): None for c in filter_list if len(c)==1}) 
    if cleaned_input == '': 
     return 'null' 
    return cleaned_input 

clean_special_characters_udf = f.udf(clean_special_characters, StringType()) 

original = original.withColumn('name', clean_special_characters_udf(original.name)) 
original = original.withColumn('salary', clean_special_characters_udf(original.salary)) 

def filterfn(*x): 
    remove_garbage = list(chain(*[[filter not in elt for filter in 
    filter_list] for elt in x])) 
    return(reduce(lambda x,y: x and y, remove_garbage, True)) 

filter_udf = f.udf(filterfn, BooleanType()) 

original = original.filter(filter_udf(*[col for col in compulsory_fields])) 
original.show() 

이 출력 :

+---+-------+------+ 
| id| name|salary| 
+---+-------+------+ 
| 3|Jaydeep| 8000| 
| 4| Priya| 4000| 
+---+-------+------+ 
당신은 당신의 filter_udf를 실행하기 전에 특수 문자를 제거하는 clean_special_characters UDF를 추가하여이 작업을 수행 할 수 있습니다
관련 문제