Cloudant DB를 이용한 Watson IoT platform Historical Data 관리

1) Cloudant 이해하기
2) Design document를 응용한 CSV export
3) Watson IoT platform 과 Cloudant 연동하기

 

본 글에서는 Cloudant DB에 있는 data를 CSV로 export 하는 방법을 알아볼 것입니다.
CSV export를 하는 방법은 여러가지가 있습니다.

대표적으로 db의 data를 Json으로 읽어와서 programming code 단에서 csv로 만드는 방법이 있습니다.

backend에서 csv 변환도 가능하고 frontend에서 변환도 가능 합니다.
performance 측면으로 보자면 DB > Backend > Frontend 순입니다.
대용량 data를 handling할때 db 단에서 직접 처리를 해서 최종 결과물을 받는 구조가 가장 효율 적입니다.

이전 과정에서 학습 했던 view를 이용하면 cloudant db로 부터 csv format으로 파일을 받을 수 있습니다.
View의 속성중 list 와 show 가 있었고, 이들은 doc의 format을 지정해주는 역할을 한다고 했었습니다.

view와 list를 만들어서 csv export를 구현 해볼 것입니다.

[CORS enable]

http request를 할때 CORS 설정을 해줘야 합니다.
CORS란 Cross Origin Resource Sharing의 줄임말로, Cross-Site Http Request를 가능하게하는 표준 규약입니다.
다른 도메인으로 부터 리소스가 필요할 경우 cross-site http request가 필요합니다.

DB가 있는 서버와 request하는 서버가 서로 다르기 때문에 이에대한 설정이 필요 합니다.

역시 restfull 방식으로 가능하며, GUI를 통해서도 가능 합니다.
cloudant instance 별로 한번만 설정하면 모든 database에 적용되는 설정이므로 GUI로 해보겠습니다.
cloudant dashboard -> Account -> CORS 메뉴로 접속 합니다.
cors를 enable 하고 restrict to specific domains를 선택하고 허락할 도메인을 등록 합니다. All domains로 하면 모든 도메인을 열어 주는데 저의 경우에는 잘 동작 하지 않았습니다. 구체적으로 도메인을 지정하여 accept 처리를 해주니 잘 동작 했습니다.

http request 형태로 하고 싶다면 아래 link의 Setting the CORS configuration 내용을 참고 하세요.
<REST API를 통한 CORS 셋팅방법>

[View 생성]

cloudant db는 생성되어 있다 가정하겠습니다.
database name을 iotp_pylws9_default_2018-08-27 으로 하겠습니다.
Cloudant Dashboard의 gui를 이용하여 view를 생성 하면 손쉽지만, 실질적인 application에서 사용하기에는 어려움이 있습니다. 여기서는 http requst를 이용해 view를 생성 해보겠습니다.

curl 과 programming code를 각각 사용해 보겠습니다.
(아래에서 사용되는 url정보는 bluemix credential info에 있습니다.)

일단 view를 정의 합니다. exportcsv.json이라 저장 하겠습니다.
각 attribute를 살펴보겠습니다.
views 는 map 또는 reduce function을 정의하는데 여기서는 map function만 정의했습니다.
lists에는 doc을 csv형태로 보여줄 function이 정의 됩니다.
indexs는 검색을 위해 존재 합니다. secondary index로서 역할을 합니다. 여기 정의된 index를 통해 search를 할 수 있습니다.
(전체 소스: https://github.ibm.com/yjh/cloudantView/blob/master/exportCsv3.json)

{
    "_id": "_design/exportcsv",
    "language": "javascript",
    "views": {
        "by-deviceId": {
            "map": "function(doc) {\n  if(doc.deviceId &&doc.timestamp){\n
                   emit([doc.deviceId,doc.timestamp], doc);  \n
            }\n}\n"
        }
    },
    "lists": {
        "csv": "..." #여기에는 doc csv format으로 보여주는 code가 들어갑니다.
    },
    "indexes": {
        "search": {
            "analyzer": "keyword",
            "index": "..."#index로 사용될 keyword
        }
    }
}

