2017-11-10 188 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