簡體   English   中英

如何從python復制pyspark / hadoop中的文件

[英]How to copy a file in pyspark / hadoop from python

我正在使用pyspark將數據幀另存為實木復合地板文件或csv文件:

def write_df_as_parquet_file(df, path, mode="overwrite"):
    df = df.repartition(1)  # join partitions to produce 1 parquet file
    dfw = df.write.format("parquet").mode(mode)
    dfw.save(path)

def write_df_as_csv_file(df, path, mode="overwrite", header=True):
    df = df.repartition(1)  # join partitions to produce 1 csv file
    header = "true" if header else "false"
    dfw = df.write.format("csv").option("header", header).mode(mode)
    dfw.save(path)

但這會將parquet / csv文件保存在名為path的文件夾中,它以這種方式保存了一些我們不需要的其他文件:

在路徑中創建了4個文件,但我們只關心PARQUET文件

圖片: https : //ibb.co/9c1D8RL

基本上,我想創建一些函數,使用上述方法將文件保存到某個位置,然后將CSV或PARQUET文件移動到新位置。 喜歡:

def write_df_as_parquet_file(df, path, mode="overwrite"):
    # save df in one file inside tmp_folder
    df = df.repartition(1)  # join partitions to produce 1 parquet file
    dfw = df.write.format("parquet").mode(mode)
    tmp_folder = path + "TEMP"
    dfw.save(tmp_folder)

    # move parquet file from tmp_folder to path
    copy_file(tmp_folder + "*.parquet", path)
    remove_folder(tmp_folder)

我怎樣才能做到這一點? 如何實現copy_fileremove_folder 我在scala中看到了一些解決方案,為此使用了Hadoop api,但是我無法在python中完成這項工作。 我認為我需要使用sparkContext,但是我仍在學習Hadoop,但還沒有找到實現它的方法。

您可以使用Python的HDFS庫之一來連接到HDFS實例,然后執行所需的任何操作。

從hdfs3 docs( https://hdfs3.readthedocs.io/en/latest/quickstart.html ):

from hdfs3 import HDFileSystem
hdfs = HDFileSystem(host=<host>, port=<port>)
hdfs.mv(tmp_folder + "*.parquet", path)

將以上內容包裝在一個函數中,您一切順利。

注意:我只是以hdfs3為例。 您也可以使用hdfsCLI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM