Перейти к основному содержанию
Перейти к основному содержанию

Экспорт JSON

Почти любой формат JSON, используемый для импорта, может использоваться и для экспорта. Наиболее популярный — JSONEachRow:

SELECT * FROM sometable FORMAT JSONEachRow
{"path":"Bob_Dolman","month":"2016-11-01","hits":245}
{"path":"1-krona","month":"2017-01-01","hits":4}
{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":3}

Или мы можем использовать JSONCompactEachRow, чтобы сэкономить место на диске за счёт опускания имён столбцов:

SELECT * FROM sometable FORMAT JSONCompactEachRow
["Bob_Dolman", "2016-11-01", 245]
["1-krona", "2017-01-01", 4]
["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3]

Переопределение типов данных строковым типом

ClickHouse строго следует типам данных и экспортирует JSON в соответствии со стандартами. В случаях, когда требуется, чтобы все значения были закодированы в виде строк, можно использовать формат JSONStringsEachRow:

SELECT * FROM sometable FORMAT JSONStringsEachRow
{"path":"Bob_Dolman","month":"2016-11-01","hits":"245"}
{"path":"1-krona","month":"2017-01-01","hits":"4"}
{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":"3"}

Теперь числовой столбец hits представлен в виде строки. Экспорт в виде строк поддерживается для всех форматов семейства JSON*, см. форматы JSONStrings\* и JSONCompactStrings\*:

SELECT * FROM sometable FORMAT JSONCompactStringsEachRow
["Bob_Dolman", "2016-11-01", "245"]
["1-krona", "2017-01-01", "4"]
["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", "3"]

Экспорт метаданных вместе с данными

Формат JSON, распространённый в приложениях, экспортирует не только результирующие данные, но и типы столбцов, а также статистику запроса:

SELECT * FROM sometable FORMAT JSON
{
        "meta":
        [
                {
                        "name": "path",
                        "type": "String"
                },
                ...
        ],

        "data":
        [
                {
                        "path": "Bob_Dolman",
                        "month": "2016-11-01",
                        "hits": 245
                },
                ...
        ],

        "rows": 3,

        "statistics":
        {
                "elapsed": 0.000497457,
                "rows_read": 3,
                "bytes_read": 87
        }
}

Формат JSONCompact выводит те же метаданные, но использует более компактный формат самих данных:

SELECT * FROM sometable FORMAT JSONCompact
{
        "meta":
        [
                {
                        "name": "path",
                        "type": "String"
                },
                ...
        ],

        "data":
        [
                ["Bob_Dolman", "2016-11-01", 245],
                ["1-krona", "2017-01-01", 4],
                ["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3]
        ],

        "rows": 3,

        "statistics":
        {
                "elapsed": 0.00074981,
                "rows_read": 3,
                "bytes_read": 87
        }
}

Рассмотрите использование вариантов JSONStrings или JSONCompactStrings для кодирования всех значений в виде строк.

Компактный способ экспорта данных и их структуры в формате JSON

Более эффективный способ получить данные вместе с их структурой — использовать формат JSONCompactEachRowWithNamesAndTypes:

SELECT * FROM sometable FORMAT JSONCompactEachRowWithNamesAndTypes
["path", "month", "hits"]
["String", "Date", "UInt32"]
["Bob_Dolman", "2016-11-01", 245]
["1-krona", "2017-01-01", 4]
["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3]

Будет использован компактный формат JSON, в начале которого будут две строки заголовка с именами столбцов и их типами. Затем этот формат можно использовать для приёма данных в другой экземпляр ClickHouse (или другие приложения).

Экспорт JSON в файл

Чтобы сохранить экспортируемые данные в формате JSON в файл, можно использовать клаузу INTO OUTFILE:

SELECT * FROM sometable INTO OUTFILE 'out.json' FORMAT JSONEachRow
Получено 36838935 строк. Время выполнения: 2.220 сек. Обработано 36.84 млн строк, 1.27 ГБ (16.60 млн строк/сек., 572.47 МБ/сек.)

ClickHouse потребовалось всего 2 секунды, чтобы экспортировать почти 37 миллионов записей в JSON-файл. Мы также можем выполнить экспорт, используя оператор COMPRESSION, чтобы включить сжатие на лету:

SELECT * FROM sometable INTO OUTFILE 'out.json.gz' FORMAT JSONEachRow
Выбрано 36838935 строк. Время выполнения: 22.680 сек. Обработано 36.84 млн строк, 1.27 ГБ (1.62 млн строк/с., 56.02 МБ/с.)

Требует больше времени на выполнение, но создаёт значительно меньший сжатый файл:

2.2G    out.json
576M    out.json.gz