2015-12-11 6 views
1

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

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

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

Благодарности

ответ

2

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

+0

Спасибо, у меня есть добавленное имя файла перед обработкой, только проблема огромного набора файлов, поступающих из источников, и редактирование этих файлов занимает много времени. –

+0

Вам не нужно делать это вручную - используя преобразование gpfdist, вы можете сделать эту работу на полет, т.е. вам не нужно редактировать файлы. Вот как это может работать: https://www.pivotalguru.com/?p=871 – 0x0FFF

+0

Вот еще одна ссылка с описанием: http://gpdb.docs.pivotal.io/4340/admin_guide/load/topics/ г-запись заместитель gpfdist-конфигурация.html – 0x0FFF

1

Я тоже боролся с этим, вот мое решение. Обратите внимание: я не специалист в Linux, поэтому может быть одно решение для линейки.

Так что я хотел добавить столбец имени перед моими записями.

Это может быть сделано в СЭД, я создал файл transform.sh, со следующим содержанием:

#/bin/sh 
filename=$1 
#echo $filename >> transform.txt 
sed -e "s|^|$filename\v|" $filename 

Пожалуйста, обратите внимание, что я использовал вертикальную вкладку в качестве разделителя, \ v. Также в имени файла вы могли бы/следовательно использовать | , Чтобы иметь значение $ filename, мы должны использовать double quites для 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 Содержание:

--- 
VERSION: 1.0.0.1 
TRANSFORMATIONS: 
    add_filename: 
    TYPE: input 
    CONTENT: data 
    COMMAND: /bin/bash transform.sh %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"; 

Мы видим: result in greenplum

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

+0

Спасибо за ответ, полезно –

+0

@GurupreetSinghBhatia, пожалуйста, отметьте этот ответ как принятый, если вы сочтете это полезным. –