JSON 내보내기
JSON 내보내기 (Exporting 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 rows in set. Elapsed: 2.220 sec. Processed 36.84 million rows, 1.27 GB (16.60 million rows/s., 572.47 MB/s.)
ClickHouse는 거의 3700만 개 레코드를 JSON 파일로 내보내는 데 단 2초밖에 걸리지 않았어요. COMPRESSION 절로 즉시 압축을 켜서 내보낼 수도 있어요.
SELECT * FROM sometable INTO OUTFILE 'out.json.gz' FORMAT JSONEachRow
36838935 rows in set. Elapsed: 22.680 sec. Processed 36.84 million rows, 1.27 GB (1.62 million rows/s., 56.02 MB/s.)
시간은 더 걸리지만 훨씬 작은 압축 파일이 생성돼요.
2.2G out.json
576M out.json.gz