Изменение типа в искровой структуре данных - PullRequest
0 голосов
/ 04 мая 2018

У меня есть следующая схема:

root
 |-- Id: long (nullable = true)    
 |-- element: struct (containsNull = true)
 |    |-- Amount: double (nullable = true)
 |    |-- Currency: string (nullable = true)

Я хочу изменить тип суммы на целое число. Он не работает с withColumn, так как тип остается прежним:

df.withColumn("element.Amount", $"element.Amount".cast(sql.types.IntegerType))

Как изменить тип столбца в структуре?

1 Ответ

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

Если вы не можете исправить проблему в источнике, вы можете разыграть:

case class Amount(amount: Double, currency: String)
case class Row(id: Long, element: Amount)

val df = Seq(Row(1L, Amount(0.96, "EUR"))).toDF

val dfCasted = df.withColumn(
  "element", $"element".cast("struct<amount: integer, currency: string>")
)

dfCasted.show
// +---+--------+
// | id| element|
// +---+--------+
// |  1|[0, EUR]|
// +---+--------+


dfCasted.printSchema
// root
//  |-- id: long (nullable = false)
//  |-- element: struct (nullable = true)
//  |    |-- amount: integer (nullable = true)
//  |    |-- currency: string (nullable = true)



dfCasted.printSchema

В простых случаях вы можете попытаться восстановить дерево:

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

dfCasted.withColumn(
  "element",
  struct($"element.amount".cast("integer"), $"element.currency")
)
// org.apache.spark.sql.DataFrame = [id: bigint, element: struct<col1: int, currency: string>]

но оно не масштабируется для сложных деревьев.

...