Metatron-discovery: Add validation for geo(wkt) type

Created on 11 Mar 2019  Β·  15Comments  Β·  Source: metatron-app/metatron-discovery

Is your feature request related to a problem? Please describe.
ν˜„μž¬ Geo point νƒ€μž…μ€ 인제슀천 ν•  λ•Œ μœ μ €κ°€ μƒμ„±ν•΄μ•Όλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 기쑴에 생성해 놓은 Geo pointλ₯Ό ν™œμš©ν•˜λŠ” μ‚¬μš©μ„±μ΄ 컀쑌으며, 일일히 Geo point νƒ€μž…μ„ μƒμ„±ν•˜κΈ°μ— λ²ˆκ±°λ‘œμ›€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

Describe the solution you'd like
Geo point type으둜 λ³€κ²½ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
λ”λΆˆμ–΄ WKT 포맷만 μ§€μ›ν•©λ‹ˆλ‹€. 이미 WKT 포맷으둜 μž‘μ„±λœ 데이터일 κ²½μš°μ—λ§Œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Describe alternatives you've considered

  1. Datasource > Create Datasrouce
    : 데이터 μ†ŒμŠ€λ‘œ 인제슀천 ν•  λ•Œ λ³€κ²½ 지원.
    스크란샷 2019-03-11 α„‹α…©α„Œα…₯ᆫ 11 22 32
    .
    .
  2. Datasource > Column details > Configure schema
    스크란샷 2019-03-11 α„‹α…©α„Œα…₯ᆫ 11 16 32
    .
    .
  3. Metadata > Column details
    스크란샷 2019-03-11 α„‹α…©α„Œα…₯ᆫ 11 16 38
enhancement @datasource @metadata

All 15 comments

~이 μ΄μŠˆλŠ” #1540 μ—μ„œ 같이 μ§„ν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€~

@kyungtaak @AnnieHwang
질문이 μžˆμŠ΅λ‹ˆλ‹€.

  1. ν˜„μž¬ '상세 > 컬럼 μŠ€ν‚€λ§ˆ' ν™”λ©΄μ—μ„œ Geo Point만 μˆ˜μ •ν•˜λŠ” κ²ƒμœΌλ‘œ κΈ°νšν–ˆμ—ˆλŠ”λ°, 인제슀천 ν™”λ©΄μ—μ„œλŠ” Geo point 뿐 μ•„λ‹ˆλΌ Geo line, Geo polygonκΉŒμ§€ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ‘ λ™μΌν•˜κ²Œ point,line, polygonκΉŒμ§€ 지원해야 ν• κΉŒμš”?

  2. Geo point 둜 λ³€κ²½μ‹œ WKT포맷인지 μ•„λ‹Œμ§€λ§Œ νŒλ‹¨ν•œλ‹€κ³  κ°€μ΄λ“œ λ°›μ•˜μ—ˆλŠ”λ°μš”
    ν˜„μž¬ 인제슀천 ν™”λ©΄μ—μ„œλŠ” Geo coordinatesλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    Geo coordinates 섀정뢀뢄이 '상세 > 컬럼 μŠ€ν‚€λ§ˆ'화면에도 λ™μΌν•˜κ²Œ μ μš©λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.
    스크란샷 2019-03-20 α„‹α…©α„Œα…₯ᆫ 11 22 12

@kyungtaak @AnnieHwang @brandon-wonjune @ninezero90hy

  1. ν˜„μž¬ '상세 > 컬럼 μŠ€ν‚€λ§ˆ' ν™”λ©΄μ—μ„œ Geo Point만 μˆ˜μ •ν•˜λŠ” κ²ƒμœΌλ‘œ κΈ°νšν–ˆμ—ˆλŠ”λ°, 인제슀천 ν™”λ©΄μ—μ„œλŠ” Geo point 뿐 μ•„λ‹ˆλΌ Geo line, Geo polygonκΉŒμ§€ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ‘ λ™μΌν•˜κ²Œ point,line, polygonκΉŒμ§€ 지원해야 ν• κΉŒμš”?
  2. Geo point 둜 λ³€κ²½μ‹œ WKT포맷인지 μ•„λ‹Œμ§€λ§Œ νŒλ‹¨ν•œλ‹€κ³  κ°€μ΄λ“œ λ°›μ•˜μ—ˆλŠ”λ°μš”
    ν˜„μž¬ 인제슀천 ν™”λ©΄μ—μ„œλŠ” Geo coordinatesλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    Geo coordinates 섀정뢀뢄이 '상세 > 컬럼 μŠ€ν‚€λ§ˆ'화면에도 λ™μΌν•˜κ²Œ μ μš©λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

