我在 Snowflake 二进制列中有 Base64 编码、gzip 压缩的 json,我正在尝试解压它。
随着查询:
select
base64_encode(my_binary_data) as my_base64_string
from my_table
我得到了一个base64编码的字符串,我可以将其剪切并粘贴到bash脚本中并通过管道传输:
echo $my_base64_string | base64 -d | gunzip
并获得有效结果。我的问题是,我可以通过查询来完成这个任务吗?我尝试了
decompress_string()
的一些变体,但我无法弄清楚。有什么建议吗?
这有效:
select udf_unzip('H4sIAH4TZWEAA8tIzcnJ5wIAIDA6NgYAAAA=');
-- hello
如果您像这样定义 Java UDF:
create or replace function udf_unzip(b64 string)
returns string
language java
handler='MyClass.unzip'
as
$$
import java.util.zip.GZIPInputStream;
import java.util.Base64;
import java.io.*;
class MyClass {
public static String unzip(String b64) throws Exception {
byte[] bytes = Base64.getDecoder().decode(b64);
GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes));
InputStreamReader reader = new InputStreamReader(gis);
BufferedReader in = new BufferedReader(reader);
return in.readLine();
}
}
$$;
请注意,此示例 UDF 仅返回编码字符串的第一行。您需要迭代 BufferedReader 才能获取整个字符串:
您可以按如下方式使用 Python UDF:
create or replace function python_udf_unzip(s string)
returns string
language python
runtime_version = '3.8'
handler = 'udf_unzip'
as
$$
def udf_unzip(x):
import gzip
import base64
x = gzip.decompress(base64.b64decode(x)).decode('utf-8')
return x
$$;
你可以将其称为:
select python_udf_unzip('H4sIAH4TZWEAA8tIzcnJ5wIAIDA6NgYAAAA=')
你会得到:
hello