ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 👀 Cassandra Keyspace, Table 스키마 생성(feat. Collection type, User-Defined type 생성)
    DataBase/Cassandra 2021. 7. 31. 23:53
    728x90

    1. KEYSPACE 생성 및 사용

    cqlsh> CREATE KEYSPACE test with replication = {'class': 'SimpleStrategy', 'replication_factor':1};
    cqlsh> use test;

     

     

    2. Table 스키마 생성

    cqlsh> CREATE TABLE stat (id text primary key, seedGoodsCode text, w2v_view list<text>, w2v_purchase list<text>, cf_item_to_item list<text>, ml_item_to_item list<text>, regDtm text);

     

     

    3. 스키마 구조에 맞춰 데이터 삽입

    > INSERT INTO stat JSON '{ 
        "id" : "60c93", 
        "seedGoodsCode" : "196", 
        "w2v_view" : [
       			{
                "candGoodsCode" : "1961", 
                "goodsNm" : "레이저 수평기", 
                "goodsCate" : "048", 
                "goodsCateNm" : "자동차/공구", 
                "value" : 0.5859805955152076
            },
    		    {
                "candGoodsCode" : "1962", 
                "goodsNm" : "캔스톤 스피커", 
                "goodsCate" : "045", 
                "goodsCateNm" : "디지털/가전", 
                "value" : 0.628591838922856
            } 
        ],
        "w2v_purchase" : [
        	 {
                "candGoodsCode" : "1963", 
                "goodsNm" : "타이스노우체인", 
                "goodsCate" : "048", 
                "goodsCateNm" : "자동차/공구", 
                "value" : 0.5901372861625159
            } 
        ],
        "cf_item_to_item" : [
            {
                "candGoodsCode" : "1964", 
                "goodsNm" : "재사용 에너로이드", 
                "goodsCate" : "045", 
                "goodsCateNm" : "디지털/가전", 
                "value" : 0.6102703937448448
            }
        ],
        "ml_item_to_item" : [
            {
                "candGoodsCode" : "1965", 
                "goodsNm" : "접이식욕조", 
                "goodsCate" : "041", 
                "goodsCateNm" : "생활/욕실", 
                "value" : 0.6108573066498462
            }
        ],
        "regDtm" : "2021-06-15T23:30:30.407+0000"
    }';

     

    💩 InvalidRequest: Error from server: code=2200 [Invalid query] message="Error decoding JSON value for cf_item_t o_item: Expected a UTF-8 string, but got a LinkedHashMap: {candGoodsCode=196, goodsNm=재사용 에너로이드, goodsCate=045, goodsCateNm=디지털/가전, value=0.6102703937448448}"

     

    몇 개의 필드들이 리스트 안에 딕셔너리 데이터를 갖는 nested 구조 이기 때문에,

    그냥 기본 JSON 형태로 insert를 시도했을 때 에러가 났다.

     

    👉 따라서 List Type JSON형태로의 삽입을 시도해봤다.

     

    3-1) List Type JSON으로 삽입하기

    *Map: key-value pairs 저장하기위한 Type

    https://docs.datastax.com/en/cql-oss/3.3/cql/cql_reference/collection_type_r.html

     

    Collection type

    A collection column is declared using the collection type, followed by another type. A collection column is declared using the collection type, followed by another type, such as int or text, in angle brackets. For example, you can create a table having a l

    docs.datastax.com

     

    > CREATE TABLE stat (id text PRIMARY KEY, seedGoodsCode text, w2v_view list<frozen<map<text,text>>>, regDtm text);
    > INSERT INTO stat JSON '{ 
        "id" : "60c9382464f6fa1c7730e9ec", 
        "seedGoodsCode" : "196",
        "w2v_view" : [
       			{
                "candGoodsCode" : "1961", 
                "goodsNm" : "레이저 수평기", 
                "goodsCate" : "048", 
                "goodsCateNm" : "자동차/공구", 
                "value" : 0.5859805955152076
            },
    		    {
                "candGoodsCode" : "1962", 
                "goodsNm" : "캔스톤 스피커", 
                "goodsCate" : "045", 
                "goodsCateNm" : "디지털/가전", 
                "value" : 0.628591838922856
            } 
        ],
        "regDtm" : "2021-06-15T23:30:30.407+0000"
    }';

     

    💩 InvalidRequest: Error from server: code=2200 [Invalid query] message="Error decoding JSON value for w2v_view: Expected a UTF-8 string, but got a Double: 0.5859805955152076"

    위와 같은 방법은, nested 구조 딕셔너리 내부 값의 type을 하나로 통일해줘야 하는 문제가 있었으므로,

    value값을 string이 아닌, int/float 등의 다른 형태로 지정하려면 다른 방법을 적용해야 했다.

     

    따라서, 여러 방안을 검색해본 결과 User-Defined Type을 생성하여 다시 시도를 해보았다.

     


    1. User-Defined-Type 생성하기

    cqlsh:test> CREATE TYPE test.rrf_type (
    	candGoodsCode text,
    	goodsNm text,
    	goodsCate text,
    	goodsCateNm text,
    	value double
    );
    # TYPE 삭제(TABLE 삭제 후 TYPE 삭제할 것!)
    cqlsh:test> DROP TABLE stats;
    cqlsh:test> DROP TYPE test.rrf_type;

     

    생각해볼 방안:

    1. 현재 리스트 내부 datatype을 유지하며 추가적인 데이터 삽입은 없음
    2. 현재 리스트 내부 datatype 형태로 추가적인 데이터 삽입 필요

     

    2. Table 스키마 생성

    cqlsh:test> CREATE TABLE stat (id text PRIMARY KEY, seedGoodsCode text, w2v_view list<frozen<rrf_type>>, w2v_purchase list<frozen<rrf_type>>, cf_item_to_item list<frozen<rrf_type>>, ml_item_to_item list<frozen<rrf_type>>, regDtm text);
    cqlsh:test> INSERT INTO stat JSON '{ 
        "id" :  "60d11ec2e15e7216557ff208", 
        "seedGoodsCode" : "196", 
        "w2v_view" : [
       			{
                "candGoodsCode" : "1961", 
                "goodsNm" : "레이저 수평기", 
                "goodsCate" : "048", 
                "goodsCateNm" : "자동차/공구", 
                "value" : 0.5859805955152076
            },
    		    {
                "candGoodsCode" : "1962", 
                "goodsNm" : "캔스톤 스피커", 
                "goodsCate" : "045", 
                "goodsCateNm" : "디지털/가전", 
                "value" : 0.628591838922856
            } 
        ],
        "w2v_purchase" : [
        	 {
                "candGoodsCode" : "1963", 
                "goodsNm" : "타이스노우체인", 
                "goodsCate" : "048", 
                "goodsCateNm" : "자동차/공구", 
                "value" : 0.5901372861625159
            } 
        ],
        "cf_item_to_item" : [
            {
                "candGoodsCode" : "1964", 
                "goodsNm" : "재사용 에너로이드", 
                "goodsCate" : "045", 
                "goodsCateNm" : "디지털/가전", 
                "value" : 0.6102703937448448
            }
        ],
        "ml_item_to_item" : [
            {
                "candGoodsCode" : "1965", 
                "goodsNm" : "접이식욕조", 
                "goodsCate" : "041", 
                "goodsCateNm" : "생활/욕실", 
                "value" : 0.6108573066498462
            }
        ],
        "regDtm" : "2021-06-21T23:20:06.420+0000"
    }';

     

    - 이상 오늘의 삽질일기 끝:)

     

     


    여기저기 삽질도 해보고

    날려도 먹으면서

    배우는 게

    결국 남는거다

    - Z.Sabziller

     

     

    댓글

Designed by Tistory.