Pyspark:json对象中的rdd

时间:2018-10-02 21:37:52

标签: python pyspark

这是家庭作业

hw2-files-10mb.txt是json数据

rdd = sc.textFile('./hw2-files-10mb.txt')
rdd = rdd.map(json.loads)

Output of rdd.take(1):

[{'created_at': 'Tue Feb 23 17:42:31 +0000 2016',
  'user': {'id': 470520068,
    'id_str': '470520068',
    'name': 'Marni Halasa',
    'screen_name': 'MarniHalasa1',
    'location': 'NYC',
....]

问题:

1)如何以rdd方式在“用户”中选择“ id_str”?

我尝试了将rdd映射到func的方法,该函数返回field_list = ['user.id_str'],但无法正常工作。

field_list = ['user.id_str', 'text']
def f(x):
d = {}
for k in x:
    if k in field_list:
        d[k] = x[k]
return d

rdd1 = rdd.map(f)

Output:
[{'text': "I'm voting 4 #BernieSanders bc he doesn't ride a CAPITALIST PIG adorned w/ #GoldmanSachs $. SYSTEM RIGGED CLASS WAR"}]

2)如何删除不存在'created_at'字段的推文?

我下面的代码不起作用。当我使用rdd.count()

时返回错误
rdd = rdd.filter(lambda row: row['created_at'] is not None)

我的预期输出:

1)删除所有损坏的推文(“ created_at”字段为空)

2)(user_id,文本)的一对RDD,其中user_id是用户字典的“ id_str”数据字段。

谢谢。

1 个答案:

答案 0 :(得分:0)

首先解决2)点,因为提取了'user.id_str''text'之后,将没有created_at字段可供过滤。

2)只需检查是否存在'created_at'。另外,您可以一次完成所有操作。

rdd = sc.textFile('./hw2-files-10mb.txt')\
            .map(json.loads)\
            .filter(lambda row: 'created_at' in row.keys())

1)您不需要从json对象提取值的函数。

rdd = rdd.map(lambda row:(row['user']['id_str'], 'text'))
print rdd.take(1)