Облачная платформаAdvanced

Настройка конвертеров полей

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Сценарий

  • После настройки параметров задания необходимо настроить сопоставление полей. Вы можете нажать в столбце Operation, чтобы создать конвертер полей.
  • Если файлы мигрируют между FTP, SFTP, OBS и HDFS, и у источника миграции параметр File Format установлен в Binary, файлы будут передаваться напрямую, без сопоставления полей.

Вы можете создать конвертер полей на странице Map Field при создании задания миграции таблицы/файла.

Рисунок 1 Создание конвертера полей


CDM может конвертировать поля во время миграции. В настоящее время поддерживаются следующие конвертеры полей:

Ограничения

  • Если в конфигурации исходного задания параметр Use SQL Statement установлен в Yes, конвертеры создать нельзя.
  • На странице вкладки Map Field, если CDM не удаётся получить все столбцы, получая образцы значений (например, когда данные экспортируются из HBase, CloudTable или MongoDB, существует высокая вероятность, что CDM не получит все столбцы), вы можете нажать и выбрать Add a new field, чтобы добавить новые поля и обеспечить полное импортирование данных в пункт назначения миграции.
  • Когда в качестве источника миграции используется реляционная база данных, Hive, DLI или MRS Hudi, образцы значений получить нельзя.
  • Когда в качестве назначения используется SQLServer, поля типа timestamp нельзя записать. Необходимо изменить их тип (например, на datetime), чтобы их можно было записать.
  • Имена столбцов отображаются, когда источником задания миграции является OBS, необходимо мигрировать CSV‑файлы, и параметр Extract first row as columns установлен в Yes.
  • Конфигурация преобразователей полей не участвует, когда для миграции файлов в файлы используется двоичный формат.
  • В сценарии автоматического создания таблиц необходимо заранее вручную добавить поля в целевую таблицу, а затем добавить поля в field mapping.
  • После добавления поля его образец значения не отображается в консоли. Это не влияет на передачу значения поля. CDM напрямую записывает значение поля в конечный пункт назначения.
  • Если field mapping неверно, вы можете скорректировать field mapping, перетаскивая поля или нажимая для пакетного сопоставления полей.
  • Выражение обрабатывает данные поля. При создании конвертера выражения не используйте временный макрос. Если необходимо использовать временный макрос, примените один из следующих методов (если источник имеет тип файл, поддерживается только Method 1):
    • Method 1: При создании конвертера выражения используйте две одинарные кавычки ('') для заключения выражения.

      Например, если выражение ${dateformat(yyyy-MM-dd)} не заключено в кавычки, дефис (-) в значении 2017-10-16, полученном из выражения, будет распознан как знак минуса, и будет выполнено дальнейшее вычисление, дающее результат 1991, что неверно. Если заключить выражение в кавычки, то есть '${dateformat(yyyy-MM-dd)}', вы получите '2017-10-16', что правильно.

      Рисунок 2 Использование двух одинарных кавычек ('') для заключения выражения


    • Method 2: Добавьте пользовательское исходное поле, введите макропеременную даты и времени для Example Value и снова сопоставьте поле с полем назначения.

      Рисунок 3 Добавление пользовательского исходного поля


  • Если данные импортируются в GaussDB(DWS), необходимо выбрать распределительные столбцы в полях назначения. Рекомендуется выбирать распределительные столбцы согласно следующим правилам:
    1. Используйте первичный ключ в качестве столбца распределения.
    2. Если несколько сегментов данных объединены в качестве первичных ключей, укажите все первичные ключи в качестве столбца распределения.
    3. В случае отсутствия доступного первичного ключа, если столбец распределения не выбран, DWS по умолчанию использует первый столбец в качестве столбца распределения. В результате существует риск смещения данных.

Анонимизация

Этот конвертер используется для скрытия ключевой информации о строке символов. Например, если вы хотите преобразовать 12345678910 в 123****8910, настройте параметры следующим образом:

  • Установите Reserve Start Length в 3.
  • Установите Reserve End Length в 4.
  • Установите Replace Character в *.

Обрезка

Этот конвертер используется для автоматического удаления пробелов до и после строки. Не требуется настраивать параметры.

