apache-spark - Spark CountVectorizer 返回一个 TinyInt

标签 apache-spark apache-spark-sql apache-spark-mllib

我首先在此页面上提出我的问题: Spark CountVectorizer return udt instead of vector

答案非常正确。我还有另一个问题,如果你清楚地检查我的 CountVectorizer 输出 格式如下:[0, 3, ...]

检查我的 Databricks 笔记本后,该行的格式似乎如下:

features` AS STRUCT<`type`: TINYINT, `size`: INT, `indices`: ARRAY<INT>, `values`: ARRAY<DOUBLE>>

但是在检查了 CountVectorizer 的 JavaDoc 后,我发现“类型”无处可寻。

它是什么以及如何删除它? 因为这让我想到了

org.apache.spark.sql.AnalysisException: cannot resolve 'CAST(`features` AS STRUCT<`type`: TINYINT, `size`: INT, `indices`: ARRAY<INT>, `values`: ARRAY<DOUBLE>>)' due to data type mismatch: cannot cast vector to vector;

当我尝试将他转换为 RDD 以用于我的 LDA 时。

最佳答案

您混淆了两种不同的事物:

  • 列的架构类型和外部类型 - 在本例中 org.apache.spark.ml.linalg.SQLDataTypes.VectorTypeorg.apache.spark.ml.linalg.Vector分别。
  • UserDefinedType 的内部代表(其 sqlType )。

UserDefinedType 的内部属性are in general not accessible

您也许可以使用 to_json 访问内部结构-from_json技巧,类似于显示的 here ,

import org.apache.spark.sql.types._

val schema = StructType(Seq(StructField(
  "features", 
  StructType(Seq(
    StructField("indices", ArrayType(LongType, true), true), 
    StructField("size", LongType, true),
    StructField("type", ShortType, true), 
    StructField("values", ArrayType(DoubleType, true), true)
)), true)))

df.select(
  from_json(
    to_json(struct($"features")), schema
   ).getItem("features").alias("data")
)

但考虑到

i try to convert him to RDD for my LDA.

这只是浪费时间。如果您使用Datasets搭配新的o.a.s.ml API,已经提供LDA实现。详细请按照官方文档中的示例进行操作 - Latent Dirichlet allocation (LDA)

关于apache-spark - Spark CountVectorizer 返回一个 TinyInt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50571810/

相关文章:

python - Spark 流 : read CSV string from kafka, 写入 Parquet

java - 如何为自定义 Java 对象创建编码器?

python - 如何使用 Apache-Spark 在 AWS 集群上运行代码?

arrays - 选择数组中的一系列元素spark sql

python - 在 Pyspark 中提取分隔符第一次出现之前的子字符串和最后一次出现之后的子字符串

python - 将 Spark DataFrame 写入 Hive 表时的内存分配问题

python - 如何使用列值作为 PySpark 中字典的键?

pyspark - 在 pyspark 中聚合 Kolmogorov Smirnov 测试

apache-spark - Spark - KMeans.train 中的 IllegalArgumentException

java - Apache Spark 中 RowMatrix 和 Matrix 的区别?