首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建countVectorizer模型的一个列中包含值数组的火花数据

如何创建countVectorizer模型的一个列中包含值数组的火花数据
EN

Stack Overflow用户
提问于 2017-09-05 07:33:24
回答 1查看 1.7K关注 0票数 0

我正在尝试执行星火的countVectorizer模型。作为这个需求的一部分,我正在读取一个csv文件并从其中创建一个Dataframe (inp_DF)。

它有3列,如下所示

代码语言:javascript
运行
复制
+--------------+--------+-------+
|         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|
+--------------+--------+-------+

我需要在相同的dataframe中创建第4列,其中包含所有这3列的值数组,如

代码语言:javascript
运行
复制
|      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"

问题1:有像.concat这样的简单命令来实现这一点吗?

需要这个数组,因为countVectorizer模型的输入应该是包含值数组的列。它不应该像下面的错误消息中提到的那样是字符串数据类型:

线程"main“java.lang.IllegalArgumentException: requirement中的异常:列状态的类型必须等于以下类型之一: ArrayType(StringType,true)、ArrayType(StringType,false),但实际上是StringType类型。org.apache.spark.ml.util.SchemaUtils$.checkColumnTypes(SchemaUtils.scala:58),org.apache.spark.ml.feature.CountVectorizerParams$class.validateAndTransformSchema(CountVectorizer.scala:75),org.apache.spark.ml.feature.CountVectorizer.validateAndTransformSchema(CountVectorizer.scala:123),org.apache.spark.ml.feature.CountVectorizer.transformSchema(CountVectorizer.scala:188),org.apache.spark.ml,scala.Predef$.require(Predef.scala:224).PipelineStage.transformSchema(Pipeline.scala:74) at org.apache.spark.ml.feature.CountVectorizer.fit(CountVectorizer.scala:155) at org.apache.spark.examples.ml.CountVectorizerExample$.main(CountVectorizerExample.scala:54) at org.apache.spark.examples.ml.CountVectorizerExample.main(CountVectorizerExample.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect。DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) Java HotSpot(TM)客户端VM警告:忽略选项MaxPermSize=300m;支持在8.0中被移除

我试图从这3列输入数据创建一个数组,但是数组元素被括在方括号中。

下面给出了示例代码片段,供您参考

代码语言:javascript
运行
复制
// 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模型提供单列值作为输入,并以特性作为输出?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-05 08:24:25

可以使用array函数将array column创建为

代码语言:javascript
运行
复制
import org.apache.spark.sql.functions._
val inp_array = inp_DF.withColumn("arrayColumn", array("State", "Zip Code", "Country"))

它应该为您提供输出

代码语言:javascript
运行
复制
+-------------+--------+-------+-------------------------+
|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中使用这个CountVectorizerModel

代码语言:javascript
运行
复制
val cvModel: CountVectorizerModel = new CountVectorizer()
  .setInputCol("arrayColumn")
  .setOutputCol("features")
  .setVocabSize(4)
  .setMinDF(2)
  .fit(inp_array)

回答了你的前两个问题。

现在回答你的第三个问题。,是,,您只能在CountVectorizerModel中使用一个列,但是为此,您需要将该列转换为ArrayType(StringType,true),这可以通过使用如上所述的array函数来完成。

假设您希望在State中使用CountVectorizerModel列。然后,可以将State列的数据类型更改为array

代码语言:javascript
运行
复制
val single_arrayDF = inp_DF.withColumn("State", array("State"))

并把它当作

代码语言:javascript
运行
复制
 val cvModel: CountVectorizerModel = new CountVectorizer()
  .setInputCol("State")
  .setOutputCol("features")
  .setVocabSize(4)
  .setMinDF(2)
  .fit(single_arrayDF)

我希望答案是有帮助的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46049356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档