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

JSON - compare a field across many records and resolve type discrepancies

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

      {
        "name": "ID",
        "value": "4260567,4260556"
      }

在另一条记录中,我们有

      {
        "name": "ID",
        "value": {}
      }

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

我的想法是写一些代码来加载一批数据,逐个字段交叉检查记录并纠正这些类型不匹配。例如,如果它发现此 ID 字段中的大部分条目都是字符串,只有一些是空对象,它会将这些转换为空字符串。如果它发现某些值是 arrays/lists 而同一字段中的其他值是单个对象,它会将这些单个对象转换为 arrays/lists。诸如此类。

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

有一个experimental UNION setting你可以试试,exec.enable_union_type:

ALTER SESSION SET `exec.enable_union_type` = true;

详情

我正在使用 Drill 1.6。我使用了以下测试数据:

[
    {
        "name": "foo",
        "value": "4260567,4260556"
    },
    {
        "name": "bar",
        "value": {}
    },
    {
        "name": "baz",
        "value": ["one", "two", "three"]
    }
]

和运行一个简单的查询

SELECT * FROM dfs.`/tmp/drill-sample.json`;

导致此错误

Error: DATA_READ ERROR: Error parsing JSON - You tried to start when you are using a ValueWriter of type NullableVarCharWriterImpl.

File /tmp/drill-sample.json Record 2 Fragment 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)