在databricks sql中将null数组改为空数组?

wfypjpf4  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(615)

我在一个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}]}  |

这个问题似乎有答案,但我没能从中得到任何有用的答案。

6yt4nkrj

6yt4nkrj1#

您可以在调用之前筛选表 json_get 以及 explode 所以你只有在 json_get 返回非空值:

SELECT
  ID, EXPLODE(json_get(JSON_COL, 'ARRAY', NULL)) AS SINGLE_ARRAY_VALUE 
FROM (
  SELECT *
  FROM JSON_TABLE 
  WHERE 
    JSON_COL IS NOT NULL AND 
    json_exists(JSON_COL, 'ARRAY')==1
)

相关问题