在spark中运行嵌套作业

时间:2016-04-07 14:27:00

标签: json amazon-s3 apache-spark pyspark

我正在使用PySpark。我在s3上有一个gziped json文件列表,我必须访问,转换然后在镶木地板中导出到s3。每个json文件包含大约100k行,因此并行化它不会有多大意义(但我愿意将它并行化),但是有大约5k个文件可以并行化。我的方法是将json文件列表传递给脚本 - >在列表上运行并行化 - >运行地图(?这是我被阻止的地方)。如何访问和转换json从转换后的json中创建DF并将其作为镶木地板转储到s3中。

1 个答案:

答案 0 :(得分:0)

要以分布式方式阅读json,您需要在提及时并行化您的密钥。要在从s3阅读时执行此操作,您需要使用boto3。下面是如何操作的骨架草图。您可能需要修改distributedJsonRead以适合您的用例。

import boto3
import json
from pyspark.sql import Row

def distributedJsonRead(s3Key):
    s3obj = boto3.resource('s3').Object(bucket_name='bucketName', key=key)
    contents = json.loads(s3obj.get()['Body'].read().decode('utf-8'))
    return Row(**contents)

pkeys = sc.parallelize(keyList) #keyList is a list of s3 keys
dataRdd = pkeys.map(distributedJsonRead)

Boto3参考:http://boto3.readthedocs.org/en/latest/guide/quickstart.html

编辑:解决输入文件到输出文件的1:1映射

稍后,合并的镶木地板数据集可能更容易使用。但如果你需要这样做,你可以试试这样的事情

for k in keyList:
     rawtext = sc.read.json(k) # or whichever method you need to use to read in the data
     outpath = k[:-4]+'parquet'
     rawtext.write.parquet(outpath)

如果您想要json到镶木地板文件的1:1映射,我认为您将无法并行化这些操作。 Spark的读/写功能旨在由驱动程序调用,并且需要访问sc和sqlContext。这是另一个原因,为什么有一个镶木地板目录可能是要走的路。