我首先在此页面上提出我的问题: 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.VectorType
和org.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/