2016-09-16 4 views
5

간단한 CSV 파일에서 Spark Dataset을 만들고 싶습니다. 수가이 수도로 BIGINT하는 문자열에서 number_of_people 캐스팅하지 "여기 CSV 파일에서 Spark Dataset 만들기

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] 

오류 메시지입니다 : 여기

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" 

데이터 집합을 할 수있는 코드 다음은 CSV 파일의 내용은 잘라 내기 "

Databricks는 데이터 세트 및이 특정 오류 메시지를 만드는 방법에 대해 this blog post에 대해 이야기합니다.

인코더 열망는 데이터의 잘못 과정 TB의에 시도하기 전에 데이터가 도움이 오류 메시지를 제공하는 예상 스키마, 일치하는지 확인합니다. 예를 들어, 객체에 대한 변환이 잘림 (즉, numStudents가 최대 값 255를 포함하는 바이트보다 크다)과 같이 데이터 유형이 너무 작 으면 분석기에서 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]

관련 문제