每当我重新启动系统时,它都会显示'utf-8'编解码器无法解码kafka中的字节0x98以产生火花

时间:2019-12-19 06:29:43

标签: apache-spark pyspark apache-kafka spark-streaming confluent-schema-registry

这是我下面的代码,用于从kafka获取数据以进行流式传输 首先它正在运行,但是当我重新启动系统时,它再次显示以下错误:

UnicodeDecodeError:'utf-8'编解码器无法解码位置5的字节0x98:无效的起始字节

from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
from pyspark.streaming.kafka import KafkaUtils
from confluent_kafka.avro.cached_schema_registry_client import CachedSchemaRegistryClient
from confluent_kafka.avro.serializer.message_serializer import MessageSerializer

schema_registry_client = CachedSchemaRegistryClient(url='http://0.0.0.0:8081')
serializer = MessageSerializer(schema_registry_client)
sc = SparkContext()
sc.setLogLevel("ERROR")
ssc = StreamingContext(sc, 2)



# def decoder(s):
#     decoded_message = serializer.decode_message(s)
#     return decoded_message

kvs = KafkaUtils.createDirectStream(ssc, ["demo.Appointment_Attendance.Patient"], {
                                "metadata.broker.list": "localhost:9092"}, 
                                 valueDecoder=serializer.decode_message)
keyDecoder=lambda x: x, valueDecoder=lambda x: x)
lines = kvs.map(lambda x: x[1])
lines.pprint()

ssc.start()
ssc.awaitTermination()

2 个答案:

答案 0 :(得分:0)

0x98是utf-8中的西里尔字母И,实际上,该字母由字节0xD0,0x98表示 在charset Windows-1251中0x98被描述为未定义。 您可以使用“И”访问字符串吗?您可以将其更改为小写字母“и”吗?另一种选择是将“И”替换为某些唯一的标记,例如== CYR_I ==,然后进行反向替换。

答案 1 :(得分:0)

发表评论以回答...

首先尝试仅消耗原始字节

topic = ssc [“ demo.Appointment_Attendance.Patient”] kvs = KafkaUtils.createDirectStream(topic,{“ metadata.broker.list”:“ localhost:9092”})

如果可行,请稍后再尝试通过map / mapValues

kvs.mapValues(lambda v: serializer.decode_message(v))

一旦可行,请尝试返回使用valueDecoder