我已经在redshift中定义了具有某些列的现有表。已经使用jsonpaths定义和COPY FROM JSON命令从一个S3存储桶成功将此映射到了。一切正常。
但是我现在拥有不同格式的数据,这些数据存储在不同的S3存储桶中,并且还希望将该数据以redshift形式放入SAME表中。但是,此新数据没有该Redshift表中所有列的值-我想简单地将Redshift表中的某些特定值默认为新存储桶数据中的所有值。我的问题是,我不知道如何最好地设置要使用的NEW S3存储桶的jsonpaths定义,以便我也可以轻松地在新s3存储桶上运行COPY FROM JSON。
我试图避免对新存储区数据进行预处理,这可能涉及仅添加具有空值的其他键(以映射到不需要的列)。
我已经尝试过简单地将空字符串放在jsonpaths中,以与redshift中的列对齐,而我并不关心将for放在其中。但是,AWS redshift文档指出,空字符串会导致在COPY FROM JSON命令期间出现错误。 https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-format.html#copy-json-jsonpaths
现有的红移表
CREATE TABLE events (
platform_name VARCHAR(10),
app_id VARCHAR(10),
app_version VARCHAR(10)
)
现有存储桶的现有地图文件
{
"jsonpaths": [
"$['device']['platform']['name']",
"$['application']['app_id']",
"$['application']['version_code']"
]
}
新存储区的映射文件,其中数据对象仅具有对应于name
而不是app_id
或app_version
的值。但我想将它们放入相同的redshift表中。
{
"jsonpaths": [
"$['platform']",
???,
???
]
}
是否可以选择仅将JSON路径中的某些位置(我肯定知道)以新格式放置在那里?看起来很奇怪...
答案 0 :(得分:1)
解决此问题的最佳方法是在表定义中定义默认值。
CREATE TABLE events (
platform_name VARCHAR(10),
app_id VARCHAR(10) default 'null',
app_version VARCHAR(10) default 'null'
)
仅保留地图文件中数据集中的可用字段
{
"jsonpaths": [
"$['platform']"
]
}
然后在调用COPY命令时选择列
COPY events ("platform")
FROM 's3 file location'
json 'map file location'
希望这会有所帮助。
答案 1 :(得分:0)
让我们采取另一种方法。
按原样保留events
表,创建新表events2
?
CREATE TABLE events2 (
platform_name VARCHAR(10)
)
向events2
表加载
{
"jsonpaths": [
"$['platform']"
]
}
创建如下所示的视图以查看所有事件数据
CREATE VIEW all_events AS
SELECT platform_name, app_id, app_version
FROM events
UNION ALL
SELECT platform_name, '', ''
FROM events2
这更像是一种解决方法,但是只要可行,为什么不行。 这对您来说是可行的解决方案吗?