Pentaho Data Integration (also known as Kettle) là một trong những giải pháp tích hợp mã nguồn mở hàng đầu. Với PDI / Kettle, bạn có thể lấy dữ liệu từ nhiều nguồn, biến đổi dữ liệu một cách đặc biệt và load data vào hệ thống mục tiêu.

 

Đối với hướng dẫn này, tôi muốn chứng minh làm thế nào để chuyển đổi một tệp XML có chứa loại dữ liệu vào tệp tin Category Impex sử dụng Pentaho Data Integration.

 

Để minh họa thêm nhiều tính năng và tính năng của Pentaho, tôi quyết định sử dụng cấu trúc XML toàn diện cung cấp dữ liệu trong mô hình Entity-Attribute-Values (EAVs).

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

 

<table>
<columns>
<column number="1">
<name>PRODUCT_CATEGORY_ID</name>
</column>
<column number="2">
<name>NAME</name>
</column>
<column number="4">
<name>PARENT_ID</name>
</column>
</columns>
<rows>
<row rowNumber="0">
<value columnNumber="1">1</value>
<value columnNumber="2">My Category_A</value>
<value columnNumber="4"></value>
</row>
<row rowNumber="1">
<value columnNumber="1">11</value>
<value columnNumber="2">Category_A11</value>
<value columnNumber="4">1</value>
</row>
<row rowNumber="2">
<value columnNumber="1">12</value>
<value columnNumber="2">Category A12</value>
<value columnNumber="4">1</value>
</row>
<row rowNumber="3">
<value columnNumber="1">2</value>
<value columnNumber="2">Category B</value>
<value columnNumber="4"></value>
</row>
<row rowNumber="2">
<value columnNumber="1">22</value>
<value columnNumber="2">Category A22</value>
<value columnNumber="4">2</value>
</row>
</rows></table>

Định dạng mục tiêu là ImpEx. Đối với XML ở trên, kết quả sau được mong đợi:

$productCatalog=Default
"$catalogVersion=catalogversion(catalog(id[default=$productCatalog]), version[default='Online'])[unique=true,default=$productCatalog:Online]";;;;;
"$lang=en";;;;;
"INSERT_UPDATE Category";"code[unique=true]";" supercategories(code, $catalogVersion)";"name[lang=$lang]";"$catalogVersion";"allowedPrincipals(uid)[default='customergroup']"
;"H_ROOT";;"Root Category";;
;"H_1";"H_ROOT";"My Category_A";;
;"H_11";"H_1";"Category_A11";;
;"H_22";"H_2";"Category A22";;
;"H_2";"H_ROOT";"Category B";;

 

Xin lưu ý rằng ID danh mục bắt đầu bằng "H_". Đó là một sự thay đổi tùy chọn, chỉ để chứng minh năng lực Pentaho của Mapper Value Mappers. Trong các dự án thực, chuyển đổi các ID cũng rất quan trọng, nhưng thuật toán có thể phức tạp hơn.

 

Các nút gốc được đại diện bởi các giá trị rỗng trong XML. Trong định dạng đích, chúng ta cần đặt chúng dưới một nút gốc (gọi là H_ROOT).

 

Sau khi áp dụng Impex này, hybris tạo một cây danh mục:

 

upload_2018-1-18_8-22-28.png

 

Vì vậy, mục tiêu của chúng tôi là chuyển đổi XML gốc sang tệp ImpEx này. Trong bài trước tôi đã chỉ ra cách triển khai nó mà không cần sử dụng bất kỳ phần mềm nào. Hôm nay tôi sẽ cho bạn biết về giải pháp luân phiên. Giải pháp này là một cấu hình cho Pentaho, một nền tảng tích hợp dữ liệu.

 

Pentaho configuration

Hãy bắt đầu từ dưới lên và xem kết quả cuối cùng. Trong hướng dẫn này chúng ta sẽ đi đến quá trình sau:

 

upload_2018-1-18_8-22-55.png

 

Quá trình này bao gồm 19 bước (sau mỗi bước tôi đặt một bảng với các kết quả của bước):

 

1. Đọc các definitions từ XML. Đọc các giá trị cột. Phần XML này không chứa các tên cột, chỉ chứa các ID. Vì vậy, giai đoạn tiếp theo là joining cùng nhau.

 

upload_2018-1-18_8-23-32.png

 

2. Đọc các giá trị từ XML. Đọc các giá trị cột. Phần XML này không chứa các tên cột, chỉ các ID của họ. Vì vậy, giai đoạn tiếp theo là tham gia cùng nhau.

 

upload_2018-1-18_8-23-51.png

 

3. Join Rows. Hai bộ dữ liệu trước đó đã được tham gia vào id = columnNumber.

 

upload_2018-1-18_8-24-9.png

 

4. Sort rows. Sắp xếp theo rowNumber.

 

upload_2018-1-18_8-24-23.png

5. Denormalize. Pentaho tạo các cột bổ sung (PARENT_ID, PRODUCT_CATEGORY_ID, NAME) sử dụng các giá trị của trường "value".

 

upload_2018-1-18_8-24-38.png

6. Chuyển đổi ID thành ID hybris. Theo nhiệm vụ, chúng tôi thêm "H_" vào ID gốc.

 

upload_2018-1-18_8-24-54.png

7. Chuyển đổi các nút gốc thành H_ROOT.

 

upload_2018-1-18_8-25-7.png

 

8. Loại bỏ các lĩnh vực không sử dụng (cột).

 

upload_2018-1-18_8-25-22.png

 

9. Nối thêm a Root category:

A. Đầu tiên, tạo một root category.

upload_2018-1-18_8-27-40.png

