'utf8'编解码器无法解码位置0的字节0xff:无效的起始字节pySpark Kafka

时间:2018-01-18 19:46:57

标签: python-2.7 apache-spark pyspark apache-kafka spark-streaming

kafkaStream = KafkaUtils.createStream(
    ssc,
    'zookeeperserver1.sys.net:2181,zookeeperserver2.sys.net:2181,zookeeperserver3.sys.net:2181,zookeeperserver4.sys.net:2181,zookeeperserver5.sys.net:2181,zookeeperserver6.sys.net:2181',
    'spark-streaming23',
    {'topic-name':3})

lines = kafkaStream.map(lambda x: x[1])
lines.pprint()

ssc.start()
ssc.awaitTermination()
  

文件“/usr/lib64/python2.7/encodings/utf_8.py”,第16行,在解码中返回codecs.utf_8_decode(输入,错误,True)UnicodeDecodeError:'utf8'编解码器无法解码字节0xff位置0:无效的起始字节

1 个答案:

答案 0 :(得分:2)

看起来键或值都不是UTF-8编码的。 createStreamcreateDirectStream都需要另外两个参数:

  
      
  • keyDecoder - 用于解码密钥的函数(默认为utf8_decoder)
  •   
  • valueDecoder - 用于解码值的函数(默认为utf8_decoder)
  •   

如您所见,两者都默认为utf8_decoder。如果

  • 您知道其中一个或两个都不是有效的UTF-8字符串,您可以提供自己的解码器,或只使用身份函数来获取原始输入:

    KafkaUtils.createStream(
        ssc, ..., keyDecoder=lambda x: x, valueDecoder=lambda x: x
    )
    
  • 如果您怀疑某些格式错误的条目存在问题,则可以将现有的decoder替换为一个处理解码异常的问题。围绕这些线的东西应该可以解决问题:

    from pyspark.streaming.kafka import utf8_decoder
    
    def safe_utf8_decode(s):
        try:
            return utf8_decoder(s)
        except UnicodeDecodeError:
            pass 
    

话虽如此,除非您寻找更高级的应用程序,DStreams仍然无法替代,否则我建议Structured Streaming