2017-11-10 146 views
0

我使用上Pyspark以下代码导入从BigQuery资料:RDD JSON文件处理

table_data = sc.newAPIHadoopRDD(
    'com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat', 
    'org.apache.hadoop.io.LongWritable', 
    'com.google.gson.JsonObject', 
    conf=conf) 

输出是RDD框架,但具有在JSON格式数据:

[(0, u'{"colA":"Value1,Value4"}'), (52, u'{"colA":"Value2"}')] 

我需要以RDD格式提取所有。主要关注的是由此产生的RDD不应该包含每个记录的双引号。

要求:

Value1,Value4 
Value2 

,而不是:

"Value1,Value4" 
"Value2" 
+1

你能告诉你的结果在一个有效的Python数据结构?你是否需要返回另一个rdd? – Psidom

+0

我需要一个RDD,因为我将使用MLlib来实现算法。 – Nivi

+0

如果json被一个“,”分开,那么它的返回类型将是'str'。你怎么知道每个'Value'的类型,比如float,int,str等等? –

回答

1

从我从你的问题理解的,这是你在找什么用于:

import json 
data = sc.parallelize([(0, u'{"colA":"Value1,Value4"}'), (52, u'{"colA":"Value2"}')]) 
data = data.map(lambda x: (json.loads(x[1])['colA'])) 
print(data.collect()) 

结果:

['Value1,Value4', 'Value2'] 
+0

是否有可能将此列表作为列表列表? [['Value1,Value4'],[Value2']] – Nivi

+1

您可以在json返回中添加'split',类似'json.loads(x [1])['colA']。split(',' )'。或者,如果你不想分开值,那么转换为列表应该已经可以工作:'[json.loads(x [1])['colA']]' –

1

可能与json模块加载:

import json 

table_data.map(lambda t: json.loads(t[1]).get("colA")).collect() 
# [u'Value1,Value4', u'Value2'] 
+1

我会尝试它,并让你知道在某些时候,如果这工作,因为我目前内存不足。谢谢你的时间。 – Nivi

+0

它的工作原理。谢谢! – Nivi