위의 정의한 view 파일을 cloudant에 design document로 등록 해보겠습니다.
curl을 이용하는 방법과 javascript(angularjs)를 이용하는 방법으로 해보겠습니다.

1) curl 사용

curl -X PUT \
-H "Content-type:application/json" \
 -d@exportCsv.json "https://username:password@e2b4b6d5-dbb6-xxxxxxxxxxxx6957-bluemix.cloudant.com/iotp_xxxxxx_default_2018-08-27/_design/exportcsv"

curl을 이용할때는 credential을 url에 붙여서 request를 하면 됩니다.

2) Angularjs script 이용
javascript 로 http request를 하는데 credential 정보를 url에 붙여서 보내면 보안 issue로 인하여 block 됩니다. header에 넣어서 보내야 합니다. 이부분이 curl과 다른 부분 입니다.

a. 위에서 정의한 exportcsv.json file을 읽어옵니다.

$.getJSON("./assets/exportCsv.json", function( json_data ) {
      data=json_data
      requestToGetCSVsource.resolve('success');
});

b. http put request를 통해 view를 create합니다. (view는 post가 아닌 put으로 create 를 합니다)
**몇가지 Authorization 방법을 지원하는데 저는 Basic auth를 사용했습니다. username과 password를 조합하여 hash code를 생성해 넘겨주는 방식입니다.
** username과 password는 bluemix cloudant service credential 정보를 통해 얻을 수 있습니다.
** view가 만약 동일한 명칭으로 존재하고 있다면 conflict error가 발생합니다. update를 하고자 한다면 우선 GET requst를 통해 기존 View 정보를 가져와서 _id, _rev 를 넘겨야 합니다.

var url="https://xxxxxxxxxx-b44a-c5c57a556957-bluemix.cloudant.com/iotp_xxxx_default_2018-08-27/_design/exportcsv";
var _headers = {
    'Accept': 'application/json;charset=utf-8', 
    'Content-Type': 'application/json'   ,
    'Authorization':'Basic ZTJiNxxxxxxxxxxxVt2I0YTVhZGU3OA=='            
};

$http({
    method: 'PUT',
    url: url,
    data:data,
    headers:_headers
})  
.success(function(data)
{
    console.log('success:'+data)
}).error(function(data, status, headers, config) {
    console.log(' error:'+data)
});

put request가 성공하면 exportcsv라는 이름의 design document가 생성됩니다.

생성된 design document는 web gui 또는 http get request로 확인 할 수 있습니다.

1) web gui 로 확인
iotp_pylws9_default_2018-08-27 이란 database를 선택하면 아래와 같은 화면이 나타 납니다.
_design/exportcsv 라는 이름으로 design document가 생성된 것을 확인 할 수 있습니다.

2) http reques로 확인

curl -X GET https://username:password@xxxxxxxxxx-bluemix.cloudant.com/iotp_pylws9_default_2018-08-27/_design/iotp

[Query 하기]

생성한 view에 쿼리를 해보겠습니다.
아래 query는 deviceId가 M600-1 인 것 중 2016년과 2019년 사이에 생성된 data를 가져올 것입니다.
query시에 여러가지 parameter를 이용할 수 있습니다.
이중에 노란색으로 표신된 parameter를 이용하여 query 해보겠습니다.
query는 curl을 이용한 방식과 javascript(angularjs)를 이용한 두가지 방식으로 해보겠습니다.

Parameter

Description

reduce

If a Reduce function is defined, this parameter lets
you choose whether or not to run the Reduce step. The default value is 
true.

startkey

A URL encoded
JSON value indicating the 
key at which to start the range.

startkey_docid

The ID of the document with which to start the
range. This parameter is, for all intents and purposes, ignored if it is not
used in conjunction with the 
startkey parameter. CouchDB will
first look at the 
startkey parameter
and then use the 
startkey_docid parameter
to further refine the beginning of the range if multiple potential starting
rows have the same key but different document IDs.

