这是我下面的代码,用于从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()
答案 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