web-dev-qa-db-ja.com

pysparkおよびHDFSコマンド

Sparkプログラム(Pyspark)の開始時にクリーンアップを実行したい。たとえば、以前のHDFS実行からデータを削除したい。pigでは、次のようなコマンドを使用してこれを実行できます。なので

fs -copyFromLocal ....

rmf /path/to-/hdfs

またはローカルでshコマンドを使用します。

Pysparkで同じことを行う方法を考えていました。

8
user3803714

フォームの例 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)
14
zero323

次のように、サードパーティの依存関係を使用せずに、hdfspysparkパスを削除できます。

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")
4

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'))

私の場合、他の解決策は機能しませんでしたが、このブログ投稿は役に立ちました:)

0
Zephro