μœ„ 상황에 λŒ€ν•˜μ—¬ 인제슀천, μ»¬λŸΌμŠ€ν‚€λ§ˆ λͺ¨λ‘ λ™μΌν•œ UIκ°€ μ μš©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
이에 따라 λ³€κ²½λœ ν™”λ©΄ κ³΅μœ ν•©λ‹ˆλ‹€.

  1. Datasource > Ingestion
    (Geo) Point/Line/Polygonνƒ€μž…μœΌλ‘œ μˆ˜μ • μ¦‰μ‹œ WKT포맷 μœ νš¨μ„± 검사가 이뀄져야 ν•©λ‹ˆλ‹€.
    λ”λΆˆμ–΄ μœ νš¨ν•˜μ§€ μ•Šμ„κ²½μš° κ²½κ³ λ₯Ό λ„μš°λ©°, μ’Œν‘œκ³„ Select boxλ₯Ό λΉ„ν™œμ„±ν™” ν•΄μ£Όμ„Έμš”.
    01Ingestion

.
.

  1. Datasource > Column details > Configure the schema
    ColumnSchema01
    rule
    (Geo) Point/Line/Polygon μˆ˜μ •μ„ μ§€μ›ν•©λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ μˆ˜μ • μ¦‰μ‹œ WKT포맷 μœ νš¨μ„± 검사가 이뀄지며 μœ νš¨ν•˜μ§€ μ•Šμ„ 경우 μ €μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    information λ ˆμ΄μ–΄μ—μ„œ μ’Œν‘œκ³„ 섀정을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

.
.

  1. Metadata > Column schema
    ColumnSchema02
    2번과 같은 λ‚΄μš©μ„ μ§€μ›ν•©λ‹ˆλ‹€.

pptν™”λ©΄ μž…λ‹ˆλ‹€.
#1625_Change GeoPoint Type.pptx
μ°Έκ³ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

@kyungtaak 메타데이터 컬럼 λͺ©λ‘ μ‘°νšŒμ‹œ 포맷 ν•„λ“œκ°€ μ—†μŠ΅λ‹ˆλ‹€. 확인 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€

  • 메타데이터 컬럼쑰회 - [GET] /api/metadatas/{id}/columns?projection=forListView
