2017-10-04 11 views
1

나는 아브 파일을 작성해야하지만, 그것을 위해 나는 두 가지가 필요합니다프로그래밍 방식으로 JSON을 AVRO Schma로 변환 할 수 있습니까?

1) JSON

2) 브로 스키마이이 개 요구 사항에서

- 내가 가지고있는 JSON을 :

{"web-app": { 
    "servlet": [ 
    { 
     "servlet-name": "cofaxCDS", 
     "servlet-class": "org.cofax.cds.CDSServlet", 
     "init-param": { 
     "configGlossary:installationAt": "Philadelphia, PA", 
     "configGlossary:adminEmail": "[email protected]", 
     "configGlossary:poweredBy": "Cofax", 
     "configGlossary:poweredByIcon": "/images/cofax.gif", 
     "configGlossary:staticPath": "/content/static", 
     "templateProcessorClass": "org.cofax.WysiwygTemplate", 
     "templateLoaderClass": "org.cofax.FilesTemplateLoader", 
     "templatePath": "templates", 
     "templateOverridePath": "", 
     "defaultListTemplate": "listTemplate.htm", 
     "defaultFileTemplate": "articleTemplate.htm", 
     "useJSP": false, 
     "jspListTemplate": "listTemplate.jsp", 
     "jspFileTemplate": "articleTemplate.jsp", 
     "cachePackageTagsTrack": 200, 
     "cachePackageTagsStore": 200, 
     "cachePackageTagsRefresh": 60, 
     "cacheTemplatesTrack": 100, 
     "cacheTemplatesStore": 50, 
     "cacheTemplatesRefresh": 15, 
     "cachePagesTrack": 200, 
     "cachePagesStore": 100, 
     "cachePagesRefresh": 10, 
     "cachePagesDirtyRead": 10, 
     "searchEngineListTemplate": "forSearchEnginesList.htm", 
     "searchEngineFileTemplate": "forSearchEngines.htm", 
     "searchEngineRobotsDb": "WEB-INF/robots.db", 
     "useDataStore": true, 
     "dataStoreClass": "org.cofax.SqlDataStore", 
     "redirectionClass": "org.cofax.SqlRedirection", 
     "dataStoreName": "cofax", 
     "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", 
     "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", 
     "dataStoreUser": "sa", 
     "dataStorePassword": "dataStoreTestQuery", 
     "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", 
     "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", 
     "dataStoreInitConns": 10, 
     "dataStoreMaxConns": 100, 
     "dataStoreConnUsageLimit": 100, 
     "dataStoreLogLevel": "debug", 
     "maxUrlLength": 500}}, 
    { 
     "servlet-name": "cofaxEmail", 
     "servlet-class": "org.cofax.cds.EmailServlet", 
     "init-param": { 
     "mailHost": "mail1", 
     "mailHostOverride": "mail2"}}, 
    { 
     "servlet-name": "cofaxAdmin", 
     "servlet-class": "org.cofax.cds.AdminServlet"}, 

    { 
     "servlet-name": "fileServlet", 
     "servlet-class": "org.cofax.cds.FileServlet"}, 
    { 
     "servlet-name": "cofaxTools", 
     "servlet-class": "org.cofax.cms.CofaxToolsServlet", 
     "init-param": { 
     "templatePath": "toolstemplates/", 
     "log": 1, 
     "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", 
     "logMaxSize": "", 
     "dataLog": 1, 
     "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", 
     "dataLogMaxSize": "", 
     "removePageCache": "/content/admin/remove?cache=pages&id=", 
     "removeTemplateCache": "/content/admin/remove?cache=templates&id=", 
     "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", 
     "lookInContext": 1, 
     "adminGroupID": 4, 
     "betaServer": true}}], 
    "servlet-mapping": { 
    "cofaxCDS": "/", 
    "cofaxEmail": "/cofaxutil/aemail/*", 
    "cofaxAdmin": "/admin/*", 
    "fileServlet": "/static/*", 
    "cofaxTools": "/tools/*"}, 

    "taglib": { 
    "taglib-uri": "cofax.tld", 
    "taglib-location": "/WEB-INF/tlds/cofax.tld"}}} 

그러나 그것을 기반으로 AVRO 스키마를 만드는 방법은 무엇입니까?

많은 스키마가 있고 매번 수동으로 Avro 스키마를 만들 수 없으므로 프로그래밍 방식을 찾고 있습니다.

'avro-tools-1.8.1.jar'을 선택했는데 JSON에서 직접 Avro 스키마를 만들 수 없습니다.

JSON -> Avro 스키마를 만들 수있는 Jar 또는 Python 코드를 찾고 있습니다. 데이터 유형이 완벽하지 않은 경우 (문자열, 정수 및 수레가 시작에 충분 함) 좋습니다.

감사합니다.

+0

JSON은 기본적으로 스키마에서 찾을 수 있습니다. 이 JSON의 근원은 무엇입니까? –

+0

감사합니다. JSON은 스키마가 없다는 것을 이해합니다. 그러나, 내 프로젝트에서 - 다른 고객은 JSON을 가지고 있으며, 저에게 그것을 보내줍니다. 여기에는 여러 가지 JSON이 있습니다. 위의 예는 단지 하나의 예입니다. AVRO를 만들도록 강요 할 수는 없지만 AVRO 형식은 내 프로젝트에 필요합니다. 2 가지 옵션이 있습니다. 1) 모든 JSON에 대해 모든 고객 AVRO 스키마로 수동으로 작성하고 2) JSON을 기반으로하는 AVRO 스키마 작성을 자동화하기 위해 일부 코드를 사용해보십시오 (완벽하지는 않더라도). 옵션 2를 찾고 있습니다. 고마워요. – Joe

+0

'String'으로 저장하십시오. –

답변

0

Kite SDK 유틸리티를 사용하여 json 입력에서 avro 스키마를 추론 할 수 있습니다.

https://github.com/kite-sdk/kite/blob/master/kite-data/kite-data-core/src/main/java/org/kitesdk/data/spi/JsonUtil.java#L539

예 :

String json = "{\n" + 
      " \"id\": 1,\n" + 
      " \"name\": \"A green door\",\n" + 
      " \"price\": 12.50,\n" + 
      " \"tags\": [\"home\", \"green\"]\n" + 
      "}\n" 
      ; 
    String avroSchema = JsonUtil.inferSchema(JsonUtil.parse(json), "myschema").toString(); 
    System.out.println(avroSchema); 

결과 :

{ 
    "type":"record", 
    "name":"myschema", 
    "fields":[ 
     { 
     "name":"id", 
     "type":"int", 
     "doc":"Type inferred from '1'" 
     }, 
     { 
     "name":"name", 
     "type":"string", 
     "doc":"Type inferred from '\"A green door\"'" 
     }, 
     { 
     "name":"price", 
     "type":"double", 
     "doc":"Type inferred from '12.5'" 
     }, 
     { 
     "name":"tags", 
     "type":{ 
      "type":"array", 
      "items":"string" 
     }, 
     "doc":"Type inferred from '[\"home\",\"green\"]'" 
     } 
    ] 
} 

당신은 받는다는 의존성 here