Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Spark流式处理和对流式字典执行操作_Python_Apache Spark_Spark Streaming - Fatal编程技术网

Python Spark流式处理和对流式字典执行操作

Python Spark流式处理和对流式字典执行操作,python,apache-spark,spark-streaming,Python,Apache Spark,Spark Streaming,奇怪的是,我想查看我正在输入的一系列词典中的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) 例如,我得到以下错

奇怪的是,我想查看我正在输入的一系列词典中的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)
例如,我得到以下错误:

File "/home/xx/spark-1.6.1/python/pyspark/rdd.py", line 1776, in combineLocally
    merger.mergeValues(iterator)
  File "/home/xx/spark-1.6.1/python/pyspark/shuffle.py", line 236, in mergeValues
    for k, v in iterator:
TypeError: 'int' object is not iterable

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

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

第二个
flatMap
调用(
json_format.flatMap
)肯定是个问题,因为
len(…)
总是返回
int
,因此它是最有可能的罪魁祸首。由于其目的似乎是执行到
int
(即长度)的1对1转换,因此您应该能够通过将
flatMap
替换为来解决该问题

第一个
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'>
>>类型(json.loads('{“asdf”:“qwerty”}'))
>>>类型(json.loads('[{“asdf”:“qwerty”}[1,2,3]]))
>>>类型(json.loads('3'))

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

第二个
flatMap
调用(
json_format.flatMap
)肯定是个问题,因为
len(…)
总是返回
int
,因此它是最有可能的罪魁祸首。由于其目的似乎是执行到
int
(即长度)的1对1转换,因此您应该能够通过将
flatMap
替换为来解决该问题

第一个
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'>
>>类型(json.loads('{“asdf”:“qwerty”}'))
>>>类型(json.loads('[{“asdf”:“qwerty”}[1,2,3]]))
>>>类型(json.loads('3'))