[{
    "name": "id",
    "id": "42",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "id"
}, {
    "name": "created_by",
    "id": "43",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "created_by"
}, {
    "name": "created_time",
    "id": "44",
    "type": "TIMESTAMP",
    "role": "TIMESTAMP",
    "popularity": 0.0,
    "physicalType": "TIMESTAMP",
    "physicalName": "created_time"
}, {
    "name": "modified_by",
    "id": "45",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "modified_by"
}, {
    "name": "modified_time",
    "id": "46",
    "type": "TIMESTAMP",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "TIMESTAMP",
    "physicalName": "modified_time"
}, {
    "name": "version",
    "id": "47",
    "type": "INTEGER",
    "role": "MEASURE",
    "popularity": 0.0,
    "physicalType": "LONG",
    "physicalName": "version"
}, {
    "name": "ds_conn_type",
    "id": "48",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_conn_type"
}, {
    "name": "datasource_contexts",
    "id": "49",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "datasource_contexts"
}, {
    "name": "ds_desc",
    "id": "50",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_desc"
}, {
    "name": "ds_type",
    "id": "51",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_type"
}, {
    "name": "ds_engine_name",
    "id": "52",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_engine_name"
}, {
    "name": "ds_fail_on_engine",
    "id": "53",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_fail_on_engine"
}, {
    "name": "ds_fields_matched",
    "id": "54",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_fields_matched"
}, {
    "name": "ds_granularity",
    "id": "55",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_granularity"
}, {
    "name": "ds_include_geo",
    "id": "56",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_include_geo"
}, {
    "name": "ingestion_conf",
    "id": "57",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ingestion_conf"
}, {
    "name": "ds_linked_workspaces",
    "id": "58",
    "type": "INTEGER",
    "role": "MEASURE",
    "popularity": 0.0,
    "physicalType": "INTEGER",
    "physicalName": "ds_linked_workspaces"
}, {
    "name": "ds_name",
    "id": "59",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_name"
}, {
    "name": "ds_owner_id",
    "id": "60",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_owner_id"
}, {
    "name": "ds_partition_keys",
    "id": "61",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_partition_keys"
}, {
    "name": "ds_partition_separator",
    "id": "62",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_partition_separator"
}, {
    "name": "ds_published",
    "id": "63",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_published"
}, {
    "name": "ds_seg_granularity",
    "id": "64",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_seg_granularity"
}, {
    "name": "ds_src_type",
    "id": "65",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_src_type"
}, {
    "name": "ds_status",
    "id": "66",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ds_status"
}, {
    "name": "dc_id",
    "id": "67",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "dc_id"
}, {
    "name": "ss_id",
    "id": "68",
    "type": "STRING",
    "role": "DIMENSION",
    "popularity": 0.0,
    "physicalType": "STRING",
    "physicalName": "ss_id"
}, {
    "name": "smy_id",
    "id": "69",
    "type": "INTEGER",
    "role": "MEASURE",
    "popularity": 0.0,
    "physicalType": "LONG",
    "physicalName": "smy_id"
}]

  • ν•΄λ‹Ή λ©”νƒ€λ°μ΄ν„°μ˜ λ°μ΄ν„°μ†ŒμŠ€ 정보
{
    ...
    "name": "datasource",
    "fields": [{
        "id": 10047066,
        "name": "id",
        "logicalName": "id",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 0
    }, {
        "id": 10047067,
        "name": "created_by",
        "logicalName": "created_by",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 1
    }, {
        "id": 10047068,
        "name": "created_time",
        "logicalName": "created_time",
        "type": "TIMESTAMP",
        "logicalType": "TIMESTAMP",
        "role": "TIMESTAMP",
        "aggrType": "NONE",
        "seq": 2,
        "format": {
            "type": "time_format",
            "format": "yyyy-MM-dd HH:mm:ss.SSSSSS",
            "timeZone": "Asia/Seoul",
            "locale": "en"
        }
    }, {
        "id": 10047069,
        "name": "modified_by",
        "logicalName": "modified_by",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 3
    }, {
        "id": 10047070,
        "name": "modified_time",
        "logicalName": "modified_time",
        "type": "TIMESTAMP",
        "logicalType": "TIMESTAMP",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 4,
        "format": {
            "type": "time_format",
            "format": "yyyy-MM-dd HH:mm:ss.SSSSSS",
            "timeZone": "Asia/Seoul",
            "locale": "en"
        }
    }, {
        "id": 10047071,
        "name": "version",
        "logicalName": "version",
        "type": "LONG",
        "logicalType": "INTEGER",
        "role": "MEASURE",
        "aggrType": "NONE",
        "seq": 5
    }, {
        "id": 10047072,
        "name": "ds_conn_type",
        "logicalName": "ds_conn_type",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 6
    }, {
        "id": 10047073,
        "name": "datasource_contexts",
        "logicalName": "datasource_contexts",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 7
    }, {
        "id": 10047074,
        "name": "ds_desc",
        "logicalName": "ds_desc",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 8
    }, {
        "id": 10047075,
        "name": "ds_type",
        "logicalName": "ds_type",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 9
    }, {
        "id": 10047076,
        "name": "ds_engine_name",
        "logicalName": "ds_engine_name",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 10
    }, {
        "id": 10047077,
        "name": "ds_fail_on_engine",
        "logicalName": "ds_fail_on_engine",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 11
    }, {
        "id": 10047078,
        "name": "ds_fields_matched",
        "logicalName": "ds_fields_matched",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 12
    }, {
        "id": 10047079,
        "name": "ds_granularity",
        "logicalName": "ds_granularity",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 13
    }, {
        "id": 10047080,
        "name": "ds_include_geo",
        "logicalName": "ds_include_geo",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 14
    }, {
        "id": 10047081,
        "name": "ingestion_conf",
        "logicalName": "ingestion_conf",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 15
    }, {
        "id": 10047082,
        "name": "ds_linked_workspaces",
        "logicalName": "ds_linked_workspaces",
        "type": "INTEGER",
        "logicalType": "INTEGER",
        "role": "MEASURE",
        "aggrType": "NONE",
        "seq": 16
    }, {
        "id": 10047083,
        "name": "ds_name",
        "logicalName": "ds_name",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 17
    }, {
        "id": 10047084,
        "name": "ds_owner_id",
        "logicalName": "ds_owner_id",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 18
    }, {
        "id": 10047085,
        "name": "ds_partition_keys",
        "logicalName": "ds_partition_keys",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 19
    }, {
        "id": 10047086,
        "name": "ds_partition_separator",
        "logicalName": "ds_partition_separator",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 20
    }, {
        "id": 10047087,
        "name": "ds_published",
        "logicalName": "ds_published",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 21
    }, {
        "id": 10047088,
        "name": "ds_seg_granularity",
        "logicalName": "ds_seg_granularity",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 22
    }, {
        "id": 10047089,
        "name": "ds_src_type",
        "logicalName": "ds_src_type",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 23
    }, {
        "id": 10047090,
        "name": "ds_status",
        "logicalName": "ds_status",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 24
    }, {
        "id": 10047091,
        "name": "dc_id",
        "logicalName": "dc_id",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 25
    }, {
        "id": 10047092,
        "name": "ss_id",
        "logicalName": "ss_id",
        "type": "STRING",
        "logicalType": "STRING",
        "role": "DIMENSION",
        "aggrType": "NONE",
        "seq": 26
    }, {
        "id": 10047093,
        "name": "smy_id",
        "logicalName": "smy_id",
        "type": "LONG",
        "logicalType": "INTEGER",
        "role": "MEASURE",
        "aggrType": "NONE",
        "seq": 27
    }],
    "id": "9f8d9c91-2067-416c-8571-d84e654ae5b6",
    "engineName": "datasource",
    "description": "",
    "status": "ENABLED",
    "ingestion": {
        "type": "single",
        "connection": {
            "implementor": "MYSQL",
            "type": "JDBC",
            "hostname": "localhost",
            "port": 3306,
            "username": "polaris",
            "password": "polaris",
            "authenticationType": "MANUAL",
            "linkedWorkspaces": 0,
            "connectUrl": "jdbc:mysql://localhost:3306/"
        },
        "database": "polaris",
        "dataType": "TABLE",
        "query": "datasource",
        "rollup": true,
        "intervals": ["2019-03-10T09/2019-03-18T17"],
        "fetchSize": 200,
        "maxLimit": 10000000,
        "scope": "ALL"
    },
    "contexts": {},
    "dsType": "MASTER",
    ...
}

