Sparkプログラム(Pyspark)の開始時にクリーンアップを実行したい。たとえば、以前のHDFS実行からデータを削除したい。pigでは、次のようなコマンドを使用してこれを実行できます。なので
fs -copyFromLocal ....
rmf /path/to-/hdfs
またはローカルでshコマンドを使用します。
Pysparkで同じことを行う方法を考えていました。
フォームの例 subprocess.call
または sh
library を使用して、任意のシェルコマンドを実行できるため、次のように問題なく動作するはずです。
import subprocess
some_path = ...
subprocess.call(["hadoop", "fs", "-rm", "-f", some_path])
Python 2.xを使用する場合は、 spotify/snakebite
を使用してみることができます:
from snakebite.client import Client
Host = ...
port = ...
client = Client(Host, port)
client.delete(some_path, recurse=True)
hdfs3
は、同じことを行うために使用できるさらに別のライブラリです。
from hdfs3 import HDFileSystem
hdfs = HDFileSystem(Host=host, port=port)
HDFileSystem.rm(some_path)
Apache Arrow Python bindings は最新のオプションです(これは、pandas_udf
に必要なため、Spark clusterですでに利用可能であることがよくあります。 )::
from pyarrow import hdfs
fs = hdfs.connect(Host, port)
fs.delete(some_path, recursive=True)
次のように、サードパーティの依存関係を使用せずに、hdfs
のpyspark
パスを削除できます。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('abc').getOrCreate()
sc = spark.sparkContext
fs = (sc._jvm.org
.Apache.hadoop
.fs.FileSystem
.get(sc._jsc.hadoopConfiguration())
)
path = "Your/hdfs/path"
fs.delete(sc._jvm.org.Apache.hadoop.fs.Path(path), True)
さらに一歩改善するために、上記のアイデアをヘルパー関数にラップして、ジョブ/パッケージ間で再利用できます。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('abc').getOrCreate()
def delete_path(spark, path):
sc = spark.sparkContext
fs = (sc._jvm.org
.Apache.hadoop
.fs.FileSystem
.get(sc._jsc.hadoopConfiguration())
)
fs.delete(sc._jvm.org.Apache.hadoop.fs.Path(path), True)
delete_path(spark, "Your/hdfs/path")
from https://diogoalexandrefranco.github.io/interacting-with-hdfs-from-pyspark/ PySparkのみを使用
######
# Get fs handler from Java gateway
######
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
fs = FileSystem.get(URI("hdfs://somehost:8020"), sc._jsc.hadoopConfiguration())
# We can now use the Hadoop FileSystem API (https://hadoop.Apache.org/docs/current/api/org/Apache/hadoop/fs/FileSystem.html)
fs.listStatus(Path('/user/Hive/warehouse'))
# or
fs.delete(Path('some_path'))
私の場合、他の解決策は機能しませんでしたが、このブログ投稿は役に立ちました:)