Spark流媒体和在流式词典上执行操作

2024-04-26 10:44:32 发布

您现在位置:Python中文网/ 问答频道 /正文

奇怪的是,我想看看我正在输入的一系列字典中k,v对的数量,但是我发现我似乎做不到。在

lines = ssc.socketTextStream("127.0.0.1", 5006) 
json_format = lines.flatMap(lambda recieved: json.loads(recieved))
dict_format = json_format.flatMap(lambda x : len(x) ).reduce(lambda a, b: a+b)

例如,我得到以下错误:

^{2}$

我可以假设我们有一系列的字典-json.loads()中没有失败,但我似乎不能接受这个简单的长度。在


Tags: lambdajsonformatreduce数量len字典错误
1条回答
网友
1楼 · 发布于 2024-04-26 10:44:32

Spark期望提供给^{}的函数将为它从源RDD/DStream处理的每个元素返回一个可遍历/可遍历的结果(例如列表)。发生TypeError: 'int' object is not iterable错误的原因可能是Spark试图迭代从传递给flatMap的lambda之一返回的不可编辑值。在

第二个flatMap调用(json_format.flatMap)肯定是个问题,因为len(...)总是返回一个int,因此它是这里最有可能的罪魁祸首。因为它的意图似乎是对int(即长度)执行1对1的转换,所以您应该能够通过将flatMap替换为^{}来解决这个问题。在

第一个调用是否有效取决于输入。如果您确定源文件中的每一行都是一个将解析为JSON数组的字符串,那么它应该可以正常工作。但是,如果对文件中任何一行的JSON解析将生成一个类型而不是数组,那么解析函数将向flatMap发送一个不可编辑的结果,作业将失败,并出现与您当前看到的类似的错误:

>>> type(json.loads('{"asdf": "qwerty"}'))
<class 'dict'>
>>> type(json.loads('[{"asdf": "qwerty"}, [1,2,3]]'))
<class 'list'>
>>> type(json.loads('3'))
<class 'int'>

相关问题 更多 >