web-dev-qa-db-ja.com

Pyspark:HDFSパス上のファイル/ディレクトリのリストを取得

タイトル通り。私はtextFileを知っていますが、名前が示すように、テキストファイルでのみ機能します。 HDFSのパス(またはローカルパス)内のファイル/ディレクトリにアクセスする必要があります。私はpysparkを使用しています

手伝ってくれてありがとう

16
Federico Ponzi

Sparkは、データの読み込みを開始するドメインを備えたデータ処理ツールとしてのみ考えてください。多くの形式を読み取ることができ、Hadoop glob式をサポートしています。 HDFSの複数のパスから読み取るのに便利ですが、ディレクトリやファイルを走査するための組み込み機能はありません。また、HadoopやHDFSとのやり取りに固有のユーティリティもありません。

esutilhdfs など、必要なことを行うための利用可能なツールがいくつかあります。 hdfs libはCLIとAPIの両方をサポートします。「PythonでHDFSファイルを一覧表示する方法」に直接ジャンプできます here 。次のようになります。

from hdfs import Config
client = Config().get_client('dev')
files = client.list('the_dir_path')
12
Tristan Reid

JVMゲートウェイの使用はそれほどエレガントではないかもしれませんが、場合によっては以下のコードが役立つことがあります。

URI           = sc._gateway.jvm.Java.net.URI
Path          = sc._gateway.jvm.org.Apache.hadoop.fs.Path
FileSystem    = sc._gateway.jvm.org.Apache.hadoop.fs.FileSystem
Configuration = sc._gateway.jvm.org.Apache.hadoop.conf.Configuration


fs = FileSystem.get(URI("hdfs://somehost:8020"), Configuration())

status = fs.listStatus(Path('/some_dir/yet_another_one_dir/'))

for fileStatus in status:
    print(fileStatus.getPath())
35
volhv

PySpark を使用すると、コマンドをインタラクティブに実行できます


選択したディレクトリのすべてのファイルをリストします。

hdfs dfs -ls <path>例:hdfs dfs -ls /user/path

import os
import subprocess

cmd = 'hdfs dfs -ls /user/path'
files = subprocess.check_output(cmd, Shell=True).strip().split('\n')
for path in files:
  print path

または、選択したディレクトリ内のファイルを検索します。

hdfs dfs -find <path> -name <expression>例:hdfs dfs -find /user/path -name *.txt

import os
import subprocess

cmd = 'hdfs dfs -find {} -name *.txt'.format(source_dir)
files = subprocess.check_output(cmd, Shell=True).strip().split('\n')
for path in files:
  filename = path.split(os.path.sep)[-1].split('.txt')[0]
  print path, filename
14
Darius M.

ディレクトリ内のallファイルを読み込む場合は、sc.wholeTextFiles[doc] 。ただし、ファイルの内容は単一行の値に読み込まれることに注意してください。これはおそらく望ましい結果ではありません。

一部のファイルのみを読み取りたい場合は、パスのリストを生成し(通常のhdfs lsコマンドと必要なフィルタリングを使用して)、sqlContext.read.text[doc] そしてDataFrameからRDDに変換するのが最良のアプローチのようです。

3
Matthew Graves

Snakebiteライブラリを使用してこれを行う簡単な方法があります

from snakebite.client import Client

hadoop_client = Client(HADOOP_Host, HADOOP_PORT, use_trash=False)

for x in hadoop_client.ls(['/']):

...     print x
0
Hgottipati