Преобразование PostgreSQL вложенного JSON в массив c в таблице - PullRequest
1 голос
/ 17 июня 2020

У меня есть база данных PostgreSQL, содержащая таблицу test_table с отдельными записями. Первый столбец - это простой store_id, второй столбец meausurement - это вложенный json.

store_id | measurement
----------------------
0        | {...}

Формат столбца measurement следующий:

{
    'file_info': 'xxxx', 
    'data': {
        'contour_data': {
            'X': [-97.0, -97.0, -97.0, -97.0, -97.0, -97.0],
            'Y': [-43.0, -41.0, -39.0, -39.0, -38.0, -36.0]
        }
    }
}

Я хотел бы построить график Y против X на диаграмме рассеяния в Tableau. Поэтому я успешно подключил базу данных с помощью коннектора PostgreSQL Tableau. Из этой страницы я узнал, что мне нужно использовать пользовательские запросы SQL для извлечения данных из объекта json, поскольку Tableau напрямую не поддерживает тип данных json Postgres. Я уже пробовал следующий Custom SQL Query in Tableau:

select
    store_id as store_id,
    measurement#>>'{data, contour_data, X}' as contour_points_x,
    measurement#>>'{data, contour_data, Y}' as contour_points_y
from test_table

, который успешно извлекает два массива в два новых столбца contour_points_x и contour_points_y. Однако оба новых столбца находятся в таблице типа string, поэтому я не могу использовать их в качестве источника данных для графика.

Как мне настроить запрос Custom SQL, чтобы массивы данных отображались на диаграмме рассеяния Tableau?

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Похоже, вам нужно разделить столбцы. Отметьте это https://help.tableau.com/current/pro/desktop/en-us/split.htm

EDIT - связанный подход работает, когда вы можете надежно предположить верхнюю границу количества точек в каждом списке. Здесь описан один из способов разделения списков произвольного размера https://apogeeintegration.com/blog/apogee-busts-out-multi-value-cells-using-tableau-prep-builder

0 голосов
/ 25 июня 2020

Ответ - объединение нескольких функций и / или синтаксических операций. Нужно

  • использовать оператор #>, чтобы копаться в json и возвращать как json тип (не как text введите как >>#).
  • используйте json_array_elements_text(), чтобы расширить json до набора text.
  • используйте оператор приведения типов :: для преобразования text в float
/* custom SQL Query in Tableau */
select 
    store_id as store_id,
    json_array_elements_text(measurement#>'{data, contour_data, X}')::float as contour_points_x,
    json_array_elements_text(measurement#>'{data, contour_data, Y}')::float as contour_points_y,
from test_table

Оба результирующих столбца теперь отображаются в Таблице как отдельные меры. Переход к дискретным размерам позволяет построить график contour_points_y против contour_points_x по желанию.

...