Приведение массива двойных к строковым в искровой sql - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь прочитать данные из JSON, у которого есть массив, имеющий значения lat, long, что-то вроде [48.597315, -43.206085], и я хочу проанализировать их в spark sql как одну строку.Есть ли способ, которым я могу это сделать?

мой ввод JSON будет выглядеть примерно так:

{"id":"11700","position":{"type":"Point","coordinates":[48.597315,-43.206085]}

Я пытаюсь отправить это в хранилище rdbms и когда я пытаюсьдля приведения позиции. координаты к строке, это дает мне

Can't get JDBC type for array<string> 

, поскольку типом данных назначения является nvarchar.любая помощь приветствуется.!

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вы можете прочитать свой json-файл в DataFrame, затем 1) использовать concat_ws для преобразования массива lat / lon в один столбец и 2) использовать struct для повторной сборки position struct-typeстолбец следующим образом:

// jsonfile:
// {"id":"11700","position":{"type":"Point","coordinates":[48.597315,-43.206085]}}

import org.apache.spark.sql.functions._
val df = spark.read.json("/path/to/jsonfile")

// printSchema:
// root
//  |-- id: string (nullable = true)
//  |-- position: struct (nullable = true)
//  |    |-- coordinates: array (nullable = true)
//  |    |    |-- element: double (containsNull = true)
//  |    |-- type: string (nullable = true)

df.withColumn("coordinates", concat_ws(",", $"position.coordinates")).
  select($"id", struct($"coordinates", $"position.type").as("position")).
  show(false)
// +-----+----------------------------+
// |id   |position                    |
// +-----+----------------------------+
// |11700|[48.597315,-43.206085,Point]|
// +-----+----------------------------+

// printSchema:
// root
//  |-- id: string (nullable = true)
//  |-- position: struct (nullable = false)
//  |    |-- coordinates: string (nullable = false)
//  |    |-- type: string (nullable = true)

[ОБНОВЛЕНИЕ]

Использование Spark SQL:

df.createOrReplaceTempView("position_table")

spark.sql("""
    select id, concat_ws(',', position.coordinates) as position_coordinates
    from position_table
  """).
  show(false)
//+-----+--------------------+
//|id   |position_coordinates|
//+-----+--------------------+
//|11700|48.597315,-43.206085|
//|11800|49.611254,-43.90223 |
//+-----+--------------------+
0 голосов
/ 09 июня 2018

Вы должны преобразовать данный столбец в строку перед загрузкой в ​​целевой источник данных.Например, следующий код создает новый столбец position.coordinates со значением в виде объединенной строки данных массивов double с использованием toString массива и последующим снятием скобок.

df.withColumn("position.coordinates", regexp_replace($"position.coordinates".cast("string"), "\\[|\\]", ""))

В качестве альтернативы вы можете использовать UDF длясоздайте пользовательскую функцию преобразования для Row объектов.Таким образом, вы можете поддерживать вложенную структуру столбца.Следующий источник (ответ № 2) может дать вам некоторое представление о том, как использовать UDF для вашего случая: Spark UDF с вложенной структурой в качестве входного параметра .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...