単純なCSVファイルからSparkデータセットを作成したいと思います。CSVファイルの内容は次のとおりです。
name,state,number_of_people,coolness_index
trenton,nj,"10","4.5"
bedford,ny,"20","3.3"
patterson,nj,"30","2.2"
camden,nj,"40","8.8"
データセットを作成するためのコードは次のとおりです。
var location = "s3a://path_to_csv"
case class City(name: String, state: String, number_of_people: Long)
val cities = spark.read
.option("header", "true")
.option("charset", "UTF8")
.option("delimiter",",")
.csv(location)
.as[City]
エラーメッセージは次のとおりです。「キャストをアップできませんnumber_of_people
文字列からbigintに切り捨てられる可能性があるため」
Databricksは、データセットの作成とこの特定のエラーメッセージについて このブログ投稿 で説明しています。
エンコーダーは、データが予想されるスキーマと一致することを熱心にチェックし、TBのデータを誤って処理しようとする前に、役立つエラーメッセージを提供します。たとえば、小さすぎるデータ型を使用しようとすると、オブジェクトへの変換によって切り捨てが発生します(つまり、numStudentsが最大値255を保持するバイトよりも大きい場合)、アナライザーはAnalysisExceptionを発行します。
Long
タイプを使用しているので、このエラーメッセージが表示されるとは思っていませんでした。
スキーマ推論を使用する:
val cities = spark.read
.option("inferSchema", "true")
...
またはスキーマを提供します。
val cities = spark.read
.schema(StructType(Array(StructField("name", StringType), ...)
またはキャスト:
val cities = spark.read
.option("header", "true")
.csv(location)
.withColumn("number_of_people", col("number_of_people").cast(LongType))
.as[City]
ケースクラスCity(name:String、state:String、number_of_people:Long)の場合、必要なのは1行だけです。
private val cityEncoder = Seq(City("", "", 0)).toDS
次に、コーディングします
val cities = spark.read
.option("header", "true")
.option("charset", "UTF8")
.option("delimiter",",")
.csv(location)
.as[City]
うまくいくでしょう。
これは公式ソースです[ http://spark.Apache.org/docs/latest/sql-programming-guide.html#overview] [1]