Postgresql Greenplum:通过外部表处理文件名
我们正在使用外部表处理多个文件。是否有任何方法可以获取正在外部表中处理的文件名并将其存储在数据库表中 我能找到的唯一解决办法是将文件名附加到平面文件中的每个记录上,这在处理大型数据集和多个文件时并不理想 有人能帮忙吗Postgresql Greenplum:通过外部表处理文件名,postgresql,greenplum,external-tables,Postgresql,Greenplum,External Tables,我们正在使用外部表处理多个文件。是否有任何方法可以获取正在外部表中处理的文件名并将其存储在数据库表中 我能找到的唯一解决办法是将文件名附加到平面文件中的每个记录上,这在处理大型数据集和多个文件时并不理想 有人能帮忙吗 谢谢否,文件名永远不会从gpfdist守护进程传递回Greenplum。因此,您必须将文件名附加到每一行-您可以使用gpfdist转换来执行此操作我也在努力解决这个问题,下面是我的解决方案。请注意,我不是linux方面的专家,所以可能有一个单行程序解决方案 所以我想在我的记录前面添
谢谢否,文件名永远不会从gpfdist守护进程传递回Greenplum。因此,您必须将文件名附加到每一行-您可以使用gpfdist转换来执行此操作我也在努力解决这个问题,下面是我的解决方案。请注意,我不是linux方面的专家,所以可能有一个单行程序解决方案 所以我想在我的记录前面添加一个filename列 这可以在sed中完成,我创建了一个transform.sh文件,包含以下内容:
#/bin/sh
filename=$1
#echo $filename >> transform.txt
sed -e "s|^|$filename\v|" $filename
请注意,我使用垂直制表符作为分隔符,\v。也可以在文件名中使用|。为了获得$filename的值,我们必须对sed使用双退出
测试一下,看起来不错
./transform.sh countersamples-2016-03-02--11-51-10.csv
countersamples-2016-03-02--11-51-10.csv
timestamp
machine
category
instance
name
value
countersamples-2016-03-02--11-51-10.csv
2016-03-02 11:51:10.064
DESKTOP-4PLQKVL
Memory
% Committed Bytes In Use
74.8485488891602
这部分已经完成,让我们继续使用gpfdist。我们需要一个可以传递给gpfdist的yaml文件,我将其命名为transform.yaml
内容:
请注意,这里有%filename%的值。gpfdist似乎对需要处理的文件进行了预过滤,并将它们逐个传递给我们的转换
让我们启动gpfdist:
gpfdist -c transform.yaml -v
现在进入greenplum并创建一个外部表,例如:
CREATE READABLE EXTERNAL TABLE "ext_transform"
(
"filename" text,
"timestamp" timestamp without time zone ,
"machine" text ,
"category" text ,
"instance" text ,
"name" text ,
"value" double precision
)
LOCATION ('gpfdist://localhost:8080/*/countersamples*.csv#transform=add_filename')
FORMAT 'TEXT'
( HEADER DELIMITER '\013' NULL AS '\\N' ESCAPE AS '\\' )
当我们从中选择数据时:
select * from "ext_transform";
我们看到:
我创建了两个文件夹,以查看如果文件与转换不在同一文件夹中,它会如何反应。通过这种方式,我可以区分这两个文件,即使它们的数据相同。谢谢,我在处理之前添加了文件名,只解决了大量来自源文件的问题,编辑这些文件需要花费大量时间,您无需手动执行此操作-使用gpfdist转换,您可以在飞行中完成此操作,也就是说,您不需要编辑文件。下面是它的工作原理:这里还有一个与描述相关的链接:感谢您的回复,这很有帮助
select * from "ext_transform";