JSON-跨多个记录比较字段并解决类型差异

JSON-跨多个记录比较字段并解决类型差异,json,apache-drill,bigdata,Json,Apache Drill,Bigdata,在一个记录(JSON对象)中,我们有 在另一个记录中,我们有 { "name": "ID", "value": {} } 我的问题是无法在Apache Drill中查询此数据集,因为一个字段使用不同的类型—一种情况下使用字符串,另一种情况下使用对象。我也不能全面地用“”替换{},因为还有其他字段实际上应该是对象,这会导致相同的问题 我的想法是编写一些代码来加载一批数据,然后逐个字段地交叉检查记录并纠正这些类型不匹配。例如,如果它看到这个I

在一个记录(JSON对象)中,我们有

在另一个记录中,我们有

      {
        "name": "ID",
        "value": {}
      }
我的问题是无法在Apache Drill中查询此数据集,因为一个字段使用不同的类型—一种情况下使用字符串,另一种情况下使用对象。我也不能全面地用“”替换{},因为还有其他字段实际上应该是对象,这会导致相同的问题

我的想法是编写一些代码来加载一批数据,然后逐个字段地交叉检查记录并纠正这些类型不匹配。例如,如果它看到这个ID字段中的大多数条目都是字符串,只有一些是空对象,那么它将把它们转换为空字符串。如果它看到一些值是数组/列表,而同一字段中的其他值是单个对象,它将把这些单个对象转换为数组/列表。诸如此类的事情

然而,对于一个数据集来说,这是一个相当大的任务。我还有其他方法来解决这个问题吗?

有一种方法你可以试试,
exec.enable\u union\u type

ALTER SESSION SET `exec.enable_union_type` = true;
详细信息

我用的是钻1.6。我使用了以下测试数据:

[
    {
        "name": "foo",
        "value": "4260567,4260556"
    },
    {
        "name": "bar",
        "value": {}
    },
    {
        "name": "baz",
        "value": ["one", "two", "three"]
    }
]
并运行了一个简单的查询

SELECT * FROM dfs.`/tmp/drill-sample.json`;
这导致了这个错误

错误:数据\u读取错误:解析JSON时出错-您试图在使用NullableVarCharWriterImpl类型的ValueWriter时启动

文件/tmp/drill-sample.json 记录2 片段0:0

修复

ALTER SESSION SET `exec.enable_union_type` = true;
现在JSON解析工作了

0: jdbc:drill:zk=local> SELECT * FROM dfs.`/tmp/drill-sample.json`;
+-------+------------------------+
| name  |         value          |
+-------+------------------------+
| foo   | 4260567,4260556        |
| bar   | {}                     |
| baz   | ["one","two","three"]  |
+-------+------------------------+
3 rows selected (1.106 seconds)
有一个您可以尝试的方法,
exec.enable\u union\u type

ALTER SESSION SET `exec.enable_union_type` = true;
详细信息

我用的是钻1.6。我使用了以下测试数据:

[
    {
        "name": "foo",
        "value": "4260567,4260556"
    },
    {
        "name": "bar",
        "value": {}
    },
    {
        "name": "baz",
        "value": ["one", "two", "three"]
    }
]
并运行了一个简单的查询

SELECT * FROM dfs.`/tmp/drill-sample.json`;
这导致了这个错误

错误:数据\u读取错误:解析JSON时出错-您试图在使用NullableVarCharWriterImpl类型的ValueWriter时启动

文件/tmp/drill-sample.json 记录2 片段0:0

修复

ALTER SESSION SET `exec.enable_union_type` = true;
现在JSON解析工作了

0: jdbc:drill:zk=local> SELECT * FROM dfs.`/tmp/drill-sample.json`;
+-------+------------------------+
| name  |         value          |
+-------+------------------------+
| foo   | 4260567,4260556        |
| bar   | {}                     |
| baz   | ["one","two","three"]  |
+-------+------------------------+
3 rows selected (1.106 seconds)

非常感谢。当数组中有字段的某些成员,而其他成员作为单个元素时,这是否也适用?是的,它适用于数组值。我更新了答案,加入了一个数组。太好了,谢谢。我现在确实遇到了一个新的错误,但我在任何地方都找不到关于这个错误或类似错误的文档错误:DATA_READ Error:index:0,length:65536(预期为range(032768)),错误确实指向数据集中的特定记录和字段。我想再发一个问题,但我想我会先问你谢谢!当数组中有字段的某些成员,而其他成员作为单个元素时,这是否也适用?是的,它适用于数组值。我更新了答案,加入了一个数组。太好了,谢谢。我现在确实遇到了一个新的错误,但我在任何地方都找不到关于这个错误或类似错误的文档错误:DATA_READ Error:index:0,length:65536(预期为range(032768)),错误确实指向数据集中的特定记录和字段。我想再发一个问题,但我想先问你