2015-09-12 2 views
2

Я использую Kettle для преобразования и удара этой же проблемы, пытаясь получить значение для параметра «out» на основе integer в mysql (поле должно быть действительно bigint, но я не думаю, что оно поддерживается в чайнике).Как обойти эту ошибку ввода/вывода mysql в чайнике?

How to retrieve OUT parameter from MYSQL stored procedure to stream in Pentaho Data Integration (Kettle)?

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

Это отношение потока:

enter image description here

Это определение шага:

enter image description here

На входящем потоке выходящего из lookup existing id там уже поле добавлено называется id который является десятичным числом, которое может быть либо значением, либо нулевым. Если он равен нулю, он запускает этот поиск процедуры db на этапе filter rows, так что, другими словами, он всегда будет равен нулю на этапе db procedure (и, следовательно, я не могу использовать параметр in-out здесь).

Так что я хочу, чтобы это произошло, когда он покидает этап db procedure, id должен быть заполнен значением параметра out (в идеале это будет целое число, но я могу жить десятичным из-за ошибки). Но вместо этого я получаю id_1, вставленный в поток.

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

Так что мои вопросы двоякие:

  1. Может ли я сделать процедуру дб вставить id обратно в поток?
  2. Как написать скрипт (или использовать шаг), который преобразует id (или id_1) в Целое число и помещает его обратно в поле id в потоке?

ответ

0

Чайник построен на Java и использует драйвер JDBC. Позвольте мне подвести некоторые источники и исследовать вопрос (я буду включать Postgresql, так как я использую его больше всего, и эта информация ценна для меня) чек

Сначала давайте размер данных: java.util.Long имеет длину 8 байт, тип mysql bigint - 8 байт, а также тип postgresql bigint, а также 8 байтов. И по физическому размеру они фактически соответствуют, кроме одной проблемы. Mysql поддерживает unsigned bigint, который выходит за рамки java.util.Long. Я предполагаю, что проблема возникает при значениях краев, минимальном и максимальном значениях java.util.Long.

Во всяком случае я попытался воспроизвести (на Postgres доступны только в этот момент мне)

Postgresql 9,4, драйвер JDBC-9.4-1201 PostgreSQL-jdbc41.jar, чайник 5.4.0, jdk7

http://forums.pentaho.com/showthread.php?48950-loosing-precision-of-BIGINT-workaround

и все выглядит хорошо. Скорее всего, это проблема с драйвером mysql jdbc, или это проблема с чайником, который не поддерживает java.math.BigInteger. java.math.BigInteger является тип данных, используемый для работы с беззнаковых значений BigInt в MySQL, как описано здесь

http://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html

О актуальной проблеме. Пример решения здесь ниже: enter image description here

Образец CSV

"id" "surname" "name" "birth_dt" 
"1" "Gorovits" "Alex" "2001-01-01" 
"2" "Osmani" "Adeb" "1998-03-06" 
"" "Maiters" "John" "1981-07-07" 
"" "Mateus" "Angela" "2004-04-04" 
"5" "Sander" "Tom" "1990-05-05" 

Примечание:

  • DBLookup не работает на нулевых значениях так у может понадобиться для фильтрации строк с нулевыми значениями, прежде чем запустить DBLookup.
+0

ОК спасибо, у меня уже была эта работа на самом деле, я нашел шаг «setField», чтобы извлечь значение из id_1 и присвоить его id в ветке процедуры db. Тогда я не знаю, как, но я также получил Integer, поэтому, возможно, какая-то другая проблема вызывала исключение раньше. Но теперь он все равно работает, и я полностью выполнил шаг Javascript. –

Смежные вопросы