我有两个字段落在我们的 blob 中的 JSON 文件:
offset
(整数)value
(base64)这个
value
列是带有 unicode 的 JSON(这就是为什么它是 base64 编码的原因)。
{
"offset": 1,
"value": "eyJfaWQiOiAiNjQxY2I3MWQyY...a very long base64-encoded text"
}
挑战是这个 base64 编码的
value
JSON 非常大,有 100 多个字段,所以我们无法定义模式。我们只能有一些模式提示。 Auto Loader 似乎是最合适的。
我尝试将 Autoloader 与 schema hints 和其他选项一起使用。它总是选择
value
作为字符串,并且在不提供模式的情况下无法将其解析回 JSON。
我想要数据块来推断模式。
自动推断模式。架构更加动态。这样他们就可以随时添加和删除任何字段。所以有固定的模式根本不起作用。所以我们需要自动推断模式。
但我可以看到它总是将其推断为字符串,或者 json 被转义为值列中的字符串,因此无法使用 Autoloader 进行推断。
您是否尝试过对
value
列进行 base64 解码并使用 from_json
标准函数?那将是我处理此案的第一种方法。
如果这不起作用,我将分两步进行数据处理(您可以使用 Databricks Jobs 甚至 Delta Live Tables 管道)。
第一步是使用 Auto Loader 加载传入的文件并解码
value
列并将其写入 blob 存储以供下一步读取(再次使用 Auto Loader)。
我真的认为 Auto Loader 无法将 base64 编码的数据作为 JSON 处理,因此它需要一些帮助(因此需要这种类似 Hadoop MapReduce 的数据处理管道)。
我认为您甚至可以将传入的 JSON 文件“转换”为镶木地板以加快加载速度,甚至增量表也可以正常工作。数据(文件)有两个 JSON 层,我在考虑 parquet 转换时指的是整个数据文件的 JSON 格式。
我试图用 cast(value as string) 将它重写为 json。这将使用字符串的转义字符写入值列。
stream.selectExpr("CAST(value as string)")
这样写json如下 { “偏移量”:1, “价值”:“{“key1”:“价值”......“} }
在 Autoloader 中,我无法用 json 读取它,因为它总是将值推断为字符串!
我在写入之前尝试使用 json.loads() 没有成功。如果无论如何将 base64 写成 json 将解决我在下一层的问题。