Greenplum:获取通过外部表处理的文件名

Posted

技术标签:

【中文标题】Greenplum:获取通过外部表处理的文件名【英文标题】:Greenplum : Getting filenames processed via an external table 【发布时间】:2015-12-11 06:27:11 【问题描述】:

我们正在使用外部表处理多个文件。有什么办法可以让我在外部表中处理文件名并将其存储在数据库表中?

我能找到的唯一解决方法是将文件名附加到平面文件中的每条记录中,这在大型数据集和多个文件时并不理想。

谁能帮忙解决这个问题

谢谢

【问题讨论】:

【参考方案1】:

不,文件名根本不会从 gpfdist 守护进程传回 Greenplum。所以你必须将文件名附加到每一行 - 你可以使用 gpfdist 转换来这样做

【讨论】:

谢谢,我在处理之前已经附加了文件名,只解决来自源的大量文件并花费大量时间编辑这些文件 您无需手动执行此操作 - 使用 gpfdist 转换您可以在飞行中完成此操作,即您无需编辑文件。以下是它的工作方式:pivotalguru.com/?p=871 这里还有一个带有描述的链接:gpdb.docs.pivotal.io/4340/admin_guide/load/topics/…【参考方案2】:

我也在为此苦苦挣扎,这是我的解决方案。请注意,我不是 linux 专家,所以可能有一个单一的解决方案。

所以我想在我的记录前面添加一个文件名列。

这可以在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 内容:

---
VERSION: 1.0.0.1
TRANSFORMATIONS:
  add_filename:
     TYPE: input
     CONTENT: data
     COMMAND: /bin/bash transform.sh %filename%

请注意,我们这里有 %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";

我们看到:

我创建了 2 个文件夹,以查看如果文件与转换不在同一个文件夹中,它会如何反应。这样我就可以区分这两个文件,即使它们的数据相同。

【讨论】:

感谢回复,很有帮助

以上是关于Greenplum:获取通过外部表处理的文件名的主要内容,如果未能解决你的问题,请参考以下文章

在greenplum pxf外部表中,从对象的json数组中获取元素时获取空字符串

Greenplum - 外部表

Greenplum 实时数据仓库实践——Greenplum监控与运维

Greenplum 实时数据仓库实践——Greenplum监控与运维

将文件/URI并行加载到greenplum中的外部表

GreenPlum数据的装载与卸载之gpload的使用