Greenplum: обработка имен файлов через внешнюю таблицу

мы обрабатываем несколько файлов, используя внешнюю таблицу. Есть ли способ получить имя файла, обрабатываемого во внешних таблицах, и сохранить его в таблице базы данных?

Единственный обходной путь, который я могу найти, — это добавление имени файла к каждой записи в плоском файле, что не идеально при огромном наборе данных и нескольких файлах.

Может ли кто-нибудь помочь в этом

Спасибо


person Gurupreet Singh Bhatia    schedule 11.12.2015    source источник


Ответы (2)


Нет, имя файла просто никогда не передается от демона gpfdist обратно в Greenplum. Таким образом, вы должны добавить имя файла к каждой строке — для этого вы можете использовать преобразование gpfdist

person 0x0FFF    schedule 15.12.2015
comment
Спасибо, я добавил имя файла перед обработкой, только проблема с огромным набором файлов, поступающих из источников, и редактирование этих файлов занимает много времени. - person Gurupreet Singh Bhatia; 05.01.2016
comment
Вам не нужно делать это вручную - с помощью преобразования gpfdist вы можете заставить это работать на лету, т.е. вам не нужно редактировать файлы. Вот как это может работать: pivotalguru.com/?p=871 - person 0x0FFF; 05.01.2016
comment
Вот еще одна ссылка с описанием: gpdb.docs.pivotal.io/4340/admin_guide/load/topics/ - person 0x0FFF; 05.01.2016

Я тоже боролся с этим, вот мое решение. Обратите внимание, что я не эксперт в 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. Нам нужен файл yaml, который можно передать в gpfdist, я назвал его transform.yaml Content:

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

Обратите внимание, что здесь у нас есть значение %filename%. Кажется, что gpfdist предварительно фильтрует файлы, которые необходимо обработать, и передает их 1 за 1 нашему преобразованию.

Запустим 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 папки, чтобы посмотреть, как он отреагирует, если файлы не находятся в той же папке, что и преобразование. Таким образом, я могу различать два файла, даже если их данные идентичны.

person Balazs Gunics    schedule 03.03.2016
comment
Спасибо за ответ, это полезно - person Gurupreet Singh Bhatia; 10.03.2016