Reverse String

Этот конвертер используется для автоматического обращения строки. Например, обратите ABC в CBA. Не требуется настраивать параметры.

Replace String

Этот конвертер используется для замены строкового значения. Необходимо настроить объект для замены и новое значение.

Remove line break

Этот конвертер используется для удаления символов новой строки, таких как \n, \r и \r\n из поля.

Преобразование выражения

Этот конвертер использует язык выражений JSP (EL) для преобразования текущего поля или строки данных. JSP EL используется для создания арифметических и логических выражений. В выражении можно использовать целые числа, числа с плавающей точкой, строки, константы true и false, а также null.

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

  • Выражение поддерживает следующие переменные окружения:
    • value: указывает значение текущего поля.
    • row: указывает текущую строку, которая имеет тип массив.
  • Выражение поддерживает следующие утилиты:
    1. Если поле имеет тип строка, преобразуйте все символьные строки в строчные буквы, например, преобразуйте aBC в abc.

      Выражение: StringUtils.lowerCase(value)

    2. Преобразуйте все символьные строки текущего поля в заглавные буквы.

      Выражение: StringUtils.upperCase(value)

    3. Преобразуйте формат первого поля даты из 2018-01-05 15:15:05 в 20180105.

      Выражение: DateUtils.format(DateUtils.parseDate(row[0],"yyyy-MM-dd HH:mm:ss"),"yyyyMMdd")

    4. Преобразуйте метку времени в строку даты в формате yyyy-MM-dd hh:mm:ss, например, преобразуйте 1701312046588 в 2023-11-30 10:40:46.

      Выражение: DateUtils.format(NumberUtils.toLong(value),"yyyy-MM-dd HH:mm:ss")

    5. Преобразовать строку даты в формате yyyy-MM-dd hh:mm:ss в метку времени.

      Выражение: DateUtils.getTime(DateUtils.parseDate(value,"yyyy-MM-dd hh:mm:ss"))

    6. Если значение поля представляет собой строку даты в формате yyyy-MM-dd, извлеките год из значения поля, например, извлеките 2017 из 2017-12-01.

      Выражение: StringUtils.substringBefore(value,"-")

    7. Если значение поля имеет числовой тип, преобразуйте значение в новое значение, которое в два раза больше исходного значения:

      Выражение: value*2

    8. Преобразуйте значение поля true в Y, а остальные значения полей — в N.

      Выражение: value=="true"?"Y":"N"

    9. Если значение поля имеет строковый тип и оставлено пустым, преобразуйте его в Default. В противном случае значение поля не будет преобразовано.

      Выражение: empty value? "Default":value

    10. Преобразуйте формат даты 2018/01/05 15:15:05 в 2018-01-05 15:15:05:

      Выражение: DateUtils.format(DateUtils.parseDate(value,"yyyy/MM/dd HH:mm:ss"),"yyyy-MM-dd HH:mm:ss")

    11. Получить 36‑битный универсальный уникальный идентификатор (UUID):

      Выражение: CommonUtils.randomUUID()

    12. Если поле имеет тип string, сделайте первую букву заглавной, например, преобразуйте cat в Cat.

      Выражение: StringUtils.capitalize(value)

    13. Если поле имеет тип string, преобразуйте первую букву в строчную, например, преобразуйте Cat в cat.

      Выражение: StringUtils.uncapitalize(value)

    14. Если поле имеет тип string, используйте пробел для заполнения строки до указанной длины и центрируйте строку. Если длина строки не короче указанной длины, не преобразовывайте строку. Например, преобразуйте ab до указанной длины 4.

      Выражение: StringUtils.center(value,4)

    15. Удалите перевод строки (включая \n, \r и \r\n) в конце строки. Например, преобразуйте abc\r\n\r\n в abc\r\n.

      Выражение: StringUtils.chomp(value)

    16. Если строка содержит указанную подстроку, true возвращается; иначе false возвращается. Например, abc содержит a, поэтому true возвращается.

      Выражение: StringUtils.contains(value,"a")

    17. Если строка содержит любой символ из указанной строки, true возвращается; иначе false возвращается. Например, zzabyycdxx содержит либо z, либо a, поэтому true возвращается.

      Выражение: StringUtils.containsAny(value,"za")

    18. Если строка не содержит ни один из указанных символов, true возвращается. Если содержится любой из указанных символов, false возвращается. Например, abz содержит один символ из xyz, поэтому false возвращается.

      Выражение: StringUtils.containsNone(value,"xyz")

    19. Если строка содержит только указанные символы, true возвращается. Если содержится любой другой символ, false возвращается. Например, abab содержит только символы из abc, поэтому true возвращается.

      Выражение: StringUtils.containsOnly(value,"abc")

    20. Если строка пуста или имеет значение null, преобразуйте её в указанную строку. В противном случае не преобразуйте строку. Например, преобразуйте пустую строку в null.

      Выражение: StringUtils.defaultIfEmpty(value,null)

    21. Если строка заканчивается указанным суффиксом (с учётом регистра), возвращается true; в противном случае возвращается false. Например, если суффикс abcdef не равен null, возвращается false.

      Выражение: StringUtils.endsWith(value,null)

    22. Если строка совпадает с указанной строкой (с учётом регистра), возвращается true; в противном случае возвращается false. Например, после сравнения строк abc и ABC возвращается false.

      Выражение: StringUtils.equals(value,"ABC")

    23. Получите первый индекс указанной подстроки в строке. Если индекс не найден, возвращается -1. Например, первый индекс ab в строке aabaabaa равен 1.

      Выражение: StringUtils.indexOf(value,"ab")

    24. Получите последний индекс указанной подстроки в строке. Если индекс не найден, возвращается -1. Например, последний индекс k в строке aFkyk равен 4.

      Выражение: StringUtils.lastIndexOf(value,"k")

    25. Получите первый индекс указанной подстроки, начиная с позиции, указанной в строке. Если индекс не найден, возвращается -1. Например, первый индекс b, полученный после индекса 3 строки aabaabaa, равен 5.

      Выражение: StringUtils.indexOf(value,"b",3)

    26. Получите первый индекс любого из указанных символов в строке. Если индекс не найден, возвращается -1. Например, первый индекс z или a в строке zzabyycdxx. равен 0.

      Выражение: StringUtils.indexOfAny(value,"za")

    27. Если строка содержит любой Unicode‑символ, true возвращается; в противном случае возвращается false. Например, ab2c содержит только не‑Unicode‑символы, поэтому возвращается false.

      Выражение: StringUtils.isAlpha(value)

    28. Если строка содержит только Unicode‑символы и цифры, true возвращается; в противном случае возвращается false. Например, ab2c содержит только Unicode‑символы и цифры, поэтому возвращается true.

      Выражение: StringUtils.isAlphanumeric(value)

    29. Если строка содержит только Unicode‑символы, цифры и пробелы, true возвращается; в противном случае возвращается false. Например, ab2c содержит только Unicode‑символы и цифры, поэтому возвращается true.

      Выражение: StringUtils.isAlphanumericSpace(value)

    30. Если строка содержит только Unicode‑символы и пробелы, true возвращается; в противном случае возвращается false. Например, ab2c содержит Unicode‑символы и цифры, поэтому возвращается false.

      Выражение: StringUtils.isAlphaSpace(value)

    31. Если строка содержит только печатные ASCII‑символы, true возвращается; в противном случае возвращается false. Например, для !ab-c~ возвращается true.

      Выражение: StringUtils.isAsciiPrintable(value)

    32. Если строка пуста или имеет значение null, true возвращается; в противном случае возвращается false.

      Выражение: StringUtils.isEmpty(value)

    33. Если строка содержит только Unicode‑цифры, true возвращается; в противном случае возвращается false.

      Выражение: StringUtils.isNumeric(value)

    34. Получите первые символы указанной длины. Например, получите первые два символа ab из abc.

      Выражение: StringUtils.left(value,2)

    35. Получить правые символы указанной длины. Например, получить правые два символа bc из abc.

      Выражение: StringUtils.right(value,2)

    36. Конкатенировать указанную строку слева от текущей строки и задать длину полученной строки. Если длина текущей строки не короче указанной длины, строка не будет преобразована. Например, если yz конкатенируется слева от bat и после конкатенации длина должна быть 8, полученная строка будет yzyzybat после преобразования.

      Выражение: StringUtils.leftPad(value,8,"yz")

    37. Конкатенировать указанную строку справа от текущей строки и задать длину полученной строки. Если длина текущей строки не короче указанной длины, строка не будет преобразована. Например, если yz конкатенируется справа от bat и после конкатенации длина должна быть 8, полученная строка будет batyzyzy после преобразования.

      Выражение: StringUtils.rightPad(value,8,"yz")

    38. Если поле имеет тип string, получить длину текущей строки. Если строка равна null, возвращается 0.

      Выражение: StringUtils.length(value)

    39. Если поле имеет тип string, удалить из него все указанные подстроки. Например, удалить ue из queued, получив qd.

      Выражение: StringUtils.remove(value,"ue")

    40. Если поле имеет тип string, удалить подстроку в конце поля. Если указанная подстрока не находится в конце поля, преобразование не выполняется. Например, удалить .com в конце www.domain.com.

      Выражение: StringUtils.removeEnd(value,".com")

    41. Если поле имеет тип string, удалить подстроку в начале поля. Если указанная подстрока не находится в начале поля, преобразование не выполняется. Например, удалить www. в начале www.domain.com.

      Выражение: StringUtils.removeStart(value,"www.")

    42. Если поле имеет тип string, замените все указанные строковые последовательности в поле. Например, замените a в aba на z, чтобы получить zbz.

      Выражение: StringUtils.replace(value,"a","z")

      Если заменяемый контент содержит специальный символ, специальный символ необходимо экранировать в обычный символ. Например, если нужно удалить \t из строки, используйте следующее выражение: StringUtils.replace(value,"\\t",""), что означает повторное экранирование обратного слеша (\).

    43. Если поле имеет тип string, заменяйте несколько символов в строке одновременно. Например, замените h в hello на j и o на y, чтобы получить jelly.

      Выражение: StringUtils.replaceChars(value,"ho","jy")

    44. Если строка начинается с указанного префикса (с учётом регистра), true возвращается; иначе false возвращается. Например, abcdef начинается с abc, поэтому true возвращается.

      Выражение: StringUtils.startsWith(value,"abc")

    45. Если поле имеет тип string, удалите все указанные символы в начале и в конце поля. Например, удалите все x, y, z и b из abcyx, чтобы получить abc.

      Выражение: StringUtils.strip(value,"xyzb")

    46. Если поле имеет тип string, удалите все указанные символы в конце поля, например, удалите строку "abc" в конце поля.

      Выражение: StringUtils.stripEnd(value,"abc")

    47. Если поле имеет тип string, удалите все указанные символы в начале поля, например, удалите все пробелы в начале поля.

      Выражение: StringUtils.stripStart(value,null)

    48. Если поле имеет тип string, получите подстроку после указанной позиции (индекс начинается с 0, включая символ в указанной позиции) строки. Если указанная позиция отрицательная, позиция считается в обратном порядке. Первый символ с конца имеет индекс -1. Например, получите символ с индексом 2 из abcde (это c) и строку после него, то есть cde.

      Выражение: StringUtils.substring(value,2)

    49. Если поле имеет тип string, получите подстроку в указанном диапазоне (индекс начинается с 0, включая символ в начале и исключая символ в конце). Если диапазон отрицательный, позиция вычисляется в обратном порядке. Первый символ с конца имеет индекс -1. Например, получите строку между вторым символом (c) и четвертым символом (e) из abcde, то есть cd.

      Выражение: StringUtils.substring(value,2,4)

    50. Если поле имеет тип string, получите подстроку после первого указанного символа. Например, получите подстроку после первого b в abcba, то есть cba.

      Выражение: StringUtils.substringAfter(value,"b")

    51. Если поле имеет тип string, получите подстроку после последнего указанного символа. Например, получите подстроку после последнего b в abcba, то есть a.

      Выражение: StringUtils.substringAfterLast(value,"b")

    52. Если поле имеет тип string, получите подстроку перед первым указанным символом. Например, получите подстроку перед первым b в abcba, то есть a.

      Выражение: StringUtils.substringBefore(value,"b")

    53. Если поле имеет тип string, получите подстроку перед последним указанным символом. Например, получите подстроку перед последним b в abcba, то есть abc.

      Выражение: StringUtils.substringBeforeLast(value,"b")

    54. Если поле имеет тип string, получите подстроку, вложенную в указанную строку. Если подстрока не найдена, возвращается null. Например, получите подстроку между tag в tagabctag, то есть abc.

      Выражение: StringUtils.substringBetween(value,"tag")

    55. Если поле имеет тип string, удалите управляющие символы (char≤32) с обеих сторон строкового значения, например, удалите пробелы с обеих сторон строки.

      Выражение: StringUtils.trim(value)

    56. Преобразуйте строку в значение типа byte. Если преобразование не удалось, возвращается 0.

      Выражение: NumberUtils.toByte(value)

    57. Преобразовать строку символов в значение типа byte. Если преобразование не удалось, возвращается указанное значение, например, 1.

      Выражение: NumberUtils.toByte(value,1)

    58. Преобразовать строку символов в значение типа double. Если преобразование не удалось, возвращается 0.0d.

      Выражение: NumberUtils.toDouble(value)

    59. Преобразовать строку символов в значение типа double. Если преобразование не удалось, возвращается указанное значение, например, 1.1d.

      Выражение: NumberUtils.toDouble(value,1.1d)

    60. Преобразовать строку символов в значение типа float. Если преобразование не удалось, возвращается 0.0f.

      Выражение: NumberUtils.toFloat(value)

    61. Преобразовать строку символов в значение типа float. Если преобразование не удалось, возвращается указанное значение, например, 1.1f.

      Выражение: NumberUtils.toFloat(value,1.1f)

    62. Преобразовать строку символов в значение типа int. Если преобразование не удалось, возвращается 0.

      Выражение: NumberUtils.toInt(value)

    63. Преобразовать строку символов в значение типа int. Если преобразование не удалось, возвращается указанное значение, например, 1.

      Выражение: NumberUtils.toInt(value,1)

    64. Преобразовать строку символов в значение типа long. Если преобразование не удалось, 0 возвращается.

      Выражение: NumberUtils.toLong(value)

    65. Преобразовать строку символов в значение типа long. Если преобразование не удалось, возвращается указанное значение, например, 1L.

      Выражение: NumberUtils.toLong(value,1L)

    66. Преобразовать строку символов в значение типа short. Если преобразование не удалось, 0 возвращается.

      Выражение: NumberUtils.toShort(value)

    67. Преобразовать строку символов в значение типа short. Если преобразование не удалось, возвращается указанное значение, например, 1.

      Выражение: NumberUtils.toShort(value,1)

    68. Преобразовать строку IP в значение типа long, например, преобразовать 10.78.124.0 в 172915712.

      Выражение: CommonUtils.ipToLong(value)

    69. Считать файл сопоставления IP‑адресов и физических адресов из сети и загрузить файл сопоставления в коллекцию карт. url указывает адрес для хранения файла сопоставления IP, например, http://10.114.205.45:21203/sqoop/IpList.csv.

      Выражение: HttpsUtils.downloadMap("url")

    70. Кешировать сопоставления IP‑адресов и физических адресов и указать ключ для получения, например, ipList.

      Выражение: CommonUtils.setCache("ipList",HttpsUtils.downloadMap("url"))

    71. Получить кешированные сопоставления IP‑адресов и физических адресов.

      Выражение: CommonUtils.getCache("ipList")

    72. Проверьте, кэшированы ли сопоставления IP-адреса и физического адреса.

      Выражение: CommonUtils.cacheExists("ipList")

    73. На основе указанного типа смещения (month/day/hour/minute/second) и смещения (положительное число указывает на увеличение, отрицательное — на уменьшение) преобразуйте время в указанном формате в новое время, например, добавьте 8 часов к 2019-05-21 12:00:00.

      Выражение: DateUtils.getCurrentTimeByZone("yyyy-MM-dd HH:mm:ss",value, "hour", 8)

    74. Если значение пустое или null, возвращается "aaa". В противном случае возвращается value.

      Выражение: StringUtils.defaultIfEmpty(value,"aaa")