Spark CountVectorizer возвращает TinyInt - PullRequest
0 голосов
/ 28 мая 2018

Сначала я задаю свой вопрос на этой странице: Spark CountVectorizer возвращает udt вместо вектора

Ответ был совершенно верным.У меня есть другой вопрос, если вы четко проверите мой вывод CountVectorizer, формат будет следующим: [ 0 , 3, ...]

После проверки внутри моего блокнота Databricks кажется, что форматэтой строки следующее:

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

Но после проверки JavaDoc в CountVectorizer я не вижу этот «тип» нигде.

Что это такое и как его удалить?Потому что это приводит меня к

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.

1 Ответ

0 голосов
/ 28 мая 2018

Вы путаете две разные вещи:

  • Тип схемы и внешний тип столбца - в данном случае org.apache.spark.ml.linalg.SQLDataTypes.VectorType и org.apache.spark.ml.linalg.Vector соответственно.
  • Внутреннее представление UserDefinedType (его sqlType).

Внутренние атрибуты UserDefinedType , как правило, недоступны .

Возможно, вы сможете получить доступ к внутренней структуре, используя трюк to_json - from_json, аналогично тому, что показано здесь ,

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")
)

, но с учетом того, что

Я пытаюсь перевести его в RDD для моего LDA.

это просто пустая трата времени.Если вы используете Datasets, используйте новый o.a.s.ml API, который уже обеспечивает реализацию LDA.Пожалуйста, следуйте примерам в официальной документации для получения подробной информации - Латентное распределение Дирихле (LDA)

...