Как привести в двойное число к целому в from_ json Spark SQL (NULL-вывод) - PullRequest
1 голос
/ 21 марта 2020

У меня есть таблица со строкой JSON

При выполнении этого запроса Spark SQL:

select from_json('[{"column_1":"hola", "some_number":1.0}]', 'array<struct<column_1:string,some_number:int>>')

я получаю NULL, так как типы данных для some_number не совпадают (int против double) ...

Если я запускаю это, это работает:

select from_json('[{"column_1":"hola", "some_number":1.0}]', 'array<struct<column_1:string,some_number:double>>')

Есть ли способ ЗАКРЫТЬ это на летать?

1 Ответ

2 голосов
/ 21 марта 2020

Вы можете сделать from_json сначала используя array<struct<column_1:string,some_number:double>>, затем cast как array<struct<column_1:string,some_number:int>>

Example:

spark.sql("""select cast(from_json('[{"column_1":"hola", "some_number":1.0}]', 'array<struct<column_1:string,some_number:double>>') as array<struct<column_1:string,some_number:int>>)""").show()

//+-------------------------------------------------------+
//|jsontostructs([{"column_1":"hola", "some_number":1.0}])|
//+-------------------------------------------------------+
//|                                            [[hola, 1]]|
//+-------------------------------------------------------+

//printSchema
spark.sql("""select cast(from_json('[{"column_1":"hola", "some_number":1.0}]', 'array<struct<column_1:string,some_number:double>>') as array<struct<column_1:string,some_number:int>>)""").printSchema()

//root
// |-- jsontostructs([{"column_1":"hola", "some_number":1.0}]): array (nullable = true)
// |    |-- element: struct (containsNull = true)
// |    |    |-- column_1: string (nullable = true)
// |    |    |-- some_number: integer (nullable = true)
...