【问题标题】:How to delete non-printable character in rdd using pyspark如何使用pyspark删除rdd中的不可打印字符
【发布时间】:2018-03-20 15:30:09
【问题描述】:

需要从 rdd 中删除不可打印的字符。

示例数据如下

"@TSX•","None"
"@MJU•","None"

预期输出

@TSX,None
@MJU,None

尝试了下面的代码,但它不起作用

sqlContext.read.option("sep", ","). \
                option("encoding", "ISO-8859-1"). \
                option("mode", "PERMISSIVE").csv(<path>).rdd.map(lambda s: s.replace("\xe2",""))

【问题讨论】:

    标签: apache-spark pyspark rdd


    【解决方案1】:

    您可以使用sparkContexttextFile 函数和string.printable从字符串中删除所有特殊字符

    import string
    sc.textFile(inputPath to csv file)\
        .map(lambda x: ','.join([''.join(e for e in y if e in string.printable).strip('\"') for y in x.split(',')]))\
        .saveAsTextFile(output path )
    

    说明

    对于您的输入行 "@TSX•","None"
    for y in x.split(',') 将字符串行拆分["@TSX•", "None"] 其中y 表示迭代时数组中的每个元素
    for e in y if e in string.printable 检查y 中的每个字符 是否可打印
    如果可打印则 字符连接起来形成一串可打印字符
    .strip('\"') 从可打印字符串中删除前面和结尾的引号
    最后,字符串列表由','.join([''.join(e for e in y if e in string.printable).strip('\"') for y in x.split(',')])

    转换为逗号分隔字符串

    希望解释清楚明白

    【讨论】:

    • 代码正在运行,但在这里我只需要删除不可打印的字符,我需要此数据中的特殊字符。有办法吗?
    • 错误:.map(lambda x: ','.join([filter(lambda e: e in string.printable, y) for y in x.split(',')])) \ TypeError: sequence item 0: expected str instance, filter found
    • 无法低于输出:,
    • 它工作得很好:) 你能详细说明你的代码吗?我很容易理解每​​个部分
    • 我已经尽可能多地解释了@LUZO
    【解决方案2】:

    一种选择是尝试使用string.printable 过滤您的文本:

    import string
    sqlContext.read\
        .option("sep", ",")\
        .option("encoding", "ISO-8859-1")\
        .option("mode", "PERMISSIVE")\
        .csv(<path>)\
        .rdd\
        .map(lambda s: filter(lambda x: x in string.printable, s))
    

    示例

    import string
    rdd = sc.parallelize(["TSX•,None","MJU•,None", "!@#ABC,*()XYZ"])
    
    print(rdd.map(lambda s: filter(lambda x: x in string.printable, s)).collect())
    #['TSX,None', 'MJU,None', '!@#ABC,*()XYZ']
    

    参考文献

    【讨论】:

    • 我不想删除特殊字符。有办法吗?
    • @LUZO 这个解决方案删除特殊字符。 string.printable 包括所有可以打印的字符。 filter 语句仅删除在 string.printable 中找不到的字符。请尝试一下,让我知道它是否有效。
    • @LUZO 我已经更新了我提供的示例,以表明此解决方案保留了特殊字符。
    • 我已经试过你的代码了。我收到错误消息:AttributeError: Can't pickle local object '..'
    • 这似乎与不可打印字符问题无关。我怀疑您正在使用的代码更多但您没有共享。您可以发布编辑问题并添加完整代码吗?
    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2017-06-12
    • 2019-10-31
    相关资源
    最近更新 更多