解析 json 格式的推文以查找推特用户
Parsing tweets in json format to find tweeter users
我正在阅读 json 格式的推特提要以读取用户数量。
输入文件中的某些行可能不是推文,而是 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
我的挑战是我得到了一位名为 "None"
的额外用户
这是一个示例输出(它是一个大文件)
('49838600', 'This is the temperament you look for in a guy who would
have access to our nuclear arsenal. ), None, ('2678507624', 'RT
@GrlSmile: @Ricky_Vaughn99 Yep, which is why in 1992 I switched from
Democrat to Republican to vote Pat Buchanan, who warned of all of
t…'),
我正在努力找出我做错了什么。高音扬声器文件中没有 None
,因此我假设我正在阅读
{"limit":{"track":1,"timestamp_ms":"1456249416070"}}
但上面的代码不应该包含它,除非我遗漏了什么。
有什么指点吗?并感谢您的帮助和时间。
Some lines in the input file might not be tweets, but messages that the Twitter server sent to the developer (such as limit notices). I need to ignore these messages.
事实并非如此。如果发生以下情况之一:
raw_json
不是有效的 JSON 文档
created_at
不在解析对象中。
你 return 的默认值为 None
。如果你想忽略这些,你可以在两个操作之间添加 filter
步骤:
rdd.map(safe_parse).filter(lambda x: x).map(get_usr_txt)
您还可以使用 flatMap
技巧来避免 filter
并简化您的代码(借用自 this answer by 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)
我正在阅读 json 格式的推特提要以读取用户数量。 输入文件中的某些行可能不是推文,而是 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
我的挑战是我得到了一位名为 "None"
的额外用户这是一个示例输出(它是一个大文件)
('49838600', 'This is the temperament you look for in a guy who would have access to our nuclear arsenal. ), None, ('2678507624', 'RT @GrlSmile: @Ricky_Vaughn99 Yep, which is why in 1992 I switched from Democrat to Republican to vote Pat Buchanan, who warned of all of t…'),
我正在努力找出我做错了什么。高音扬声器文件中没有 None
,因此我假设我正在阅读
{"limit":{"track":1,"timestamp_ms":"1456249416070"}}
但上面的代码不应该包含它,除非我遗漏了什么。
有什么指点吗?并感谢您的帮助和时间。
Some lines in the input file might not be tweets, but messages that the Twitter server sent to the developer (such as limit notices). I need to ignore these messages.
事实并非如此。如果发生以下情况之一:
raw_json
不是有效的 JSON 文档created_at
不在解析对象中。
你 return 的默认值为 None
。如果你想忽略这些,你可以在两个操作之间添加 filter
步骤:
rdd.map(safe_parse).filter(lambda x: x).map(get_usr_txt)
您还可以使用 flatMap
技巧来避免 filter
并简化您的代码(借用自 this answer by 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)