1

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

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

任何人都可以帮忙吗

谢谢

4

2 回答 2

2

不,文件名根本不会从 gpfdist 守护进程传回 Greenplum。因此,您必须将文件名附加到每一行 - 您可以使用 gpfdist 转换来执行此操作

于 2015-12-15T16:34:38.520 回答
1

我也在为此苦苦挣扎,这是我的解决方案。请注意,我不是 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";

我们看: 导致greenplum

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

于 2016-03-03T10:37:02.147 回答