@AnnieHwang μΆ”κ°€λœλ‚΄μš© λ””μžμΈ μ²¨λΆ€ν•©λ‹ˆλ‹€- κ²€ν†  λΆ€νƒλ“œλ €μš”

  1. Datasource > Ingestion : μ•„λž˜λ‚΄μš© 적용 λΆ€νƒλ“œλ €μš”-

    (Geo) Point/Line/Polygonνƒ€μž…μœΌλ‘œ μˆ˜μ • μ¦‰μ‹œ WKT포맷 μœ νš¨μ„± 검사가 이뀄져야 ν•©λ‹ˆλ‹€.
    λ”λΆˆμ–΄ μœ νš¨ν•˜μ§€ μ•Šμ„κ²½μš° κ²½κ³ λ₯Ό λ„μš°λ©°, μ’Œν‘œκ³„ Select boxλ₯Ό λΉ„ν™œμ„±ν™” ν•΄μ£Όμ„Έμš”.

  2. Datasource > Column details > Configure the schema
    image

  3. Metadata > Column schema
    image

@kyungtaak GEOνƒ€μž…μœΌλ‘œ λ°μ΄ν„°μ†ŒμŠ€ 생성쀑 μ—λŸ¬ 문의 μž…λ‹ˆλ‹€.
μ•„λž˜μ˜ νŒŒμΌμ„ μ΄μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈν•˜μ˜€μŠ΅λ‹ˆλ‹€.

