Как вычесть вектор из скаляра в скале? - PullRequest
0 голосов
/ 12 октября 2019

У меня есть файл партера, который содержит два столбца (идентификатор, объекты). Я хочу вычесть элементы из скаляра и разделить вывод на другой скаляр. файл паркета

df.withColumn("features", ((df("features")-constant1)/constant2))

, но выдает ошибку

требование не выполнено: количество столбцов не совпадает. Старые имена столбцов (2): идентификатор, функции Новые имена столбцов (1): функции Как решить эту проблему?

1 Ответ

0 голосов
/ 13 октября 2019

Мой код искры scala для этого, как показано ниже. Единственный способ выполнить какую-либо операцию с векторным типом данных sparkm - приведение к строке. Также использовал UDF для выполнения вычитания и деления.

import spark.implicits._
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.functions._
var df = Seq((1, Vectors.dense(35)),
  (2, Vectors.dense(45)),
  (3, Vectors.dense(4.5073)),
  (4, Vectors.dense(56)))
  .toDF("id", "features")
df.show()
val constant1 = 10
val constant2 = 2
val performComputation = (s: Double, val1: Int, val2: Int) => {
  Vectors.dense((s - val1) / val2)
}
val performComputationUDF = udf(performComputation)
df.printSchema()
df = df.withColumn("features",
  regexp_replace(df.col("features").cast("String"),
    "[\\[\\]]", "").cast("Double")
)

df = df.withColumn("features",
  performComputationUDF(df.col("features"),
    lit(constant1), lit(constant2))
)
df.show(20, false)

// Write State should with mode overwrite
df.write
  .mode("overwrite")
  .parquet("file:///usr/local/spark/dataset/output1/")

Результат

+---+----------+
|id |features  |
+---+----------+
|1  |[12.5]    |
|2  |[17.5]    |
|3  |[-2.74635]|
|4  |[23.0]    |
+---+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...