web-dev-qa-db-ja.com

Pysparkの複数のディレクトリから寄木細工のファイルを読み取る

親または子ディレクトリではない複数のパスから寄木細工のファイルを読み取る必要があります。

例えば、

_dir1 ---
       |
       ------- dir1_1
       |
       ------- dir1_2
dir2 ---
       |
       ------- dir2_1
       |
       ------- dir2_2
_

sqlContext.read.parquet(dir1)は、dir1_1およびdir1_2から寄木細工のファイルを読み取ります

現在、私は各ディレクトリを読み込んで、「unionAll」を使用してデータフレームをマージしています。 unionAllを使用せずにdir1_2とdir2_1から寄木細工のファイルを読み取る方法はありますか、またはunionAllを使用して特別な方法がありますか

ありがとう

7
joshsuihn

少し遅くなりましたが、検索中に見つけました。他の人の役に立つかもしれません...

引数リストをspark.read.parquet()にアンパックすることもできます

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

これは、いくつかのblobをパス引数に渡したい場合に便利です。

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)

これは、basePath内のすべてのファイルをリストする必要がなく、パーティションの推論ができるので便利です。

20
N00b

SQLContextの-​​ parquetFile メソッドとDataFrameReaderの-​​ parquet メソッドはどちらも複数のパスを使用します。したがって、これらの作品のいずれか:

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

または

df = sqlContext.read.parquet('/dir1/dir1_2', '/dir2/dir2_1')
7
John Conley

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
2
VenVig