sales_geo_test.csv.zip

  1. λ°μ΄ν„°μ†ŒμŠ€ 생성 > 파일둜 생성 > 파일 μ—…λ‘œλ“œ
  2. config ν™”λ©΄μ—μ„œ κ°€μž₯ 첫번째 column인 GeoPointλ₯Ό GEO_POINTνƒ€μž…μœΌλ‘œ λ³€κ²½
  3. λ°μ΄ν„°μ†ŒμŠ€ 생성
  4. error
// api
api/datasources

// error
2019-03-21T04:31:30,130 INFO [task-runner-0-priority-0] io.druid.indexing.overlord.TaskRunnerUtils - Task [index_test4_2_2019-03-21T04:31:25.849Z] status changed to [FAILED]. 
2019-03-21T04:31:30,132 INFO [task-runner-0-priority-0] io.druid.indexing.worker.executor.ExecutorLifecycle - Task completed with status: { 
"id" : "index_test4_2_2019-03-21T04:31:25.849Z", 
"status" : "FAILED", 
"duration" : 338, 
"reason" : "Exception: [io.druid.segment.serde.StructMetricSerde$2.extractElement(StructMetricSerde.java:189), io.druid.segment.serde.StructMetricSerde$2.extractValue(StructMetricSerde.java:137), io.druid.segment.ColumnSelectorFactories$FromInputRow$8.get(ColumnSelectorFactories.java:576), io.druid.query.aggregation.Aggregators$3.aggregate(Aggregators.java:245), io.druid.segment.incremental.OnheapIncrementalIndex.aggregate(OnheapIncrementalIndex.java:238), io.druid.segment.incremental.OnheapIncrementalIndex.factorizeAggs(OnheapIncrementalIndex.java:223), io.druid.segment.incremental.OnheapIncrementalIndex.addToFacts(OnheapIncrementalIndex.java:195), io.druid.segment.incremental.IncrementalIndex.addTimeAndDims(IncrementalIndex.java:445), io.druid.segment.incremental.IncrementalIndex.add(IncrementalIndex.java:440), io.druid.segment.realtime.plumber.Sink.add(Sink.java:160), io.druid.indexing.common.index.YeOldePlumberSchool$1.add(YeOldePlumberSchool.java:139), io.druid.indexing.common.task.IndexTask.generateSegment(IndexTask.java:415), ... more]" 
} 

@brandon-wonjune "GeoPoint" μ»¬λŸΌκ°’μ΄ "25.9597,-80.1403" μΈλ°μš”.

  1. 이미 wkt μœ νš¨κ°’μ„ κ²€μ¦ν•˜λ©΄ 였λ₯˜κ°€ λ‚˜μ•Ό μ •μƒμž…λ‹ˆλ‹€.
  2. "POINT (lat lon)" 둜 λ§Œλ“€κ³  ν…ŒμŠ€νŠΈ ν•΄λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€.

@kyungtaak wkt μœ νš¨κ°’ κ²€μ¦μ‹œ μ‚¬μš©λœ νŒŒλΌλ©”ν„° μ •λ³΄μž…λ‹ˆλ‹€.
wktμœ νš¨κ°’ κ²€μ¦μ‹œ validκ°€ TRUEκ°€ λ˜κ³ μžˆμŠ΅λ‹ˆλ‹€.

// api
api/datasources/validation/wkt

// result
message: null
suggestType: null
valid: true

