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)
在一条记录(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)