如何解决按字符串的一部分红移分区外部表
我有一个带有 foo 表的 Athena 数据库。将它添加到 Redshift 我使用这个命令:
create external schema athena_schema from data catalog
database 'my-catalog-db'
iam_role '...role/my_redshift_role';
我的表 foo 有 45 个字段,其中之一是存储为字符串的时间戳。我只想通过字符串的日期部分对表中的数据进行分区。
字符串看起来像'2021/02/09 20:10:09:001',我们称之为mydate
所以我试过了:
alter table athena_schema.foo
partition(left(mydate,10) = '2021/02/09')
location 's3://my s3 location/foo_2021_02_09/';
而且 Redshift 不喜欢现有字段上的子字符串命令。我试过了。 有任何想法吗? 感谢您抽出宝贵时间。
解决方法
当您在 Redshift Spectrum(和 Athena)外部表中定义分区时,分区列将成为您表中的单独列。这意味着您不能将分区映射到也存在于表数据文件中的列上。
在来自 "Partitioning Redshift Spectrum external tables" 的示例 DDL 中,您可以看到分区列 saledate
被添加为表中的另一列。
CREATE EXTERNAL TABLE spectrum.sales_part (
salesid INTEGER,listid INTEGER,sellerid INTEGER,buyerid INTEGER,eventid INTEGER,dateid SMALLINT,qtysold SMALLINT,pricepaid DECIMAL(8,2),commission DECIMAL(8,saletime TIMESTAMP )
PARTITIONED BY (saledate CHAR(10))
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION 's3://awssampledbuswest2/tickit/spectrum/sales_partition/'
TABLE PROPERTIES ('numRows'='172000');
--Add partitions
ALTER TABLE spectrum.sales_part ADD
PARTITION (saledate='2008-01') LOCATION 's3://awssampledbuswest2/tickit/spectrum/sales_partition/saledate=2008-01/'
PARTITION (saledate='2008-02') LOCATION 's3://awssampledbuswest2/tickit/spectrum/sales_partition/saledate=2008-02/'
PARTITION (saledate='2008-03') LOCATION 's3://awssampledbuswest2/tickit/spectrum/sales_partition/saledate=2008-03/';
--Query using partition column `saledate`
SELECT TOP 5
spectrum.sales_part.eventid,SUM(spectrum.sales_part.pricepaid)
FROM spectrum.sales_part,event
WHERE spectrum.sales_part.eventid = event.eventid
AND spectrum.sales_part.pricepaid > 30
AND saledate = '2008-01'
GROUP BY spectrum.sales_part.eventid
ORDER BY 2 DESC;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。