2016-07-02 7 views
1

Я использую Knime 3.1.2 на OSX и Linux для анализа OPENMS (Mass Spectrometry).

В настоящее время он использует статические файлы filename.mzML, которые вручную помещаются в каталог. Он обычно имеет несколько файлов, которые были нажаты за один раз (модуль «Input FileS» не является модулем «Входной файл») с использованием ZipLoopStart.

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

В настоящее время у меня есть скрипт Python, который загружает файлы .gz (из AWS S3), а затем распаковывает их. У меня уже есть варианты, которые могут распаковать файлы в память с помощью StringIO (и, возможно, передать их в рабочий процесс оттуда в качестве данных?).

Он также может загрузить их в каталог ... что, возможно, их можно использовать в качестве источника? Но я не знаю, как сообщить ZipLoop подождать и проверить каталог после запуска скрипта python.

0: Я также мог бы запустить скрипт python как отдельный объект (за пределами knime), а затем, как только каталог будет заполнен, вызовите knime ... ОДНАКО всегда будет разное количество файлов (может быть, 1, может быть, три) ... и я не знаю, как заставить knime-узел «Input Files» обрабатывать неизвестное количество входных файлов.

Надеюсь, это имеет смысл. Спасибо!Python in Knime: Загрузка файлов и их динамическое нажатие в рабочий процесс

ответ

3

Gábor для получения меня на правильном пути. Хотя после много экспериментов я закончил несколько иначе.

=== enter image description here

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

Таким образом, часть проблемы - некоторые из специфических объектов, связанных с Knime. Один из них называется URIDataValue.

Патч-код Python Pandas, по-видимому, взаимозаменяемо с таблицами Knime. Однако я не знаю, есть ли способ импортировать один из этих объектов URIDataValue в Python. Итак, вот что я сделал ...

1. Я написал скрипт Python, который создает Pandas Dataframe и заполняет его одним столбцом.Все это строка, включая заголовок столбца:

from pandas import DataFrame 
# Create empty table 
T = DataFrame(
    [ 
     ['file:///Users/.../copy/lfq_spikein_dilution_1.mzML'], 
     ['file:///Users/.../copy/lfq_spikein_dilution_2.mzML'], 
    ], 
) 
T.columns = ['URIDataValue']       
#print T 
output_table = T 

Это создает этот dataframe:

enter image description here

Примечание: Имя столбца и значения являются просто строки. Но важно (по-видимому), чтобы заголовок столбца был «URIDataValue» ... хотя ЗДЕСЬ это просто текст. Если имя столбца не является «URIDataValue», следующий узел не знает, что делать.

СЛЕДУЮЩИЙ, 'output_table' из узла 'Python Source' исправлен до узла 'String to URI', который (по-видимому и магически) знает, чтобы изменить все строковые значения столбцов на URIDataValues ​​(предположительно на основе имени из первого столбца ... не знаю, что точно).

И, наконец, таблица NEW с правильными объектами данных переходит на узел «URI to PORT» ... поскольку видимые объекты «Port» и «URI» отличаются друг от друга.

Это значит, что этот вход соответствует ZipLoop ..., который обычно находится вне статического (жесткого) узла входных файлов.

Теперь, чтобы решить вопрос выше, я просто должен добавить код в свой «источник Python» для загрузки и распаковки файлов S3, а затем аннотировать фреймворк с их местоположениями и перейти.

Я понятия не имею, что я делаю, но это сработало.

+0

Очень хорошо обобщенный пост с подробными пояснениями. Могу ли я предложить принять этот ответ вместо моего? –

+0

Конечно. Я просто хотел удостовериться, что вы получили какие-то кредиты. Постскриптум Я просто понял, что читаю книгу, которую вы написали: D – RightmireM

+0

Отлично. Спасибо. :) (Надеюсь, книга поможет в начале, хотя я должен признать, что она немного устарела сейчас, так как теперь узлы Rule Engine сильно отличаются друг от друга, а другие узлы также значительно улучшились, потоковая передача была правильной (хотя и не полностью еще).) Удачи, используя KNIME! :) –

1

Есть несколько вариантов, чтобы позволить вещам работать:

  1. Преобразования файлов в памяти в бинарную клетку объектов с помощью Python, а затем вы можете использовать его в KNIME. (Этот, я не уверен, поддерживается, но, как я помню, он был демонстрацией на одном из последних собраний KNIME.)
  2. Сохраните файлы во временную папку (Create Temp Dir) с помощью Python и подключите узел Pyhon, используя поток переменное соединение с узлом чтения файлов в KNIME (который должен работать в цикле: List Files, проверьте Iterate List of Files metanode).
  3. Возможно, в KNIME есть поддержка S3 Remote File Handling, поэтому вы можете выполнять загрузку, распаковывая в KNIME. (Не то, чтобы я знал, но было бы неплохо.)

Я бы выбрал вариант 2, но я не очень хорошо знаком с Python, поэтому для вас, вероятно, вариант 1 является лучшим. (В случае, если вариант 3 поддерживается, это лучше всего, на мой взгляд.)