【问题标题】:Decompress base64 encoded, gzipped JSON解压缩 base64 编码、gzip 压缩的 JSON
【发布时间】:2021-11-30 13:25:35
【问题描述】:

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

【问题讨论】:

  • BASE64_DECODE_STRING 不做你想做的事吗?
  • 谢谢@endo64。这会对在 bash 中工作的字符串产生 Invalid UTF8 detected while decoding 错误。显然,我在这里使用 bash 作为健全性检查,但我可能忽略了一些事情。
  • 对于它的价值,我还能够使用 Python 中的类似过程解压缩 json。所以就snowflake-sql而言,我不知道我是不知道自己在做什么还是不可能。
  • Snowflake uncompress 函数具有与 compress 函数相同的可用压缩/解压缩方法。在 compress 的文档中,它没有列出 gunzip:docs.snowflake.com/en/developer-guide/udf/javascript/…。您必须在 JAR 文件中使用外部的东西或带有 gunzip 库的 Java UDF。
  • 谢谢 Greg,我会考虑你的建议。

标签: java sql base64 snowflake-cloud-data-platform user-defined-functions


【解决方案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 以获取整个字符串:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2015-07-21
    相关资源
    最近更新 更多