从 Hive Map 迁移到 Snowflake Variant

Posted

技术标签:

【中文标题】从 Hive Map 迁移到 Snowflake Variant【英文标题】:Migrating from Hive Map to Snowflake Variant 【发布时间】:2020-03-18 01:29:26 【问题描述】:

我们正在将我们的代码从 Hive 迁移到 Snowflake,因此 Hive 地图迁移到了雪花变体。但是,当我们将数据加载到雪花表中时 - 我们会在数据中看到额外的 KEY 和 VALUE 字符串。

Hive MAP 数据 - "SD10":"","SD9":""

SnowSQL 变体数据 - [ “键”:“SD10”,“值”:“”,“键”:“SD9”,“值”:“”]

我正在使用 stage 和 ORC 文件将数据从 Hadoop 加载到 Snowflake。

有没有一种方法可以将地图数据原样存储到雪花变体中。基本上我不想要额外的 KEY 和 VALUE 字符串

【问题讨论】:

【参考方案1】:

您可以使用 PARSE_JSON 函数来做到这一点:

-- Returns  "SD10": "", "SD9": "" 
select parse_json('"SD10":"","SD9":""') as JSON;

您可以将此添加到您的 COPY INTO 语句中。您可以在 Parquet 文件的 Snowflake 示例中看到不同的选项,这与在 Snowflake 中加载 ORC 文件非常相似:https://docs.snowflake.net/manuals/user-guide/script-data-load-transform-parquet.html

您还可以在此处找到有关加载转换的更多信息:https://docs.snowflake.net/manuals/user-guide/data-load-transform.html

【讨论】:

我尝试了您建议的选项;但是出现错误 - 100069 (22P02): Error parsing JSON: missing first byte in UTF-8 sequence, pos 87 我的复制代码是 - 复制到 abc1 from (select $1:_col0 ::varchar, $1:_col1 ::varchar, $1 :_col2 ::varchar, $1:_col3 ::varchar, parse_json($1:_col4) ::varchar, $1:_col5 ::varchar, $1:_col6 ::varchar, $1:_col7 ::varchar, $1:_col8 ::varchar , $1:_col9 ::varchar, $1:_col10 ::varchar, $1:_col11 ::varchar, $1:_col12 ::varchar from @abc/) FILE_FORMAT = ( TYPE = ORC) TRUNCATECOLUMNS = TRUE ;请帮忙。 您可以添加 ON_ERROR = CONTINUE 以查看是否只有一行或多行失败,或者转换是否一直失败。运行之后,您可以使用 VALIDATE 命令返回所有错误,而不仅仅是第一个错误。 docs.snowflake.net/manuals/sql-reference/functions/… 感谢您的建议。我的舞台数据本身具有 KEY VALUE 标头,即使在添加 ON_ERROR = CONTINUE 之后 - 它也会引发异常。知道为什么 Hive 地图数据在 Snowflake 阶段会像这样转换吗? Hive MAP 数据 - "SD10":"","SD9":"" SnowSQL 变体数据 - [ "key": "SD10", "value": "" , "key": "SD9", "值": "" ] 不,抱歉,不看数据就不确定,等等。似乎是雪花支持。 哦好的..感谢您的帮助。尝试变通方法。【参考方案2】:

您可以使用 UDF 做到这一点。

create or replace function list_to_dict(v variant)
    returns variant
    language javascript
    as'
        function listToDict(input)
            var returnDictionary = 
            var inputLength = input.length;
            for (var i = 0; i < inputLength; i++) 
                returnDictionary[input[i]["key"]] = input[i]["value"]
            
            return returnDictionary
        
        return listToDict(V);
    ';

select list_to_dict(column)['SD10'] from table;

【讨论】:

以上是关于从 Hive Map 迁移到 Snowflake Variant的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从一个雪花实例迁移到另一个最佳性能选项?

计算从 Greenplum 到 hive 迁移的整数计算能力

使用 Sqoop 将视图(数据库表重)从 Oracle 迁移到 Hive

如何从 Snowflake Stage 加载大型 JSON 文件?

使用分区的雪花到 Hive 数据移动

从 Greenplum Query 迁移 Hive 日期和周函数