2016-09-16 16 views
5

単純なCSVファイルからSpark Datasetを作成したいとします。ここでは、CSVファイルの内容は以下のとおりです。ここでCSVファイルからSpark Datasetを作成

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] 

は、エラーメッセージは次のとおりです。「それはよいとしてアップBIGINTする文字列からnumber_of_peopleをキャストすることはできません

Databricksは、データセットとこの特定のエラーメッセージを作成する方法について説明しています(this blog post)。

エンコーダは熱心にあなたがデータの誤っ プロセスのTBにしようとする前に、 は役に立ちエラーメッセージを提供し、あなたのデータが予想されるスキーマと一致することを確認してください。たとえば、 というデータ型を使用しようとすると、オブジェクトへの変換が (つまり、numStudentsは の最大値255を保持するバイトより大きい)になり、AnalyzerはAnalysisException。

私はLongタイプを使用していますので、このエラーメッセージは表示されません。

答えて

11

使用スキーマ推論:

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] 
0

number_of_people:Long)、 あなたはただ一つの行が必要です

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]

関連する問題