2016-05-16 68 views
3

我需要从多个不是父目录或子目录的路径读取实木复合地板文件。从Pyspark中的多个目录读取实木复合地板文件

例如,

dir1 --- 
     | 
     ------- dir1_1 
     | 
     ------- dir1_2 
dir2 --- 
     | 
     ------- dir2_1 
     | 
     ------- dir2_2 

sqlContext.read.parquet(dir1)从dir1_1地板读取文件和dir1_2

现在我在读每个目录和合并使用 “unionAll” dataframes。 有没有一种方法来读取dir1_2和dir2_1拼花文件,而不使用unionAll或有使用unionAll

感谢

回答

5

两者的SQLContextparquetFile方法和DataFrameReaderparquet方法采取多条路径任何花哨的方式。因此,无论这些作品:

df = sqlContext.parquetFile('/dir1/dir1_2', '/dir2/dir2_1') 

df = sqlContext.read.parquet('/dir1/dir1_2', '/dir2/dir2_1') 
6

有点晚,但我发现这一点的同时我正在寻找它可以帮助别人......

您也可以尝试拆包参数列表为spark.read.parquet()

paths=['foo','bar'] 
df=spark.read.parquet(*paths) 

如果你想通过几个blobs进入路径参数:

basePath='s3://bucket/' 
paths=['s3://bucket/partition_value1=*/partition_value2=2017-04-*', 
     's3://bucket/partition_value1=*/partition_value2=2017-05-*' 
     ] 
df=spark.read.option("basePath",basePath).parquet(*paths) 

这是很酷的,因为你并不需要列出的基本路径中的所有文件,你仍然可以得到分区推断。

+0

当我使用这段代码时,它正在搜索/ home /目录中的目录,你可以发布整个语法吗? – Viv

+0

@N00b当我尝试这段代码时,它给了我一个错误,即加载只需要4个参数,但我有我的路径到24个文件..是否有一个选项可以覆盖此。我正在尝试不执行多个加载和一个联合,这就是为什么我想使用加载将多个文件放入df –

0

只要考虑John Conley的回答,并对其进行修饰并提供完整的代码(用于Jupyter PySpark),因为我发现他的答案非常有用。

from hdfs import InsecureClient 
client = InsecureClient('http://localhost:50070') 

import posixpath as psp 
fpaths = [ 
    psp.join("hdfs://localhost:9000" + dpath, fname) 
    for dpath, _, fnames in client.walk('/eta/myHdfsPath') 
    for fname in fnames 
] 
# At this point fpaths contains all hdfs files 

parquetFile = sqlContext.read.parquet(*fpaths) 


import pandas 
pdf = parquetFile.toPandas() 
# display the contents nicely formatted. 
pdf 
相关问题