読み取るデータにヘッダーを付ける
以下のようなファイルを用意します。
わざと D,EF と書いて、この行だけカンマ(,)の数が合わないようにしています。
names
id,name,score
1,ABC,90
2,D,EF,80
3,GHI,95
このファイルが /data/test/input/ に置いてあるとします。
このファイルを spark-shell で読み込んでいきます。
ファイルを読み取る
ファイルの読み込みは以下のような書き方ができます。
データ型は "org.apache.spark.sql.DataFrame" です。
"header","true" オプションを指定することで、1行目をヘッダーとして読み取ります。
spark-shell
scala> val names = spark.read.option("header","true").csv("/data/test/input")
その読み取ったヘッダーは、スキーマのフィールド名に自動的に割り当てられます。
それぞれのフィールドのデータ型はデフォルトですべて String になるようです。
spark-shell
scala> names.printSchema
root
|-- id: string (nullable = true)
|-- name: string (nullable = true)
|-- score: string (nullable = true)
では、実際のデータの中身を見てみると...
spark-shell
scala> names.show
+---+----+-----+
| id|name|score|
+---+----+-----+
| 1| ABC| 90|
| 2| D| EF|
| 3| GHI| 95|
+---+----+-----+
やはり、2行名(id=2) のデータが、ズレています。
元データがこのような(2,D,EF,80)書き方をしていたため、当然の結果です。
読み取り時にエラーは出なかったため、単純に残った部分は読み取りされずに無視されているように思います。
区切り文字の検討
カンマ(,)は何かの文字列(名前)の中でよく使われるので、区切り文字以外では使われないという保証がない限り、区切り文字として使うのは適切ではないと思われます。
例えば、タブ区切りのファイルで読み書きしたい場合は、以下のオプションを付けることで容易に可能です。
option("delimiter", "\t")
Ex) 読み込むとき
scala> val names = spark.read.option("header","true").option("delimiter", "\t").csv("/data/test/input")