# Filesystem 物件(pyspark 為例)

## hadoop 有提供對應的 java 物件供 hdfs 操作 “org.apache.hadoop.fs.FileSystem”

> ### 如果你今天是用 Java 那就是用 FileSystem 建立一個物件，來使用 filesystem 的方法。
>
> ### 無論你用 MapReduce 還是 Spark.
>
> ### 而若是使用其他語言，你只要能夠溝通到 jvm，讀到 java 的 class ，建立一個 java 物件即可，其實大同小異。

## **舉個例子，今天我使用 pyspark。**

> ### 因為 python 可以透過 py4j 與 java 溝通，透過py4j 提供的 java\_gateway，溝通到 jvm，就可以呼叫到我要取用的 java 物件。
>
> ### 常規的做法我建立一個 spark session，取出其中的 spark context，並透過 spark context 去讀 FileSystem 類別以及 config 物件
>
> ### 並以此建立對應的 file system 物件。
>
> ### 最後還要記得建立 Path 物件，才會正確讀到對應路徑。

### 程式範例如下

```
spark = SparkSession.builder\
.appName("Timothy test")\
.config("spark.some.config.option", "some-value")\
.getOrCreate();

sc = spark.sparkContext

FileSystem = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem

Configuration = sc._gateway.jvm.org.apache.hadoop.conf.Configuration

fs = FileSystem.get(Configuration())

set_path = sc._gateway.jvm.org.apache.hadoop.fs.Path
```

### 而後，便可以透過 fs 取用相對應的 hadoop 操作方法

### 比如

> * **檢察檔案存在與否，存在則回傳 True 不存在則回傳 False**
>
> ```
> fs.exists(set_path('<hdfs file path>'))
> ```
>
> * **重新命名，真正的動作是搬動(mv)**
>
> ```
> fs.rename(set_path("<from path>"), set_path("<destination path>"))
> ```
>
> * **刪除檔案**
>
> ```
> fs.delete(set_path(path), True)
> ```
>
> * **建立路徑**
>
> ```
> fs.mkdirs(set_path(path))
> ```
>
> 