// param
{
 geoType: "GEO_POINT",
 values: [
"POINT (25.9597 -80.1403)",
"POINT (27.5569 -99.4907)",
"POINT (27.5569 -99.4907)",
"POINT (27.7898 -82.7243)",
"POINT (27.7898 -82.7243)",
"POINT (29.8941 -95.6481)",
"POINT (30.6448 -95.5798)",
"POINT (30.6448 -95.5798)",
"POINT (32.5449 -93.7038)",
"POINT (32.5449 -93.7038)",
"POINT (32.5449 -93.7038)",
"POINT (32.5449 -93.7038)",
"POINT (32.5449 -93.7038)",
"POINT (32.8455 -117.2521)",
"POINT (32.8455 -117.2521)",
"POINT (32.8455 -117.2521)",
"POINT (32.8455 -117.2521)",
"POINT (32.8473 -79.8206)",
"POINT (33.0535 -117.2689)"
 ]
}

@brandon-wonjune μ£Όμ‹  μƒ˜ν”Œμ€ 그게 μ•„λ‹ˆλ˜λ°μš”.;;

@kyungtaak μ£„μ†‘ν•©λ‹ˆλ‹€.
μ‹€ 데이터가 POINT (32.8455 -117.2521)ν˜•νƒœλ‘œ μŒ“μ—¬μžˆμ–΄μ•Ό κ°€λŠ₯ν•œκ±°κ΅°μš”.
ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ GEO νƒ€μž…μ— 맞게 λ³€ν™˜ν•˜μ—¬ valid 체크λ₯Ό ν•˜λŠ” 쀄 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.
μˆ˜μ •ν•˜μ—¬ λ‹€μ‹œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
ν…ŒμŠ€νŠΈμ— μ‚¬μš©λœ νŒŒμΌμ€ μ•„λž˜ μž…λ‹ˆλ‹€.
geo_test.zip

ν…ŒμŠ€νŠΈ μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. λ°μ΄ν„°μ†ŒμŠ€ 생성 > 파일둜 생성 > 파일 μ—…λ‘œλ“œ
  2. config ν™”λ©΄μ—μ„œ κ°€μž₯ 첫번째 column인 GeoPointλ₯Ό GEO_POINTνƒ€μž…μœΌλ‘œ λ³€κ²½
  3. validation 체크 > true 확인
// api 
api/datasources/validation/wkt

// param
{geoType:"GEO_POINT",
values:["POINT (25.9597 -80.1403)","POINT (27.5569 -99.4907)","POINT (27.5569 -99.4907)","POINT (27.7898 -82.7243)","POINT (27.7898 -82.7243)","POINT (29.8941 -95.6481)","POINT (30.6448 -95.5798)","POINT (30.6448 -95.5798)","POINT (32.5449 -93.7038)","POINT (32.5449 -93.7038)","POINT (32.5449 -93.7038)","POINT (32.5449 -93.7038)","POINT (32.5449 -93.7038)","POINT (32.8455 -117.2521)","POINT (32.8455 -117.2521)","POINT (32.8455 -117.2521)","POINT (32.8455 -117.2521)","POINT (32.8473 -79.8206)","POINT (33.0535 -117.2689)"]
}

// result
{
message: null
suggestType: null
valid: true
}
  1. λ°μ΄ν„°μ†ŒμŠ€ 생성
  2. μƒμ„±λœ λ°μ΄ν„°μ†ŒμŠ€ ν™”λ©΄μœΌλ‘œ 이동
  3. ingestion fail error
// error
2019-03-22 05:06:44.558 ERROR [-] [ingestion-02a617cb-02da-4e1c-9191-14e22732515d-0] a.m.d.d.d.i.job.IngestionJobRunner       : Fail to ingestion : IngestionHistory{dataSourceId='02a617cb-02da-4e1c-9191-14e22732515d', ingestionId='index__hacye_2019-03-22T05:06:35.402Z', ingestionMethod=null, duration=null, status=FAILED, errorCode=INGESTION_ENGINE_TASK_ERROR, progress=ENGINE_RUNNING_TASK, cause='DataSourceIngestionException: An error occurred while loading the data source : Exception: [io.druid.segment.serde.StructMetricSerde$2.extractElement(StructMetricSerde.java:189), io.druid.segment.serde.StructMetricSerde$2.extractValue(StructMetricSerde.java:137), io.druid.segment.ColumnSelectorFactories$FromInputRow$8.get(ColumnSelectorFactories.java:576), io.druid.query.aggregation.Aggregators$3.aggregate(Aggregators.java:245), io.druid.segment.incremental.OnheapIncrementalIndex.aggregate(OnheapIncrementalIndex.java:238), io.druid.segment.incremental.OnheapIncrementalIndex.factorizeAggs(OnheapIncrementalIndex.java:223), io.druid.segment.incremental.OnheapIncrementalIndex.addToFacts(OnheapIncrementalIndex.java:195), io.druid.segment.incremental.IncrementalIndex.addTimeAndDims(IncrementalIndex.java:445), io.druid.segment.incremental.IncrementalIndex.add(IncrementalIndex.java:440), io.druid.segment.realtime.plumber.Sink.add(Sink.java:160), io.druid.indexing.common.index.YeOldePlumberSchool$1.add(YeOldePlumberSchool.java:139), io.druid.indexing.common.task.IndexTask.generateSegment(IndexTask.java:415), ... more]'} app.metatron.discovery.domain.datasource.ingestion.IngestionHistory@6ebce9c2

