Невозможно преобразовать `ordId` из строки в int, так как оно может быть обрезано - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь прочитать небольшой файл как набор данных, но он выдает ошибку

"Невозможно преобразовать ordId из строки в int, так как это может усечь".

Вот код:

object Main {
  case class Orders(ordId: Int, custId: Int, amount: Float, date: String)

  def main(args : Array[String]): Unit ={

    val schema = Encoders.product[Orders].schema

      val spark = SparkSession.builder
        .master ("local[*]")
        .appName ("")
        .getOrCreate ()


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


    import spark.implicits._
    val ds = df.as[Orders]

  }
}

orders.txt

ordId,custId,amount,date
1234,123,400,20190112
2345,456,600,20190122
1345,123,500,20190123
3456,345,800,20190202
5678,123,600,20190203
6578,455,900,20190301

Как устранить эту ошибку ?. Также я хотел бы знать, что мне сначала нужно прочитать файл как Dataframe, а затем преобразовать в набор данных?

1 Ответ

0 голосов
/ 12 января 2020

Попробуйте , передав schema (используя .schema), читая как DataFrame.

import org.apache.spark.sql.Encoders
val schema = Encoders.product[Orders].schema
val ds=spark.read.option("header",true).schema(schema).csv("/mnt/data/orders.txt").as[Orders]
ds.show()

Результат:

+-----+------+------+--------+
|ordId|custId|amount|    date|
+-----+------+------+--------+
| 1234|   123| 400.0|20190112|
| 2345|   456| 600.0|20190122|
| 1345|   123| 500.0|20190123|
| 3456|   345| 800.0|20190202|
| 5678|   123| 600.0|20190203|
| 6578|   455| 900.0|20190301|
+-----+------+------+--------+

Схема:

ds.printSchema()

root
 |-- ordId: integer (nullable = true)
 |-- custId: integer (nullable = true)
 |-- amount: float (nullable = true)
 |-- date: string (nullable = true)

Обновление:

Существует несколько способов получения информации за месяц из столбца даты

  1. Использование функций unix_timestamp, from_unixtime:
ds.withColumn("mnth",from_unixtime(unix_timestamp($"date","yyyyMMdd"),"MMM")).show()

(или)

Использование функций to_date, date_format:
ds.withColumn("mnth",date_format(to_date($"date","yyyyMMdd"),"MMM")).show()

Результат:

+-----+------+------+--------+----+
|ordId|custId|amount|    date|mnth|
+-----+------+------+--------+----+
| 1234|   123| 400.0|20190112| Jan|
| 2345|   456| 600.0|20190122| Jan|
| 1345|   123| 500.0|20190123| Jan|
| 3456|   345| 800.0|20190202| Feb|
| 5678|   123| 600.0|20190203| Feb|
| 6578|   455| 900.0|20190301| Mar|
+-----+------+------+--------+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...