我在一个json列中有一个值,在azuredatabricks表中该值有时全部为null。获取json_表的整个过程是:读取parquet,推断json列的模式,将列从json字符串转换为深度嵌套结构,分解其中的任何数组。我在sql中使用python定义的UDF(json_exists()检查模式以查看是否可以使用键,json_get()从列中获取键或返回默认值),并希望执行以下操作:
SELECT
ID, EXPLODE(json_get(JSON_COL, 'ARRAY', NULL)) AS SINGLE_ARRAY_VALUE
FROM
JSON_TABLE
WHERE
JSON_COL IS NOT NULL AND
json_exists(JSON_COL, 'ARRAY')==1
当数据至少有一个包含数组的json\u col示例时,模式是这样的,这样就没有问题了。但是,如果数据在json_col.array中具有所有空值,则会发生错误,因为该列被推断为字符串类型(收到的错误:explode函数的输入应该是数组或Map类型,而不是字符串)。不幸的是,虽然json_exists()函数返回预期值,但即使返回的数据集为空,错误仍然会发生。
我可以通过强制转换或替换空值来绕过这个错误吗?如果不是的话,还有什么方法可以推断json的模式呢?
注:这是一个简化的例子。我正在编写代码来为数百个类似的数据结构生成sql代码,因此尽管我对解决方法持开放态度,但直接解决方案将是理想的。如果有什么不清楚的地方,请询问。
导致错误的示例表:
| ID | JSON_COL |
| 1 | {"_corrupt_record": null, "otherInfo": [{"test": 1, "from": 3}]} |
| 2 | {"_corrupt_record": null, "otherInfo": [{"test": 5, "from": 2}]} |
不会导致错误的示例表:
| ID | JSON_COL |
| 1 | {"_corrupt_record": null, "array": [{"test": 1, "from": 3}]} |
| 2 | {"_corrupt_record": null, "otherInfo": [{"test": 5, "from": 2}]} |
这个问题似乎有答案,但我没能从中得到任何有用的答案。
1条答案
按热度按时间6yt4nkrj1#
您可以在调用之前筛选表
json_get
以及explode
所以你只有在json_get
返回非空值: