web-dev-qa-db-ja.com

作成Spark CSVファイルからのデータセット

単純な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タイプを使用しているので、このエラーメッセージが表示されるとは思っていませんでした。

10
Powers

スキーマ推論を使用する:

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]
19
user6022341

ケースクラス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]

2
mingzhao.pro