amazon-web-services - AWS Redshift Spectrum(外部表)-分配给列的 Varchar 数据类型无法同时处理同一列的数组和字符串数据
问题描述
任务:尝试使用 Redshift Spectrum 将一堆 JSON 文件从 s3 存储桶加载到 Redshift。问题:少数文件中的 JSON 对象包含用方括号括起来的数据,但其他 JSON 文件具有相同的对象而没有方括号。在使用 Redshift 频谱表创建外部表时,有没有办法同时使用带/不带方括号“[]”的数据?
要使用的 JSON 文件:
文件 1: "x":{"y":{ "z":["ABCD"]}}
文件 2: "x":{"y":{ "z":"EFGH"}}
情况1
当 z 列定义为数组时,我错过了 JSON 文件中“不带方括号”的数据
CREATE EXTERNAL TABLE spectrum.table
(x struct<y:struct<z:array<varchar(256)>>>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'dots.in.keys'='true') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location 's3://****'
询问:Select c from spectrum.table t , t.x.y.z c;
案例二
当 z 列定义为 varchar (未声明为数组)时,错误如下:
创建语句:
CREATE EXTERNAL TABLE spectrum.table
(x struct<y:struct<z:varchar(256)>>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'dots.in.keys'='true') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location 's3://****'
查询:Select regexp_replace( t.x.y.z ,'\\([\\"])', '' ) from spectrum.table t;
或Select t.x.y.z from spectrum.table t
;
[XX000][500310] [Amazon](500310) Invalid operation: Spectrum Scan Error
Details:
-----------------------------------------------
error: Spectrum Scan Error
code: 15001
context: Unsupported implicit cast: Column ('x' 'y' 'z'), From Type: LIST, To Type: VARCHAR,
----------------------------------------------
解决方案
推荐阅读
- oozie - 在 Oozie 中,就像 Actions 有重试选项一样,Workflow 级别是否有类似的选项?
- node.js - 检查电子邮件 ID 是否存在而不在 NodeJS 中发送电子邮件
- google-cloud-functions - 每个项目可以部署多少次功能?
- amazon-web-services - 当 lex 不自动处理意图时如何调用 lambda?
- asp.net-mvc - AuthenticationTicket 类的标识属性
- azure - ACR 到 AKS 部署错误:容器操作系统与主机操作系统不匹配
- bash - 如何在 bash 中并行运行命令?
- r - ggplot2:使用来自多个虚拟变量的比例的多面条形图,如何重组数据?
- java - Spring @cacheable 如何在凌晨 12 点刷新缓存?
- azure - 我使用 Msal 从 AAD 获得了令牌,但无法使用获取的令牌获取用户配置文件。如何简单地在 Node 后端验证令牌?