以json格式解析推文以查找tweeter用户

时间:2018-05-19 10:20:13

标签: python json apache-spark twitter pyspark

我正在阅读json格式的tweeter feed以读取用户数量。 输入文件中的某些行可能不是推文,而是Twitter服务器发送给开发人员的消息(例如限制通知)。我需要忽略这些消息。

这些消息不包含created_at字段,可以相应地过滤掉。

我编写了以下代码片段,以提取有效的推文,然后提取user.id和文本。

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)
    if(tmp != None):
        return ((tmp.get('user').get('id_str'),tmp.get('text')))
    else:
        return

我的挑战是我得到一个名为"无"

的额外用户

这是一个示例输出(它是一个大文件)

  

(' 49838600','这是你在一个男人身上寻找的气质   可以使用我们的核武库。 ),,(' 2678507624',' RT   @GrlSmile:@ Ricky_Vaughn99是的,这就是1992年我改用的原因   共和党民主党人投票给Pat Buchanan,后者警告所有人   吨...&#39),

我正在努力寻找,我做错了什么。在tweeter文件中没有None,因此我假设我正在阅读 {"limit":{"track":1,"timestamp_ms":"1456249416070"}}但上面的代码不应该包含它,除非我遗漏了什么。

任何指针?感谢您的帮助和时间。

1 个答案:

答案 0 :(得分:0)

  

输入文件中的某些行可能不是推文,而是Twitter服务器发送给开发人员的消息(例如限制通知)。我需要忽略这些消息。

这并不完全是这样。如果发生以下情况之一:

  • raw_json不是有效的JSON文档
  • created_at不在解析对象中。

您使用默认值返回,即None。如果您想忽略这些,可以在两个操作之间添加filter步骤:

rdd.map(safe_parse).filter(lambda x: x).map(get_usr_txt)

您还可以使用flatMap技巧来避免filter并简化您的代码(从this answer zero323借用):

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

rdd.flatMap(safe_parse).map(get_usr_txt)