B. Hợp nhất nó với dữ liệu từ tập dữ liệu được lấy từ tệp tin XML:

upload_2018-1-18_8-27-59.png

10. Thêm một cột vào đầu.

A, Thêm một cột số không có giá trị:

upload_2018-1-18_8-28-16.png

B, Tham gia nó vào bộ dữ liệu được lấy từ tệp tin XML:

upload_2018-1-18_8-28-27.png

11. Thêm một vài trường.

 

A, Chuẩn bị một đối tượng với các cột sau:

upload_2018-1-18_8-28-39.png

B, Tham gia chúng vào bộ dữ liệu từ bước trước:

upload_2018-1-18_8-28-51.png

12. Thêm IMPEX Section Header.

 

A, Chuẩn bị IMPEX Section Header

upload_2018-1-18_8-29-4.png

B, Hợp nhất nó với dữ liệu từ trước
13. Áp dụng một mẫu từ tệp tin văn bản bên ngoài. Về cơ bản, mẫu định nghĩa một Impex Header:

A, Chuẩn bị mẫu
B, Hợp nhất tiêu đề này vào một tập dữ liệu từ trước
14. Chuyển đổi các dữ liệu này thành tệp CSV.


Đọc các định nghĩa từ XML

Bước này cung cấp khả năng đọc dữ liệu từ bất kỳ loại tệp XML nào bằng cách sử dụng các thông số kỹ thuật XPath. Nó sử dụng các bộ phân tích cú pháp DOM cần trong xử lý bộ nhớ và thậm chí việc tẩy các phần của tệp không đủ khi các phần này rất lớn. Nếu bạn cần phải xử lý các tệp tin khổng lồ, Pentaho có một thành phần phân tích cú pháp XML khác là XML Input Stream (StAX).

 

Có ba tab chính:

File

Content

Fields

File. Tên tệp được lưu trữ dưới dạng tham số dự án, vì vậy tôi tham chiếu đến biến bằng tên của nó thay vì sử dụng tên tệp trực tiếp.

upload_2018-1-18_8-31-16.png

XML1 là một hằng được xác định trong cấu hình dự án. Bạn cũng có thể sử dụng một tên tập tin thay vì tham chiếu biến.

 

 

Content. "Loop XPath" xác định nút gốc để xử lý. Công việc này xử lý tiêu đề, vì vậy tôi lọc phần tiêu đề (xem XML ở trên).

upload_2018-1-18_8-31-40.png

Fields. Phần này định nghĩa những gì XML tag / thuộc tính giá trị nên được ánh xạ với những gì lĩnh vực. Các quy tắc dưới đây nói: đặt một giá trị từ thẻ tên vào một cột đầu tiên (được gọi là "columnname") và một giá trị của thuộc tính vào biến "id".

 

upload_2018-1-18_8-31-50.png

Kết quả là, chúng ta có một danh sách các thuộc tính category cũng như các mã của chúng:

 

upload_2018-1-18_8-32-0.png

Nó sử dụng cùng một thành phần, nhưng với cấu hình hơi khác:

 

 

XPath is /table/rows/row/* .

 

Field configuration:

upload_2018-1-18_8-32-11.png

 

Kết quả như sau:

 

upload_2018-1-18_8-32-20.png

 

Đối với một số loại, không có danh mục gốc, vì vậy các giá trị của thuộc tính # 4 (PARENT_ID) trống cho chúng.

 

 

Join Rows

 

Đối với nhiệm vụ này, thành phần " Joins/Join Rows (cartesian product) " đã được sử dụng.

 

 

Ở bước này, hai bộ trước đó được hợp nhất trong một. Điều kiện kết nối là id = columnnumber. Cả hai lĩnh vực có nghĩa là cùng một điều, một tên trường id.

 

upload_2018-1-18_8-32-38.png

 

Bảng kết quả là:

 

upload_2018-1-18_8-32-52.png

Sorting rows

 

Để chuẩn bị cho việc Denormalization, chúng ta cần phải sắp xếp các hàng bằng rowNumber, đưa cùng các thuộc tính liên quan đến cùng loại.

 

upload_2018-1-18_8-33-14.png

 

Kết quả:

upload_2018-1-18_8-33-24.png

Denormalization

Thành phần này chuyển đổi dữ liệu EAV vào các trường, một cho mỗi thuộc tính EAV.

Có ba điều chúng ta cần phải cấu hình:

Key field, lĩnh vực từ bảng mã nguồn có chứa một tên thuộc tính.

Group field, mã nguồn duy nhất trong trường hợp của chúng tôi

Target fields, một quy tắc lập bản đồ cho mỗi thuộc tính được sử dụng trong các giá trị key field.

upload_2018-1-18_8-37-36.png

Kết quả:

 

upload_2018-1-18_8-37-50.png

Chuyển đổi ID thành ID hybris

 

Theo nhiệm vụ, chúng tôi thêm "H_" vào ID gốc. Tôi đã sử dụng một thành phần gọi là "Transform / Replace in String" và các biểu thức thông thường. Đã tạo hai trường mới, HYBRIS_CODE và HYBRIS_PARENT_ID.

 

 

upload_2018-1-18_8-38-2.png

 

Kết quả:

 

upload_2018-1-18_8-40-12.png

Chuyển đổi các nút gốc thành H_ROOT

 

upload_2018-1-18_8-40-43.png

 

Xóa các trường không sử dụng (columns)

 

Một số trường không còn được sử dụng nữa và cần được loại bỏ khỏi đầu ra. Tôi đã sử dụng một thành phần "Select / Rename values" cho nhiệm vụ này.

 

upload_2018-1-18_8-40-55.png