Scala искры + проблемы с кодировщиком - PullRequest
1 голос
/ 03 февраля 2020

Работа над проблемой, когда мне нужно добавить новый столбец, который содержит длину всех символов под всеми столбцами.

Мой пример набора данных:

ItemNumber,StoreNumber,SaleAmount,Quantity, Date
2231      ,  1        , 400      ,  2     , 19/01/2020
2145      ,  3        , 500      ,  10    , 14/01/2020

Ожидаемый результат будет be

19 20

Идеальный выход, который я собираюсь построить, - это новый столбец Длина , добавленный к фрейму данных

ItemNumber,StoreNumber,SaleAmount,Quantity, Date      , Length
2231      ,  1        , 400      ,  2     , 19/01/2020, 19
2145      ,  3        , 500      ,  10    , 14/01/2020, 20

Мой код

 val spark = SparkSession.builder()
    .appName("SimpleNewIntColumn").master("local").enableHiveSupport().getOrCreate()

  val df = spark.read.option("header","true").csv("./data/sales.csv")

  var schema = new StructType

  df.schema.toList.map{
    each => schema = schema.add(each)
  }
  val encoder = RowEncoder(schema)

  val charLength = (row :Row) => {
    var len :Int = 0
    row.toSeq.map(x =>  {
      x match {
        case a : Int => len = len + a.toString.length
        case a : String => len = len + a.length
      }

    })
    len
  }

  df.map(row => charLength(row))(encoder) // ERROR - Required Encoder[Int] Found EncoderExpression[Row]

  df.withColumn("Length", ?)

У меня есть две проблемы

1) Как решить ошибку «ОШИБКА - Обязательный кодировщик [Int] Найдено кодовое выражение [Строка]»?

2) Как добавить вывод функции charLength в качестве нового значения столбца? - df.withColumn («Длина»,?)

Спасибо.

Gurupraveen

1 Ответ

3 голосов
/ 03 февраля 2020

Если вы просто пытаетесь добавить столбец с общей длиной этой строки

Вы можете просто concat все столбцы cast до String и использовать length функцию

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

val concatCol = concat(df.columns.map(col(_).cast(StringType)):_*)

df.withColumn("Length", length(concatCol))

Вывод:

+----------+-----------+----------+--------+----------+------+
|ItemNumber|StoreNumber|SaleAmount|Quantity|      Date|length|
+----------+-----------+----------+--------+----------+------+
|      2231|          1|       400|       2|19/01/2020|    19|
|      2145|          3|       500|      10|14/01/2020|    20|
+----------+-----------+----------+--------+----------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...