app.metatron.discovery.domain.datasource.DataSourceIngestionException: An error occurred while loading the data source : Exception: [io.druid.segment.serde.StructMetricSerde$2.extractElement(StructMetricSerde.java:189), io.druid.segment.serde.StructMetricSerde$2.extractValue(StructMetricSerde.java:137), io.druid.segment.ColumnSelectorFactories$FromInputRow$8.get(ColumnSelectorFactories.java:576), io.druid.query.aggregation.Aggregators$3.aggregate(Aggregators.java:245), io.druid.segment.incremental.OnheapIncrementalIndex.aggregate(OnheapIncrementalIndex.java:238), io.druid.segment.incremental.OnheapIncrementalIndex.factorizeAggs(OnheapIncrementalIndex.java:223), io.druid.segment.incremental.OnheapIncrementalIndex.addToFacts(OnheapIncrementalIndex.java:195), io.druid.segment.incremental.IncrementalIndex.addTimeAndDims(IncrementalIndex.java:445), io.druid.segment.incremental.IncrementalIndex.add(IncrementalIndex.java:440), io.druid.segment.realtime.plumber.Sink.add(Sink.java:160), io.druid.indexing.common.index.YeOldePlumberSchool$1.add(YeOldePlumberSchool.java:139), io.druid.indexing.common.task.IndexTask.generateSegment(IndexTask.java:415), ... more]
    at app.metatron.discovery.domain.datasource.ingestion.job.IngestionJobRunner.ingestion(IngestionJobRunner.java:198)
    at app.metatron.discovery.domain.datasource.DataSourceEventHandler.lambda$checkCreateAuthority$0(DataSourceEventHandler.java:234)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

@brandon-wonjune point νƒ€μž…μ˜ wkt ν˜•μ‹μ— λŒ€ν•œ 적재 μ΄μŠˆλŠ” 별도 이슈둜 κ΄€λ¦¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

@brandon-wonjune 적재 μ΄μŠˆλŠ” ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ›λž˜ λͺ©ν‘œν•˜λ˜ κΈ°λŠ₯이 μ™„λ£Œ λ˜μ—ˆμœΌλ©΄, μ΄λ²ˆλ¦΄λ¦¬μ¦ˆμ— ν•¨κ»˜ ν¬ν•¨ν•΄μ„œ κ°€λŠ”κ²Œ 쒋을것 κ°™λ„€μš”.

@kyungtaak 메타데이터 μͺ½ 확인이 되면 PRμ˜€ν”ˆν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€

@kyungtaak μ†ŒμŠ€μƒμ„±ν›„ μƒμ„Έν™”λ©΄μ—μ„œ μ μž¬μ‹œ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.
ν…ŒμŠ€νŠΈν•œ 파일과 μˆœμ„œλŠ” μœ„μ™€ λ™μΌν•˜κ²Œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
druidλŠ” https://github.com/metatron-app/metatron-discovery 메인화면에 μžˆλŠ”κ²ƒμœΌλ‘œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

