2017-11-29 4 views
0

複数の出現および複数の列を含むガーベッジ値しかし、私は複数の列に複数の出現を持つガーベジ・バリュー・フォームの文字列を削除したい。

サンプルコード: -

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() 

この例では「オリジナル」は、これは私の配列(これは複数の列として格納する)である私の元のデータフレームと「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を追加することによって、これを達成することができます