当前位置: 首页 > news >正文

Seatunnel解决Excel中无法将数字类型转换成字符串类型以及源码打包

需求

需要实现将Excel中的数字类型的单元格像数据库中字符串类型的字段中推送

问题原因

Seatunnel在读取字段类型的时候都是使用强转的形式去获取数据的
假如说数据类型不一样的话直接强转就会报错

修改位置

org/apache/seatunnel/api/table/type/SeaTunnelRow.java
在这里插入图片描述

org/apache/seatunnel/connectors/seatunnel/jdbc/internal/converter/AbstractJdbcRowConverter.java
在这里插入图片描述

修改的代码

    @Overridepublic PreparedStatement toExternal(TableSchema tableSchema, SeaTunnelRow row, PreparedStatement statement)throws SQLException {SeaTunnelRowType rowType = tableSchema.toPhysicalRowDataType();for (int fieldIndex = 0; fieldIndex < rowType.getTotalFields(); fieldIndex++) {SeaTunnelDataType<?> seaTunnelDataType = rowType.getFieldType(fieldIndex);int statementIndex = fieldIndex + 1;Object fieldValue = row.getField(fieldIndex);if (fieldValue == null) {statement.setObject(statementIndex, null);continue;}switch (seaTunnelDataType.getSqlType()) {case STRING://TODO wxt//regiontry{//直接类型强转会出问题  比如double类型就不能转成String// 可以使用下面的toString解决这种类型问题statement.setString(statementIndex, (String) row.getField(fieldIndex));}catch (Exception e){statement.setString(statementIndex,  row.getField(fieldIndex).toString());}//endregionbreak;case BOOLEAN:statement.setBoolean(statementIndex, (Boolean) row.getField(fieldIndex));break;case TINYINT:statement.setByte(statementIndex, (Byte) row.getField(fieldIndex));break;case SMALLINT:statement.setShort(statementIndex, (Short) row.getField(fieldIndex));break;case INT:statement.setInt(statementIndex, (Integer) row.getField(fieldIndex));break;case BIGINT:statement.setLong(statementIndex, (Long) row.getField(fieldIndex));break;case FLOAT:statement.setFloat(statementIndex, (Float) row.getField(fieldIndex));break;case DOUBLE:statement.setDouble(statementIndex, (Double) row.getField(fieldIndex));break;case DECIMAL:statement.setBigDecimal(statementIndex, (BigDecimal) row.getField(fieldIndex));break;case DATE:LocalDate localDate = (LocalDate) row.getField(fieldIndex);statement.setDate(statementIndex, java.sql.Date.valueOf(localDate));break;case TIME:writeTime(statement, statementIndex, (LocalTime) row.getField(fieldIndex));break;case TIMESTAMP:LocalDateTime localDateTime = (LocalDateTime) row.getField(fieldIndex);statement.setTimestamp(statementIndex, java.sql.Timestamp.valueOf(localDateTime));break;case BYTES:statement.setBytes(statementIndex, (byte[]) row.getField(fieldIndex));break;case NULL:statement.setNull(statementIndex, java.sql.Types.NULL);break;case ARRAY:Object[] array = (Object[]) row.getField(fieldIndex);if (array == null) {statement.setNull(statementIndex, java.sql.Types.ARRAY);break;}statement.setObject(statementIndex, array);break;case MAP:case ROW:default:throw new JdbcConnectorException(CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE,"Unexpected value: " + seaTunnelDataType);}}return statement;}
    private int getBytesForValue(Object v, SeaTunnelDataType<?> dataType) {if (v == null) {return 0;}SqlType sqlType = dataType.getSqlType();switch (sqlType) {case STRING://region//TODO 避免强转出现问题try{return ((String) v).length();}catch (Exception e){return ( v.toString()).length();}//endregioncase BOOLEAN:case TINYINT:return 1;case SMALLINT:return 2;case INT:case FLOAT:return 4;case BIGINT:case DOUBLE:return 8;case DECIMAL:return 36;case NULL:return 0;case BYTES:return ((byte[]) v).length;case DATE:return 24;case TIME:return 12;case TIMESTAMP:return 48;case ARRAY:return getBytesForArray(v, ((ArrayType) dataType).getElementType());case MAP:int size = 0;MapType<?, ?> mapType = ((MapType<?, ?>) dataType);for (Map.Entry<?, ?> entry : ((Map<?, ?>) v).entrySet()) {size +=getBytesForValue(entry.getKey(), mapType.getKeyType())+ getBytesForValue(entry.getValue(), mapType.getValueType());}return size;case ROW:int rowSize = 0;SeaTunnelRowType rowType = ((SeaTunnelRowType) dataType);SeaTunnelDataType<?>[] types = rowType.getFieldTypes();SeaTunnelRow row = (SeaTunnelRow) v;for (int i = 0; i < types.length; i++) {rowSize += getBytesForValue(row.fields[i], types[i]);}return rowSize;default:throw new UnsupportedOperationException("Unsupported type: " + sqlType);}}

如何源码打包

用maven插件打包就行
打完包的话东西在dist下面 如截图所示
在这里插入图片描述

相关文章:

Seatunnel解决Excel中无法将数字类型转换成字符串类型以及源码打包

需求 需要实现将Excel中的数字类型的单元格像数据库中字符串类型的字段中推送 问题原因 Seatunnel在读取字段类型的时候都是使用强转的形式去获取数据的 假如说数据类型不一样的话直接强转就会报错 修改位置 org/apache/seatunnel/api/table/type/SeaTunnelRow.java org…...

在阿里云快速启动Appsmith搭建前端页面

什么是Appsmith Appsmith是一个开源的低代码开发平台&#xff0c;它使得开发者能够快速地构建内部工具、业务管理系统、CRM系统等。Appsmith通过提供一系列预建的UI组件&#xff08;如表格、图表、表单等&#xff09;&#xff0c;以及对数据库、API调用的直接支持&#xff0c;…...

「51媒体」:企业成长助推器

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 「51媒体」&#xff08;51meiti media PR&#xff09;作为国内具有影响力的媒体邀约服务商&#xff0c;确实在助力企业成长方面发挥着重要作用。以下是对「51媒体」的详细介绍&#xff0…...

安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机

随着药厂对设备运维需求的增长&#xff0c;制药装备企业需要在提高运维效率的同时&#xff0c;降低人工及差旅成本。制药装备因其数据具有高度的保密性&#xff0c;要求运维工程师提供安全可靠的远程调试方式。本案例介绍了明达技术MBox20系列5口WIFI通用网关在制药装备上的应用…...

海康威视和大华视频设备对接方案

目录 一、海康威视 【老版本】 【新版本】 二、大华 一、海康威视 【老版本】 URL规定&#xff1a; rtsp://username:password[ipaddress]/[videotype]/ch[number]/[streamtype] 注&#xff1a;VLC可以支持解析URL里的用户名密码&#xff0c;实际发给设备的RTSP请求不支…...

用DMA来自动控制PWM的输出(音频输出,交直流转换)

一、前提分析 举例&#xff1a;一首歌所包含的音阶有高有低&#xff0c;而按照某种编曲的顺序排列也就对应了不同的频率&#xff08;五线谱&#xff1a;1234567 对应的音阶各不相同&#xff09;所以频率可以理解为它的源头。频率的来源又可由PWM来控制故而一首歌所包含的频率序…...

利用hive元数据统计数据量

对于数据量的统计&#xff0c;从表是否分区分为分区表和非分区表两者有着不同的统计方式 非分区表 1. 利用传统方法count 2. 利用元数据计算&#xff1a; select sum(tb.param_value) AS TOTAL from sys.tbls t left join sys.dbs d on t.db_id d.db_id left join sys.tabl…...

平均值(水题???)

今天刷题时发现了一道十分难简单的题。大家仔细看看题目。 题目 5. K11937 平均值 题目描述 在演讲比赛中&#xff0c;当参赛者完成演讲时&#xff0c;评委会对他的表演进行评分。工作人员会去掉一个最高分&#xff0c;一个最低分&#xff0c;然后计算其余的平均值作为参赛者…...

免费开源!DBdoctor推出开源版系统诊断工具systool

​前言 在开发和运维过程中&#xff0c;经常会遇到难以定位的应用问题&#xff0c;我们通常需要借助Linux系统资源监控工具来辅助诊断。然而&#xff0c;系统的IO、网络、CPU使用率以及文件句柄等信息通常需要通过多个独立的命令工具来获取。在没有部署如Prometheus这样的综合…...

Bufferevent and SSL

bufferevent可以使用OpenSSL库实现SSL/TLS安全传输层。因为很多应用不需要或者不想链接OpenSSL&#xff0c;这部分功能在单独的libevent_openssl库中实现。未来版本的libevent可能会添加其他SSL/TLS库&#xff0c;如NSS或者GnuTLS&#xff0c;但是当前只有OpenSSL。 OpenSSL功能…...

我要成为算法高手-位运算篇

目录 1. 判断字符是否唯一2. 消失的数字3. 两整数之和4. 只出现一次的数字II5. 消失的两个数字 前情提要&#xff1a;如果对一些常见的二进制位运算不熟悉&#xff0c;请看这篇文章&#xff1a; 常见的位运算 1. 判断字符是否唯一 面试题 01.01. 判定字符是否唯一 - 力扣&…...

分布式IO模块:智慧楼宇的“智慧眼”与“智慧手”

在现代化的城市建设中&#xff0c;智慧楼宇作为一种集成了建筑、通信、计算机和控制等多方面技术的新型建筑&#xff0c;正逐渐成为城市发展的重要驱动力。智慧楼宇不仅提高了建筑设备的运行效率&#xff0c;降低了能源消耗&#xff0c;还提供了更加安全、舒适和便捷的生活办公…...

嵌入式八股文

硬件 1.CPU、MPU、MCU、SOC联系与差别 Cpu是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶 段&#xff1a;提取&#xff08;Fetch&#xff09;、解码&#xff08;Dec…...

【IOS】Undefined symbol: _OBJC_CLASS_$_PAGFile

项目场景&#xff1a; flutter构建framework包&#xff0c;ios导入时&#xff0c;报PAG动画第三方库引用错误问题。 问题描述 Undefined symbol: _OBJC_CLASS_$_PAGFile Undefined symbol: _OBJC_CLASS_$_PAGPlayer Undefined symbol: _OBJC_CLASS_$_PAGSurface 1.第三方PAG…...

Spring Boot整合Tomcat底层源码分析

引言 Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性&#xff0c;大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理&#xff0c;并通过Java代码手写模拟Spring…...

工具类-基于 axios 的 http 请求工具 Request

基于 axios 的 http 请求工具 基于 axios 实现一个 http 请求工具&#xff0c;支持设置请求缓存和取消 http 请求等功能 首先实现一个 简单的 http 请求工具 import axios, {AxiosError,AxiosInterceptorManager,AxiosRequestConfig,AxiosResponse, } from axios;// 接口返回…...

WPF的基础控件详解

WPF的基础控件详解 在WPF学习中 基本控件是最简单也是最基础的东西。也是很初学者容易忽略的 本此笔记教程主要针对WPF中基础控件使用和应用进行手把手教学&#xff0c;如果学习了此笔记对你有帮助记得一键三连哦~~~~ TextBlock 基本用法 长字串处理 LineBreak标籤在指定的地…...

qt学习:截图+键盘事件

效果 生成一个透明无边框全屏的窗口&#xff0c;然后按ctrlb键就可以选择区域进行截图保存 步骤 新建一个项目新建一个ctrlb类继承QMainWindow新建一个CaptureScreen类继承QWidget在main中启动ctrlb类 代码 ctrlb类.cpp #include "ctrlb.h" #include "cap…...

Scala中Arry

import scala.collection.mutable.ArrayBuffer //Arry:数组 //可修改的&#xff1a;ArryBuffer //不可修改的&#xff1a;Arryobject Test_1118_2 {//可修改的&#xff1a;ArrayBufferdef main(args: Array[String]): Unit {//1.新建val arr1ArrayBuffer(1,2,3)//2.添加arr14a…...

学习threejs,使用AnimationMixer实现变形动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.AnimationMixer 动画…...

Comsol模拟土壤中冰的融化过程:奇妙的微观世界之旅

comsol模拟土壤中冰的融化过程模型 在天气升温过程中&#xff0c;土壤表层的冰融化&#xff0c;深入土壤中&#xff0c;同时随着水流的渗入&#xff0c;土壤中的冰夹杂物融化&#xff0c;采用达西定律与包含相变的“多孔介质传热”接口相耦合&#xff0c;可以模拟土壤中冰夹杂物…...

定制化 H 型滑触线:抗温抗腐,高效赋能极端工业场景

【超越极限&#xff0c;安全稳定——为极端环境量身定制的H型滑触线】 在充满挑战的工作环境中&#xff0c;选择恰当的电源输送解决方案不仅是提高效率的关键&#xff0c;更是确保安全与可持续发展的基石。针对高温高湿、极寒或强腐蚀性场所特别设计的H型滑触线系列产品&#x…...

【NotebookLM 使用教程】 Slides 指令库:11套通用PPT风格Prompt(含中英文对照)

前言适合谁&#xff1a;不想从零写提示词&#xff0c;想直接套用成熟的 PPT 风格结构。你会获得什么&#xff1a;11 套通用风格指令&#xff08;英文为主&#xff0c;含中文备用&#xff09;&#xff0c;可直接粘贴到 NotebookLM Slides 的描述/自定义。建议阅读顺序&#xff1…...

AI智能体(Agent)的底层逻辑

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、核心模块&#xff1f; 二、工作流程 三、关键设计思想 3.1 ReAct 模式 3.2 工具调用&#xff08;Function Calling&#xff09; 3.3 记忆管理 3.4 多智能体…...

nVisual设备板卡关联

在线模型库导入&#xff1a;ODF-12x2 这个型号的设备打开模型库点左侧模型搜索需要添加板卡设备型号&#xff0c;点击建模双击板卡搜索板卡名称点击绿色按钮添加添加完成点应用到实例...

Linunx常用命令

一. 通用1.1系统单元启动# 创建系统用户&#xff0c;不允许登录&#xff0c;不创建 home 目录 sudo useradd -r -s /sbin/nologin xxl-job#将 /data/middleware/xxl-job 目录的归属权改为 xxl-job 用户&#xff1a; sudo chown -R xxl-job:xxl-job /data/middleware/xxl-job#检…...

代购系统技术实现:如何高效采集 1688 和淘宝商品数据

# 代购系统技术实现&#xff1a;如何高效采集 1688 和淘宝商品数据在跨境电商和代购业务中&#xff0c;高效采集 1688 和淘宝商品数据是核心痛点。本文分享我们在 taocarts 代购系统中的技术实践。## 一、数据采集架构设计我们采用分布式爬虫架构&#xff0c;核心模块包括&…...

如何用LangChain开发一个Agent,20分钟包教包会!

26年一定是一个 Agent 大年&#xff0c;我这边持续出系列文章&#xff0c;帮助大家更好的落地 Agent&#xff0c;今天的重点是程序员最常用的 Agent 框架 LangChain。 只不过这东西可能由于 AI Coding 的成熟&#xff0c;由给人看变成给 AI 看的。 LangChain 既是一个开源的A…...

intv_ai_mk11零基础上手:不装软件、不写代码、不开终端,纯浏览器操作

intv_ai_mk11零基础上手&#xff1a;不装软件、不写代码、不开终端&#xff0c;纯浏览器操作 1. 为什么选择intv_ai_mk11 想象一下&#xff0c;你正在准备一份重要报告&#xff0c;突然需要一段专业的内容摘要&#xff1b;或者你在写营销文案时卡壳了&#xff0c;需要一些创意…...

4大模块构建企业级专利智能分析平台:基于Google Patents Public Data的深度技术解析

4大模块构建企业级专利智能分析平台&#xff1a;基于Google Patents Public Data的深度技术解析 【免费下载链接】patents-public-data Patent analysis using the Google Patents Public Datasets on BigQuery 项目地址: https://gitcode.com/gh_mirrors/pa/patents-public-…...