// error
2019-03-28 01:27:04.429 ERROR [-] [ingestion-796ce20e-0371-4e71-9c81-f12e6eb78c7b-0] a.m.d.d.d.i.job.IngestionJobRunner       : Fail to ingestion : IngestionHistory{dataSourceId='796ce20e-0371-4e71-9c81-f12e6eb78c7b', ingestionId='null', ingestionMethod=null, duration=null, status=FAILED, errorCode=INGESTION_ENGINE_ACCESS_ERROR, progress=ENGINE_INIT_TASK, cause='QueryTimeExcetpion: [{"error":"Could not resolve type id 'latlon.shape' into a subtype of [simple type, class io.druid.segment.lucene.LuceneIndexingStrategy]\n at [Source: HttpInputOverHTTP@327bc1b1; line: 1, column: 1766] (through reference chain: java.util.LinkedHashMap[\"GeoPoint\"]->java.util.ArrayList[0])"}]'} app.metatron.discovery.domain.datasource.ingestion.IngestionHistory@3080a5f4

app.metatron.discovery.domain.datasource.DataSourceIngestionException: Failed to access to the engine
    at app.metatron.discovery.domain.datasource.ingestion.job.AbstractIngestionJob.doIngestion(AbstractIngestionJob.java:184)
    at app.metatron.discovery.domain.datasource.ingestion.job.FileIngestionJob.process(FileIngestionJob.java:127)
    at app.metatron.discovery.domain.datasource.ingestion.job.IngestionJobRunner.ingestion(IngestionJobRunner.java:191)
    at app.metatron.discovery.domain.datasource.DataSourceEventHandler.lambda$checkCreateAuthority$0(DataSourceEventHandler.java:244)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: app.metatron.discovery.domain.engine.EngineException: Fail to process response : [{"error":"Could not resolve type id 'latlon.shape' into a subtype of [simple type, class io.druid.segment.lucene.LuceneIndexingStrategy]\n at [Source: HttpInputOverHTTP@327bc1b1; line: 1, column: 1766] (through reference chain: java.util.LinkedHashMap[\"GeoPoint\"]->java.util.ArrayList[0])"}]
    at app.metatron.discovery.domain.engine.AbstractEngineRepository.call(AbstractEngineRepository.java:126)
    at app.metatron.discovery.domain.engine.AbstractEngineRepository.call(AbstractEngineRepository.java:111)
    at app.metatron.discovery.domain.engine.DruidEngineRepository.ingestion(DruidEngineRepository.java:71)
    at app.metatron.discovery.domain.engine.DruidEngineRepository$$FastClassBySpringCGLIB$$7c06ef0f.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
    at app.metatron.discovery.domain.engine.QueryServiceAspect.engineQueryProcessing(QueryServiceAspect.java:119)
    at sun.reflect.GeneratedMethodAccessor232.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
    at app.metatron.discovery.domain.engine.DruidEngineRepository$$EnhancerBySpringCGLIB$$90f07aaf.ingestion(<generated>)
    at app.metatron.discovery.domain.datasource.ingestion.job.AbstractIngestionJob.doIngestion(AbstractIngestionJob.java:180)
    ... 8 common frames omitted
Caused by: app.metatron.discovery.domain.datasource.data.QueryTimeExcetpion: [{"error":"Could not resolve type id 'latlon.shape' into a subtype of [simple type, class io.druid.segment.lucene.LuceneIndexingStrategy]\n at [Source: HttpInputOverHTTP@327bc1b1; line: 1, column: 1766] (through reference chain: java.util.LinkedHashMap[\"GeoPoint\"]->java.util.ArrayList[0])"}]
    at app.metatron.discovery.domain.engine.DruidEngineRepository$QueryResponseErrorHandler.handleError(DruidEngineRepository.java:115)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:707)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:660)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:620)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:538)
    at app.metatron.discovery.domain.engine.AbstractEngineRepository.call(AbstractEngineRepository.java:120)
    ... 28 common frames omitted
Was this page helpful?
0 / 5 - 0 ratings

Related issues

jeongeunkwon picture jeongeunkwon  Β·  5Comments

minjung-cho picture minjung-cho  Β·  3Comments

deidera08 picture deidera08  Β·  5Comments

AnnieHwang picture AnnieHwang  Β·  6Comments

kyungtaak picture kyungtaak  Β·  6Comments