2017-05-19 3 views
1

다음과 같은 문자열이 있습니다. 첫 번째 행은 머리글이고 나머지는 열 값입니다. 문자열에서 데이터 프레임 (Spark 1.6 및 Java7)을 만들고 col3 및 col4의 값을 DOUBLE로 변환하려고합니다.공백으로 구분 된 텍스트 파일을 읽고 하이브에 저장하는 방법?

col1 col2 col3 col4 col5 
val1 val2 val3 val4 val5 
val6 val7 val8 val9 val10 
val11 val12 val13 val14 val15 

위의 데이터 프레임을 만든 후에는 값이 상수 인 첫 번째 행에 두 개의 필드가 있습니다.

const1 const2 col1 col2 col3 col4 col5 
const1 const2 val1 val2 val3 val4 val5 
const1 const2 val6 val7 val8 val9 val10 
const1 const2 val11 val12 val13 val14 val15 

나는 스키마와 테이블을 하이브 위 dataframe을 쓰고 싶어 (const1의 INT, const2의 INT, COL1, 더블 더블 COL2, 더블 COL3, 더블 COL5, 더블 col4). Spark 1.6과 Java7을 사용하고 있습니다.

답변

0

나만의 CSV 파일을 지원하는 가장 최신의 최신 Spark 2.1.1을 사용하는 것이 좋습니다. 나는 스파크 1.6에서 잘못된 CSV 지원을 해요하지 않는 한


spark-csv 패키지를 사용하는 것입니다.

로드 패키지로 스파크 환경을 시작

:

--packages com.databricks:spark-csv_2.11:1.5.0 

그것은 당신에게 CSV 형식 지원을 제공합니다.

SQLContext sqlContext = new SQLContext(sc); 
DataFrame df = sqlContext.read() 
    .format("com.databricks.spark.csv") // <-- enables csv support in Spark SQL 
    .option("inferSchema", "true") 
    .option("header", "true") 
    .load("cars.csv"); 

당신은 쉼표가 기본값 이후 delimiter 옵션을 사용해야 할 것 : 패키지의 homepage가에서

. 기본 열으로

구분,를 사용하여 구분하고 있지만 delimiter는 당신이 DataFrame.withColumn 방법을 사용하여 일정한 열을 추가 할 수 있습니다 DataFrame로로드 파일로 모든 문자

로 설정할 수 있습니다

public DataFrame withColumn(String colName, Column col)

ret 열을 추가하거나 같은 이름을 가진 기존 열을 대체하여 새 DataFrame을 가져옵니다.

은 일단 하이브에 저장하는 write() 당신의 SQLContext의 방법을 사용하여 단지 문제입니다, 수행 :

write().saveAsTable(tableName) 

DataFrame API를 참조하십시오.

0

파일에 필요한 모든 데이터가 있고 추가 할 열이 상수이기 때문에 스칼라에서는 간단한 사례 클래스와 createDataFrame을 사용하여 추가 할 수 있습니다.제이 섹 언급 한대로, 당신은

case class schema (const1: Int, const2: Int, col1: String, col2: String, col3: String, col4: String, col5: String) 
//Skip Header while loading the data 
val fileRDD = sc.textFile("file") 
       .mapPartitionsWithIndex{ (index, row) => if (index==0) row.drop(1) else row } 
       .map(x => x.split(" ")) 
       .map(x => schema(1, 2, x(0), x(1), x(2), x(3), x(4))) 
val df = sqlContext.createDataFrame(fileRDD) 
df.show()  
+------+------+-----+-----+-----+-----+-----+ 
|const1|const2| col1| col2| col3| col4| col5| 
+------+------+-----+-----+-----+-----+-----+ 
|  1|  2| col1| col2| col3| col4| col5| 
|  1|  2| val1| val2| val3| val4| val5| 
|  1|  2| val6| val7| val8| val9|val10| 
|  1|  2|val11|val12|val13|val14|val15| 
+------+------+-----+-----+-----+-----+-----+ 

그리고로드 데이터를 하이브 할 수있는 솔루션에 대한 접근 방법을 이해하는 데 도움이 수있는 스칼라 관련 솔루션 제공 :

일단 하이브에 저장, 수행하는 것은 단지입니다

write().saveAsTable(tableName) 

가참조 : 쓰기() 귀하는 SqlContext의 방법을 사용하여 문제.

관련 문제