親または子ディレクトリではない複数のパスから寄木細工のファイルを読み取る必要があります。
例えば、
_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
を使用して特別な方法がありますか
ありがとう
少し遅くなりましたが、検索中に見つけました。他の人の役に立つかもしれません...
引数リストを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内のすべてのファイルをリストする必要がなく、パーティションの推論ができるので便利です。
SQLContext
の- parquetFile メソッドとDataFrameReader
の- parquet メソッドはどちらも複数のパスを使用します。したがって、これらの作品のいずれか:
df = sqlContext.parquetFile('/dir1/dir1_2', '/dir2/dir2_1')
または
df = sqlContext.read.parquet('/dir1/dir1_2', '/dir2/dir2_1')
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