2017-09-05 7 views
-1

Spark의 countVectorizer 모델을 실행하려고합니다. 이 요구 사항의 일부로, 나는 csv 파일을 읽고 그것으로부터 Dataframe (inp_DF)을 생성하고있다.Spark - countVectorizer 모델의 열 중 하나에 값 배열이 포함 된 Spark 데이터 프레임을 만드는 방법

+--------------+--------+-------+ 
|   State|Zip Code|Country| 
+--------------+--------+-------+ 
|  kentucky| 40205|  us| 
|  indiana| 47305|  us| 
|greater london| sw15|  gb| 
| california| 92707|  us| 
|  victoria| 3000|  au| 
|   paris| 75001|  fr| 
|  illinois| 60608|  us| 
|  minnesota| 55405|  us| 
| california| 92688|  us| 
+--------------+--------+-------+ 

아래와 같이 3 열이

는 I는

|  kentucky| 40205|  us| "kentucky","40205","us" 
|  indiana| 47305|  us| "indiana","47305","us" 
|greater london| sw15|  gb| "greater london","sw15","gb" 
| california| 92707|  us| "california","92707","us" 
|  victoria| 3000|  au| "victoria","3000","au" 
|   paris| 75001|  fr| "paris","75001","fr" 
|  illinois| 60608|  us| "illinois","60608","us" 
|  minnesota| 55405|  us| "minnesota","55405","us" 
| california| 92688|  us| "california","92688","us" 

모든 이러한 3 열의 값들의 어레이를 포함하는 동일한 dataframe 내의 제 4 컬럼을 만들어야 질문 1 : .concat과 같은 쉬운 명령이 있습니까?

이 배열은 countVectorizer 모델의 입력이 값의 배열을 포함하는 열이어야하므로 필요합니다. "주"java.lang.IllegalArgumentException가 스레드

예외 :이 오류 메시지가 아래에 언급 된 문자열 데이터 타입 안 요구 사항은 실패 열 상태가 중 하나에 동일한 유형이어야합니다 [ArrayType (StringType, true), ArrayType (StringType, false)] 유형이지만 실제로는 StringType 유형입니다. (SchemaUtils.scala : 58) 에서 에 scala.Predef $ .require (Predef.scala : 224)를 입력하십시오. org.apache.spark.ml.feature.CountVectorizer에서 : org.apache.spark.ml.feature.CountVectorizer.validateAndTransformSchema (123 CountVectorizer.scala)에서 : .CountVectorizerParams $ class.validateAndTransformSchema (75 CountVectorizer.scala) .transformSchema (CountVectorizer.scala 188) org.apache.spark.ml.PipelineStage.transformSchema (Pipeline.scala 74)에 org.apache.spark.ml.feature.CountVectorizer.fit에서 (CountVectorizer.scala : 155) at org.apache.spark.examples.ml.CountVectorizerExample $ .main (CountVectorizerExample.scala : 54) org.apache.spark.examples.ml.CountVectorizerExample.main (CountVectorizerExample.scala)에서 sun.reflect.NativeMethodAccessorImpl에서 java.lang.reflect.Method.invoke에서 .invoke0 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)에서 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)에서 (기본 방법) (Method.java:498) at com.intellij.rt.execution.application.AppMain.main (AppMain.java:147) Java HotSpot (TM) 클라이언트 VM 경고 : 무시 옵션 MaxPermSize = 300m; 지원 I 대괄호 [] 내에 포함되는 입력 dataframe들 3 열하지만 배열 요소의 배열을 만들려고 8.0

제거 하였다.

샘플 코드를 참조

// Read Input Dataset for countVectorizer Logic 
val inp_data = spark.read.format("com.databricks.spark.csv").option("header", "True").option("inferSchema", "true") 
     .option("treatEmptyValuesAsNulls", "true").option("nullValue", "") 
     .load("Input.csv") 

// Creating a Spark Dataframe from the Input Data 
val inp_DF = inp_data.toDF() 

// Creating an array from Spark Dataframe Columns 
val inp_array = inp_DF.select("State","Zip Code","Country").collect() 
     println(inp_array.mkString(",")) 

// fit a CountVectorizerModel from the corpus 
val cvModel: CountVectorizerModel = new CountVectorizer() 
     .setInputCol("State") 
     .setOutputCol("features") 
     .setVocabSize(4) 
     .setMinDF(2) 
     .fit(inp_DF) 

질문 2 아래에 주어진다 : 어떻게 그 배열 요소에서 대괄호 []를 제거하고 배열의 값으로 dataframe에 새 열을 만들려면?

질문 3 : 단일 열 값을 countVectorizer 모델의 입력으로 제공하고 기능을 출력으로 가져올 수 있습니까?

작성할 array 기능을 사용할 수 있습니다

답변

1

array column

+-------------+--------+-------+-------------------------+ 
|State  |Zip Code|Country|arrayColumn    | 
+-------------+--------+-------+-------------------------+ 
|kentucky  |40205 |us  |[kentucky, 40205, us] | 
|indiana  |47305 |us  |[indiana, 47305, us]  | 
|greaterlondon|sw15 |gb  |[greaterlondon, sw15, gb]| 
|california |92707 |us  |[california, 92707, us] | 
|victoria  |3000 |au  |[victoria, 3000, au]  | 
|paris  |75001 |fr  |[paris, 75001, fr]  | 
|illinois  |60608 |us  |[illinois, 60608, us] | 
|minnesota |55405 |us  |[minnesota, 55405, us] | 
|california |92688 |us  |[california, 92688, us] | 
+-------------+--------+-------+-------------------------+ 

와 당신이 dataframe을 사용할 수 있습니다 당신 출력을 제공한다

import org.apache.spark.sql.functions._ 
val inp_array = inp_DF.withColumn("arrayColumn", array("State", "Zip Code", "Country")) 

같은 CountVectorizerModel
val cvModel: CountVectorizerModel = new CountVectorizer() 
    .setInputCol("arrayColumn") 
    .setOutputCol("features") 
    .setVocabSize(4) 
    .setMinDF(2) 
    .fit(inp_array) 

처음 두 질문에 대답합니다.

이제 세 번째 질문에 대답하십시오. CountVectorizerModel에서 하나의 열만 사용할 수 있지만 위에 열거 한대로 array 함수를 사용하여 수행 할 수있는 열을 ArrayType(StringType,true)으로 변환해야합니다.

State 열을 사용한다고 가정합니다. 당신은

val single_arrayDF = inp_DF.withColumn("State", array("State")) 

을 수행하여 arrayState 열의 데이터 유형을 변경하고 내가 대답은 도움이 희망

val cvModel: CountVectorizerModel = new CountVectorizer() 
    .setInputCol("State") 
    .setOutputCol("features") 
    .setVocabSize(4) 
    .setMinDF(2) 
    .fit(single_arrayDF) 

로 사용할 수 있습니다.