This guide shows how to build a simple
ETL pipeline using
Spring Boot and
SAP HANA Express to extract, transform, and load data.
1. Create Target Table in SAP HANA
CREATE COLUMN TABLE CLEANED_ORDERS (
ID INTEGER PRIMARY KEY,
PRODUCT NVARCHAR(100),
QUANTITY INT,
REGION NVARCHAR(50)
);
2. Add Dependencies
In
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.sap.cloud.db.jdbc</groupId>
<artifactId>ngdbc</artifactId>
<version>2.18.14</version>
</dependency>
3. Configure application.properties
spring.datasource.url=jdbc:sap://localhost:39015/?databaseName=HXE
spring.datasource.username=SYSTEM
spring.datasource.password=YourPassword
spring.datasource.driver-class-name=com.sap.db.jdbc.Driver
4. Define Entity
import jakarta.persistence.*;
@Entity
public class CleanedOrder {
@Id
private int id;
private String product;
private int quantity;
private String region;
// getters and setters
}
5. Repository
import org.springframework.data.jpa.repository.JpaRepository;
public interface CleanedOrderRepository extends JpaRepository<CleanedOrder, Integer> {
}
6. ETL Service
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class ETLService {
private final CleanedOrderRepository repo;
public ETLService(CleanedOrderRepository repo) {
this.repo = repo;
}
public void runETL() {
// Extract: mock raw data
List<Map<String, Object>> raw = List.of(
Map.of("id", 1, "product", " Laptop ", "quantity", 2, "region", "US "),
Map.of("id", 2, "product", "Phone", "quantity", 5, "region", " EU")
);
// Transform: trim and clean
List<CleanedOrder> cleaned = raw.stream().map(r -> {
CleanedOrder o = new CleanedOrder();
o.setId((int) r.get("id"));
o.setProduct(r.get("product").toString().trim());
o.setQuantity((int) r.get("quantity"));
o.setRegion(r.get("region").toString().trim().toUpperCase());
return o;
}).toList();
// Load: save to SAP HANA
repo.saveAll(cleaned);
}
}
7. Run Pipeline via REST
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/etl")
public class ETLController {
private final ETLService service;
public ETLController(ETLService service) {
this.service = service;
}
@PostMapping("/run")
public String runPipeline() {
service.runETL();
return "ETL completed!";
}
}
Test
Run app and call:
POST /etl/run
Data will be cleaned and inserted into
CLEANED_ORDERS in SAP HANA.
image quote pre code