spark-shell RDD から DataSet に変換し csv で出力

spark-shell を使っていきます。

#### spark のバージョン

```bash:spark-shell
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.1.2.6.2.0-205
      /_/
         
```

#### 読み込み対象のテキスト

```bash:directories.txt
Documents
metastore_db
derby.log
Downloads
dev
anaconda3
Music
Pictures
Public
Templates
Videos
Desktop
```

#### 読み込み用のRDD生成 (textFile)

```bash:spark-shell
scala> val dirRDD = sc.textFile("/data/test/input/directories.txt")
```

#### RDD -> Dataset に変換 (createDataset)
```bash:spark-shell
scala> val ds = spark.createDataset(dirRDD)
```

#### csv で出力 (write)
```bash:spark-shell
scala> import org.apache.spark.sql.SaveMode
scala> ds.write.mode(SaveMode.Overwrite).csv("/data/test/output/")
```

#### 出力されたファイルの中身
当然ながら入力ファイルと同じ中身です。

```bash:spark-shell
$ hdfs dfs -ls /data/test/output
-rw-r--r--   1 root supergroup          0 2020-01-08 13:37 /data/test/output/_SUCCESS
-rw-r--r--   1 root supergroup         57 2020-01-08 13:37 /data/test/output/part-00000-13260eaf-2b01-42b8-a115-ac8d4b02b446.csv
-rw-r--r--   1 root supergroup         47 2020-01-08 13:37 /data/test/output/part-00001-13260eaf-2b01-42b8-a115-ac8d4b02b446.csv

$ hdfs dfs -text /data/test/output/part*.csv
Documents
metastore_db
derby.log
Downloads
dev
anaconda3
Music
Pictures
Public
Templates
Videos
Desktop
```

#### パーティション数を増やして出力してみる
上書きモード(SaveMode.Overwrite)なので、先に出力したファイルは全て削除されています。
出力されたファイル数が２⇒５に増えましたが、中身は同じです（出力順は違います）。

```bash:spark-shell
scala> ds.repartition(5).write.mode(SaveMode.Overwrite).csv("/data/test/output/")
```

```bash:spark-shell
$ hdfs dfs -ls /data/test/output
-rw-r--r--   1 root supergroup          0 2020-01-08 13:44 /data/test/output/_SUCCESS
-rw-r--r--   1 root supergroup         11 2020-01-08 13:44 /data/test/output/part-00000-b9857e24-5565-4689-94da-6cfb851cebff.csv
-rw-r--r--   1 root supergroup         34 2020-01-08 13:44 /data/test/output/part-00001-b9857e24-5565-4689-94da-6cfb851cebff.csv
-rw-r--r--   1 root supergroup         22 2020-01-08 13:44 /data/test/output/part-00002-b9857e24-5565-4689-94da-6cfb851cebff.csv
-rw-r--r--   1 root supergroup         17 2020-01-08 13:44 /data/test/output/part-00003-b9857e24-5565-4689-94da-6cfb851cebff.csv
-rw-r--r--   1 root supergroup         20 2020-01-08 13:44 /data/test/output/part-00004-b9857e24-5565-4689-94da-6cfb851cebff.csv

# 中身は同じ
$ hdfs dfs -text /data/test/output/part*.csv
dev
Videos
Documents
anaconda3
Music
Desktop
metastore_db
Pictures
derby.log
Public
Downloads
Templates
```

#### パーティション数を減らして出力してみる
上書きモード(SaveMode.Overwrite)なので、先に出力したファイルは全て削除されています。
出力されたファイル数が５⇒３に減りましたが、中身は同じです（出力順は違います）。

```bash:spark-shell
scala> ds.repartition(3).write.mode(SaveMode.Overwrite).csv("/data/test/output/")
```

```
$ hdfs dfs -ls /data/test/output
-rw-r--r--   1 root supergroup          0 2020-01-08 13:49 /data/test/output/_SUCCESS
-rw-r--r--   1 root supergroup         35 2020-01-08 13:49 /data/test/output/part-00000-9fde0122-727b-428f-8a92-933d65a3554e.csv
-rw-r--r--   1 root supergroup         36 2020-01-08 13:49 /data/test/output/part-00001-9fde0122-727b-428f-8a92-933d65a3554e.csv
-rw-r--r--   1 root supergroup         33 2020-01-08 13:49 /data/test/output/part-00002-9fde0122-727b-428f-8a92-933d65a3554e.csv

# 中身は同じ
$ hdfs dfs -text /data/test/output/part*.csv
derby.log
anaconda3
Public
Desktop
Documents
Downloads
Music
Templates
metastore_db
dev
Pictures
Videos
```

#### index 列を追加してみる
今は一列のみ存在しています。

```bash:spark-shell
scala> ds.printSchema
root
 |-- value: string (nullable = true)
```

id 列が追加されました。

```bash:spark-shell
scala> import org.apache.spark.sql.functions._
scala> dsWithIndex = ds.withColumn("id",monotonicallyIncreasingId)
scala> dsWithIndex.printSchema
root
 |-- value: string (nullable = true)
 |-- id: long (nullable = false)
```

出力してみると...

```bash:spark-shell
scala> dsWithIndex.write.mode(SaveMode.Overwrite).csv("/data/test/output/")
```

csv 形式なのは確認できましたが、インデックスの値が途中から値がバグってしまっています。何か間違えたのか。。。

```
Documents,0
metastore_db,1
derby.log,2
Downloads,3
dev,4
anaconda3,5
Music,8589934592
Pictures,8589934593
Public,8589934594
Templates,8589934595
Videos,8589934596
Desktop,8589934597
```