{"id":57200,"date":"2016-06-13T22:00:36","date_gmt":"2016-06-13T19:00:36","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=57200"},"modified":"2016-06-12T18:50:24","modified_gmt":"2016-06-12T15:50:24","slug":"resolving-json-schema-changes-drill-python","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html","title":{"rendered":"Resolving JSON schema Changes with Drill and Python"},"content":{"rendered":"<p>Drill is a fantastic tool for querying JSON data. But Drill isn\u2019t magical, and sometimes it runs into some data that it can\u2019t quite handle (yet). This post walks through an example of such a scenario, and how you might work through the issue using a little bit of Python code.<\/p>\n<h2>Scenario<\/h2>\n<p>You have data where the schema changes. In this example, we look at the case where you have a field that changes from a single value to a list, or vice versa.<\/p>\n<h2>Sample Data<\/h2>\n<p>This data is split across two files.<\/p>\n<pre class=\"brush:java\">{\r\n  \"name\": \"Vince\",\r\n  \"favorite_foods\": [\r\n    {\r\n      \"name\": \"ice-cream\",\r\n      \"flavors\": \"vanilla\"\r\n    },\r\n    {\r\n      \"name\": \"cheeseburgers\",\r\n      \"flavors\": [\r\n        \"animal style\",\r\n        \"black label\"\r\n      ]\r\n    }\r\n  ]\r\n}\r\n{\r\n  \"name\": \"Nikki\",\r\n  \"favorite_foods\": [\r\n    {\r\n      \"name\": \"ice-cream\",\r\n      \"flavors\": [\r\n        \"chocolate\",\r\n        \"dulce de leche\"\r\n      ]\r\n    },\r\n    {\r\n      \"name\": \"cheeseburgers\",\r\n      \"flavors\": [\r\n        \"black label\"\r\n      ]\r\n    }\r\n  ]\r\n}<\/pre>\n<h2>Query<\/h2>\n<p>Both files are valid JSON, and that\u2019s good, but it turns out that the schema changes. Vince only like vanilla ice cream, and that\u2019s stored as a single value. Nikki likes chocolate and dulce de leche (Vince won\u2019t turn those down, just not his favorite) so those are stored as a list.<\/p>\n<p>Drill would rather you not organize your data this way, and is not shy about telling you so:<\/p>\n<pre class=\"brush:java\">0: jdbc:drill:zk=local&gt; select * from `\/Users\/vince\/src\/drill-data-prep-example\/schema-change\/data`;\r\njava.lang.RuntimeException: java.sql.SQLException: DATA_READ ERROR: You tried to start when you are using a ValueWriter of type NullableVarCharWriterImpl.\r\n\r\nFile  \/Users\/vince\/src\/drill-data-prep-example\/schema-change\/data\/vince.json\r\nRecord  1\r\nLine  1\r\nColumn  127\r\nField  flavors\r\nFragment 0:0\r\n\r\n[Error Id: 2c9020c1-cfcf-42e2-926c-d00962ceb7f9 on 192.168.56.1:31010]\r\n    at sqlline.IncrementalRows.hasNext(IncrementalRows.java:73)\r\n    at sqlline.TableOutputFormat$ResizingRowsProvider.next(TableOutputFormat.java:87)\r\n    at sqlline.TableOutputFormat.print(TableOutputFormat.java:118)\r\n    at sqlline.SqlLine.print(SqlLine.java:1583)\r\n    at sqlline.Commands.execute(Commands.java:852)\r\n    at sqlline.Commands.sql(Commands.java:751)\r\n    at sqlline.SqlLine.dispatch(SqlLine.java:738)\r\n    at sqlline.SqlLine.begin(SqlLine.java:612)\r\n    at sqlline.SqlLine.start(SqlLine.java:366)\r\n    at sqlline.SqlLine.main(SqlLine.java:259)<\/pre>\n<p>What if we reverse the order of these objects in the input? Does Drill like it better when we start it off with a list, then change to a single value?<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">0: jdbc:drill:zk=local&gt; select * from `\/Users\/vince\/src\/drill-data-prep-example\/schema-change\/data`;\r\nError: DATA_READ ERROR: You tried to write a VarChar type when you are using a ValueWriter of type SingleListWriter.\r\n\r\nFile  \/Users\/vince\/src\/mapr\/drill-data-prep\/schema-change\/sample_data.json\r\nRecord  2\r\nLine  3\r\nColumn  84\r\nField  flavors\r\nFragment 0:0\r\n\r\n[Error Id: 93ceda84-8710-46de-8d5f-6b2290914703 on 192.168.56.1:31010] (state=,code=0)<\/pre>\n<p>No. Drill is still displeased.<\/p>\n<p>In Drill 1.6, the <a href=\"https:\/\/drill.apache.org\/docs\/json-data-model\/#experimental-feature:-heterogeneous-types\" target=\"_blank\">union type (experimental)<\/a> can be enabled. This will allow multiple data types to be stored in one field, which might help us work around this issue. So let\u2019s enable that, and try it out.<\/p>\n<pre class=\"brush:java\">ALTER SESSION SET `exec.enable_union_type` = true;\r\n0: jdbc:drill:zk=local&gt; select * from `\/Users\/vince\/src\/drill-data-prep-example\/schema-change\/data`;\r\nError: Unexpected RuntimeException: java.lang.IllegalArgumentException: The field $offsets$(UINT4:REQUIRED) doesn't match the provided metadata major_type {\r\n  minor_type: MAP\r\n  mode: REQUIRED\r\n}\r\n\r\n. (state=,code=0)<\/pre>\n<p>Sadly, this doesn\u2019t work either. So let\u2019s disable the union type and move on.<\/p>\n<h2>What\u2019s the problem?<\/h2>\n<p>Drill doesn\u2019t like it when you give it data where the type changes from something like a single value to a list, or vice versa.<\/p>\n<h2>How do we work around it?<\/h2>\n<p>We massage the data so that fields where lists are sometimes, but not always, used become fields where lists are always used. In the sample data, one of the <code>flavors<\/code> fields was the issue. Drill helpfully pinpointed the line and the column that it had an issue with, so you can eyeball it before you go and start writing code to fix it.<\/p>\n<p>One way to fix the data is in python. You can simply read in the JSON objects and rewrite them converting single values into single-value lists:<\/p>\n<pre class=\"brush:java\">import json\r\nimport types\r\n\r\nfor filename in (\"data\/vince.json\", \"data\/nikki.json\"):\r\n    # Read the file into memory.\r\n    with file(filename) as infile:\r\n        data = json.loads(infile.read())\r\n\r\n    # Open and truncate the input file.\r\n    with file(filename, \"w\") as outfile:\r\n        # enumerate returns an incrementing integer with each iteration.\r\n        # convenient way to keep track of the index into the list\r\n        # we need to modify.\r\n        for i,f in enumerate(data[\"favorite_foods\"]):\r\n            # Check if the value pointed to by \"flavors\" is of type\r\n            # ListType.\r\n            if type(f[\"flavors\"]) != types.ListType:\r\n                # If it's not, then overwrite the value as a list.\r\n                data[\"favorite_foods\"][i][\"flavors\"] = [ f[\"flavors\"] ]\r\n        outfile.write(json.dumps(data))<\/pre>\n<p>Now, querying the massaged data, Drill is happier:<\/p>\n<pre class=\"brush:java\">0: jdbc:drill:zk=local&gt; select * from `\/Users\/vince\/src\/drill-data-prep-example\/schema-change\/data`;\r\n+---------------------------------------------------------------------------------------------------------------------+--------+\r\n|                                                   favorite_foods                                                    |  name  |\r\n+---------------------------------------------------------------------------------------------------------------------+--------+\r\n| [{\"flavors\":[\"chocolate\",\"dulce de leche\"],\"name\":\"ice-cream\"},{\"flavors\":[\"black label\"],\"name\":\"cheeseburgers\"}]  | Nikki  |\r\n| [{\"flavors\":[\"vanilla\"],\"name\":\"ice-cream\"},{\"flavors\":[\"animal style\",\"black label\"],\"name\":\"cheeseburgers\"}]      | Vince  |\r\n+---------------------------------------------------------------------------------------------------------------------+--------+\r\n2 rows selected (0.119 seconds)<\/pre>\n<p>More happy queries:<\/p>\n<pre class=\" brush:java\">0: jdbc:drill:zk=local&gt; select t.name, t.yum.name as fave_food, flatten(t.yum.flavors) as fave_flave from (select t.name, flatten(t.favorite_foods) as yum from (select name,favorite_foods from `\/Users\/vince\/src\/drill-data-prep-example\/schema-change\/data`) t) t;\r\n+--------+----------------+-----------------+\r\n|  name  |   fave_food    |   fave_flave    |\r\n+--------+----------------+-----------------+\r\n| Nikki  | ice-cream      | chocolate       |\r\n| Nikki  | ice-cream      | dulce de leche  |\r\n| Nikki  | cheeseburgers  | black label     |\r\n| Vince  | ice-cream      | vanilla         |\r\n| Vince  | cheeseburgers  | animal style    |\r\n| Vince  | cheeseburgers  | black label     |\r\n+--------+----------------+-----------------+\r\n6 rows selected (0.153 seconds)<\/pre>\n<h2>Interesting note<\/h2>\n<p>You get different style of error output when you query a directory of JSON files than when you query a file.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"https:\/\/www.mapr.com\/blog\/resolving-json-schema-changes-drill-and-python\">Resolving JSON schema Changes with Drill and Python<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/join-us\/jcg\/\">JCG partner<\/a> Vince Gonzalez at the <a href=\"http:\/\/www.mapr.com\/blog\">Mapr<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Drill is a fantastic tool for querying JSON data. But Drill isn\u2019t magical, and sometimes it runs into some data that it can\u2019t quite handle (yet). This post walks through an example of such a scenario, and how you might work through the issue using a little bit of Python code. Scenario You have data &hellip;<\/p>\n","protected":false},"author":1054,"featured_media":219,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[1088,224],"class_list":["post-57200","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development","tag-apache-drill","tag-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Resolving JSON schema Changes with Drill and Python - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Drill is a fantastic tool for querying JSON data. But Drill isn\u2019t magical, and sometimes it runs into some data that it can\u2019t quite handle (yet). This\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Resolving JSON schema Changes with Drill and Python - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Drill is a fantastic tool for querying JSON data. But Drill isn\u2019t magical, and sometimes it runs into some data that it can\u2019t quite handle (yet). This\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2016-06-13T19:00:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/python-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Vince Gonzalez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Vince Gonzalez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html\"},\"author\":{\"name\":\"Vince Gonzalez\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/a2801d1f305d88d2af64874d62d5c1c4\"},\"headline\":\"Resolving JSON schema Changes with Drill and Python\",\"datePublished\":\"2016-06-13T19:00:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html\"},\"wordCount\":444,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/python-logo.jpg\",\"keywords\":[\"Apache Drill\",\"Python\"],\"articleSection\":[\"Software Development\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html\",\"name\":\"Resolving JSON schema Changes with Drill and Python - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/python-logo.jpg\",\"datePublished\":\"2016-06-13T19:00:36+00:00\",\"description\":\"Drill is a fantastic tool for querying JSON data. But Drill isn\u2019t magical, and sometimes it runs into some data that it can\u2019t quite handle (yet). This\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/python-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/python-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/06\\\/resolving-json-schema-changes-drill-python.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Software Development\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/software-development\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Resolving JSON schema Changes with Drill and Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/a2801d1f305d88d2af64874d62d5c1c4\",\"name\":\"Vince Gonzalez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5ed584a4704a443fcffee804bb1bf4da64cb8d2599f89625f7c8775a351acd84?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5ed584a4704a443fcffee804bb1bf4da64cb8d2599f89625f7c8775a351acd84?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5ed584a4704a443fcffee804bb1bf4da64cb8d2599f89625f7c8775a351acd84?s=96&d=mm&r=g\",\"caption\":\"Vince Gonzalez\"},\"description\":\"He is a passionate and hands-on pre-sales and post-sales field engineer. He has nearly two decades of experience designing, implementing and automating infrastructure and applications including new servers, enterprise storage, cloud platform deployment and most recently big data.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/vince-gonzalez\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Resolving JSON schema Changes with Drill and Python - Java Code Geeks","description":"Drill is a fantastic tool for querying JSON data. But Drill isn\u2019t magical, and sometimes it runs into some data that it can\u2019t quite handle (yet). This","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html","og_locale":"en_US","og_type":"article","og_title":"Resolving JSON schema Changes with Drill and Python - Java Code Geeks","og_description":"Drill is a fantastic tool for querying JSON data. But Drill isn\u2019t magical, and sometimes it runs into some data that it can\u2019t quite handle (yet). This","og_url":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2016-06-13T19:00:36+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/python-logo.jpg","type":"image\/jpeg"}],"author":"Vince Gonzalez","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Vince Gonzalez","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html"},"author":{"name":"Vince Gonzalez","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/a2801d1f305d88d2af64874d62d5c1c4"},"headline":"Resolving JSON schema Changes with Drill and Python","datePublished":"2016-06-13T19:00:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html"},"wordCount":444,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/python-logo.jpg","keywords":["Apache Drill","Python"],"articleSection":["Software Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html","url":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html","name":"Resolving JSON schema Changes with Drill and Python - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/python-logo.jpg","datePublished":"2016-06-13T19:00:36+00:00","description":"Drill is a fantastic tool for querying JSON data. But Drill isn\u2019t magical, and sometimes it runs into some data that it can\u2019t quite handle (yet). This","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/python-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/python-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2016\/06\/resolving-json-schema-changes-drill-python.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Software Development","item":"https:\/\/www.javacodegeeks.com\/category\/software-development"},{"@type":"ListItem","position":3,"name":"Resolving JSON schema Changes with Drill and Python"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/a2801d1f305d88d2af64874d62d5c1c4","name":"Vince Gonzalez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5ed584a4704a443fcffee804bb1bf4da64cb8d2599f89625f7c8775a351acd84?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5ed584a4704a443fcffee804bb1bf4da64cb8d2599f89625f7c8775a351acd84?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5ed584a4704a443fcffee804bb1bf4da64cb8d2599f89625f7c8775a351acd84?s=96&d=mm&r=g","caption":"Vince Gonzalez"},"description":"He is a passionate and hands-on pre-sales and post-sales field engineer. He has nearly two decades of experience designing, implementing and automating infrastructure and applications including new servers, enterprise storage, cloud platform deployment and most recently big data.","url":"https:\/\/www.javacodegeeks.com\/author\/vince-gonzalez"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/57200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/1054"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=57200"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/57200\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/219"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=57200"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=57200"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=57200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}