我在一个目录中有大量的镶木地板文件,它们代表相同数据模式的不同表格,我想将它们合并为一个大的RDD。理想情况下,我想在mapper发出小RDD并且reducer合并它们的地方做一个map reduce。但是,我无法弄清楚如何在映射器中发出RDD。有什么想法吗?
下面的第一行生成目录中的文件列表,第二行应该生成完整的RDD。但是,由于我认为您无法在地图实例中创建RDD,因此无法序列化错误。
arr = map(lambda x: ["/mnt/s3/rds/27jul2017-parquet/%s-%s-%s.parquet" % (x[0], x[1], x[2]), x[1].zfill(10), x[2].zfill(10)], map(lambda x: x.name.split('.')[0].split('-'), dbutils.fs.ls('/mnt/s3/rds/27jul2017-parquet/')))
result = sorted(arr, key=lambda x: x[1])
sc.parallelize(arr).map(lambda x: (1, spark.read.parquet(x[0]))).reduceByKey(lambda x,y: x.unionAll(y) )
答案 0 :(得分:2)
不是在spark.read.parquet
中指定文件指定目录,而是获取包含所有数据的数据帧(而不是RDD):
df = spark.read.parquet("/mnt/s3/rds/27jul2017-parquet/")
map
遍历您的RDD行以操作更改,如果您最终能够获得行数为数据帧的RDD,则无法加载文件...