endkey

A URL encoded
JSON value indicating the 
key at which to end the range.

endkey_docid

The ID of the document with which to end the range.
This parameter is, for all intents and purposes, ignored if it is not used in
conjunction with the 
endkey parameter.
CouchDB will first look at the 
endkey parameter and then use
the 
endkey_docid parameter
to further refine the end of the range if multiple potential ending rows have
the same key but different document IDs.

inclusive_end

Indicates whether to include the endkey and endkey_docid (if
set) in the range. The default value is 
true.

key

A URL encoded JSON value indicating an exact key on
which to match.

limit

The maximum number or rows to include in the output.

skip

The number of rows to skip. The default value
is 
0.

descending

Indicates whether to reverse the output to be in
descending order. The default value is 
false.
This option is applied before rows are filtered, so you will likely need to
swap your 
startkey/startkey_docid and endkey/endkey_docid parameter
values.

group

Indicates whether to group results by keys. This
parameter can only be 
true if
a Reduce function is defined for your view and the 
reduceparameter
is set to 
true (its
default). The default value of this parameter is 
false.

group_level

If your keys are JSON arrays, this parameter will
specify how many elements in those arrays to use for grouping purposes. If
your keys are not JSON arrays, this parameter
s value will
effectively be ignored.

include_docs

Indicates
whether to fetch the original document from which the row was emitted. This
parameter can only be 
true if a Reduce function
is notdefined for your view, or the 
reduce parameter
is set to 
false. The default value of this
parameter is 
false.

stale

Set the value of this parameter to ok if
you are OK with possibly getting outdated results. Set the value to 
update_after if
you are OK with possibly getting outdated results, but
would like to trigger a view update after your results have been retrieved.

1) curl사용

curl -X GET https://username:password@e2b4b6dxxxx-bluemix.cloudant.com/iotp_xxxx_default_2018-08-27/_design/exportcsv/_view/by-deviceId 
-G -d startkey='[“M600-1″,”2016”]’ -d endkey='[“M600-1″,”2019”]’

2) angularjs 사용

var url =’https://username:password@xxxxxxxxxxxxxxxx-bluemix.cloudant.com/iotp_xxxxxxxx_default_2018-08-27/_design/exportcsv/_list/csv/by-deviceId?include_docs=true&startkey=["M600-1","2016"]&endkey=["M600-1","2019"]’;
var _headers = {
    'Accept': 'application/json;charset=utf-8', 
    'Content-Type': 'application/json'   ,
    'Authorization':'Basic GI2ZDUYxxxxxxxxxxxxxxxxxxxI0YTVhZGU3OA=='            
};

$http({
    method: 'GET',
    url: url,
    headers:_headers
})  
.success(function(data) {
    console.log('success to get data')
}).error(function (data, status,headers, config) {
    console.log ("Error to get data"); 
});

[CSV 다운로드]

csv downlaod를 해보겠습니다. mime type을 csv로 하여 file download를 수행 하는 방식이므로 browser에서 수행 해야 합니다.
json으로 return 받았던 위의 과정과 다르게 이번에는 lists를 이용하여 document format을 csv로 변경된 상태로 받을 것입니다. deviceId가 M600-1 인 것 중 2018년 부터 2019년 사이의 doc을 읽어 csv로 download 할 것입니다.
(아래에서 사용되는 url정보는 bluemix credential info에 있습니다.)

1) browser 사용
브라우저에 아래 url을 입력하면 csv download가 수행 됩니다.

https://username:password@exxxxxxxxxxxxx7-bluemix.cloudant.com/iotp_xxxxx_default_2018-08-27/_design/exportcsv/_list/csv/by-deviceId?include_docs=true&startkey=[“M600-1″,”2016”]&endkey=[“M600-1”,”2019“]

CSV 파일이 다운로드 되었다면 성공 한 것입니다.

토론 참가

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.