タイトル通り。私はtextFileを知っていますが、名前が示すように、テキストファイルでのみ機能します。 HDFSのパス(またはローカルパス)内のファイル/ディレクトリにアクセスする必要があります。私はpysparkを使用しています
手伝ってくれてありがとう
Sparkは、データの読み込みを開始するドメインを備えたデータ処理ツールとしてのみ考えてください。多くの形式を読み取ることができ、Hadoop glob式をサポートしています。 HDFSの複数のパスから読み取るのに便利ですが、ディレクトリやファイルを走査するための組み込み機能はありません。また、HadoopやHDFSとのやり取りに固有のユーティリティもありません。
esutil や hdfs など、必要なことを行うための利用可能なツールがいくつかあります。 hdfs libはCLIとAPIの両方をサポートします。「PythonでHDFSファイルを一覧表示する方法」に直接ジャンプできます here 。次のようになります。
from hdfs import Config
client = Config().get_client('dev')
files = client.list('the_dir_path')
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())
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
Snakebiteライブラリを使用してこれを行う簡単な方法があります
from snakebite.client import Client
hadoop_client = Client(HADOOP_Host, HADOOP_PORT, use_trash=False)
for x in hadoop_client.ls(['/']):
... print x