Python rdd.first()不会给出错误,但rdd.collect()会给出错误

Python rdd.first()不会给出错误,但rdd.collect()会给出错误,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我在pyspark工作,有以下代码,我正在处理tweet,并使用用户id和文本制作RDD。下面是代码 """ # Construct an RDD of (user_id, text) here. """ import json def safe_parse(raw_json): try: json_object = json.loads(raw_json) if 'created_at' in json_object:

我在pyspark工作,有以下代码,我正在处理tweet,并使用用户id和文本制作RDD。下面是代码

"""
# Construct an RDD of (user_id, text) here.
"""

import json

def safe_parse(raw_json):
    try:
        json_object = json.loads(raw_json)    
        if 'created_at' in json_object:
            return json_object
        else:
            return;
    except ValueError as error:
        return;


def get_usr_txt (line):

    tmp = safe_parse (line)

    return ((tmp.get('user').get('id_str'),tmp.get('text')));

usr_txt = text_file.map(lambda line: get_usr_txt(line))
print (usr_txt.take(5))
并且输出看起来正常(如下所示)

然而,只要我这样做

print (usr_txt.count())
我得到一个如下的错误

Py4JJavaError                             Traceback (most recent call last)
<ipython-input-60-9dacaf2d41b5> in <module>()    
  8 usr_txt = text_file.map(lambda line: get_usr_txt(line))
  9 #print (usr_txt.take(5))
---> 10 print (usr_txt.count())    
 11 

/usr/local/spark/python/pyspark/rdd.py in count(self)
   1054         3
   1055         """
-> 1056         return self.mapPartitions(lambda i: [sum(1 for _ in     i)]).sum()
   1057 
   1058     def stats(self):
Py4JJavaError回溯(最近一次调用)
在()
8 usr_txt=text_file.map(lambda行:get_usr_txt(行))
9#打印(usr#u txt.take(5))
--->10打印(usr_txt.count())
11
/usr/local/spark/python/pyspark/rdd.py计数(self)
1054         3
1055         """
->1056返回self.mapPartitions(lambda i:[sum(1表示i中的u)]).sum()
1057
1058 def状态(自身):

我缺少什么?是RDD没有正确创建?还是有其他东西?我如何修复它?

当解析的json行中没有创建的\u at元素或在解析过程中出现错误时,您已从
safe\u parse
方法返回了
None
。从
(tmp.get('user').get('id_str')、tmp.get('text'))
。这导致了错误的发生

解决方案是在
get\u usr\u txt
方法中检查
None

def get_usr_txt (line):
    tmp = safe_parse(line)
    if(tmp != None):
        return ((tmp.get('user').get('id_str'),tmp.get('text')));
现在的问题是为什么
print(usr\u txt.take(5))
显示结果,而
print(usr\u txt.count())
导致错误

这是因为
usr_txt.take(5)
只考虑了前五个RDD,而不考虑其他RDD,并且不必处理任何数据类型

def get_usr_txt (line):
    tmp = safe_parse(line)
    if(tmp != None):
        return ((tmp.get('user').get('id_str'),tmp.get('text')));