解压base64编码、gzip压缩的JSON

问题描述 投票:0回答:2

我在 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()
的一些变体,但我无法弄清楚。有什么建议吗?

java sql base64 snowflake-cloud-data-platform user-defined-functions
2个回答
1
投票

这有效:

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 才能获取整个字符串:


0
投票

您可以按如下方式使用 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
© www.soinside.com 2019 - 2024. All rights reserved.