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是一个开源的低代码开发平台,它使得开发者能够快速地构建内部工具、业务管理系统、CRM系统等。Appsmith通过提供一系列预建的UI组件(如表格、图表、表单等),以及对数据库、API调用的直接支持,…...
「51媒体」:企业成长助推器
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 「51媒体」(51meiti media PR)作为国内具有影响力的媒体邀约服务商,确实在助力企业成长方面发挥着重要作用。以下是对「51媒体」的详细介绍࿰…...
安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机
随着药厂对设备运维需求的增长,制药装备企业需要在提高运维效率的同时,降低人工及差旅成本。制药装备因其数据具有高度的保密性,要求运维工程师提供安全可靠的远程调试方式。本案例介绍了明达技术MBox20系列5口WIFI通用网关在制药装备上的应用…...
海康威视和大华视频设备对接方案
目录 一、海康威视 【老版本】 【新版本】 二、大华 一、海康威视 【老版本】 URL规定: rtsp://username:password[ipaddress]/[videotype]/ch[number]/[streamtype] 注:VLC可以支持解析URL里的用户名密码,实际发给设备的RTSP请求不支…...
用DMA来自动控制PWM的输出(音频输出,交直流转换)
一、前提分析 举例:一首歌所包含的音阶有高有低,而按照某种编曲的顺序排列也就对应了不同的频率(五线谱:1234567 对应的音阶各不相同)所以频率可以理解为它的源头。频率的来源又可由PWM来控制故而一首歌所包含的频率序…...
利用hive元数据统计数据量
对于数据量的统计,从表是否分区分为分区表和非分区表两者有着不同的统计方式 非分区表 1. 利用传统方法count 2. 利用元数据计算: 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 平均值 题目描述 在演讲比赛中,当参赛者完成演讲时,评委会对他的表演进行评分。工作人员会去掉一个最高分,一个最低分,然后计算其余的平均值作为参赛者…...
免费开源!DBdoctor推出开源版系统诊断工具systool
前言 在开发和运维过程中,经常会遇到难以定位的应用问题,我们通常需要借助Linux系统资源监控工具来辅助诊断。然而,系统的IO、网络、CPU使用率以及文件句柄等信息通常需要通过多个独立的命令工具来获取。在没有部署如Prometheus这样的综合…...
Bufferevent and SSL
bufferevent可以使用OpenSSL库实现SSL/TLS安全传输层。因为很多应用不需要或者不想链接OpenSSL,这部分功能在单独的libevent_openssl库中实现。未来版本的libevent可能会添加其他SSL/TLS库,如NSS或者GnuTLS,但是当前只有OpenSSL。 OpenSSL功能…...
我要成为算法高手-位运算篇
目录 1. 判断字符是否唯一2. 消失的数字3. 两整数之和4. 只出现一次的数字II5. 消失的两个数字 前情提要:如果对一些常见的二进制位运算不熟悉,请看这篇文章: 常见的位运算 1. 判断字符是否唯一 面试题 01.01. 判定字符是否唯一 - 力扣&…...
分布式IO模块:智慧楼宇的“智慧眼”与“智慧手”
在现代化的城市建设中,智慧楼宇作为一种集成了建筑、通信、计算机和控制等多方面技术的新型建筑,正逐渐成为城市发展的重要驱动力。智慧楼宇不仅提高了建筑设备的运行效率,降低了能源消耗,还提供了更加安全、舒适和便捷的生活办公…...
嵌入式八股文
硬件 1.CPU、MPU、MCU、SOC联系与差别 Cpu是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶 段:提取(Fetch)、解码(Dec…...
【IOS】Undefined symbol: _OBJC_CLASS_$_PAGFile
项目场景: flutter构建framework包,ios导入时,报PAG动画第三方库引用错误问题。 问题描述 Undefined symbol: _OBJC_CLASS_$_PAGFile Undefined symbol: _OBJC_CLASS_$_PAGPlayer Undefined symbol: _OBJC_CLASS_$_PAGSurface 1.第三方PAG…...
Spring Boot整合Tomcat底层源码分析
引言 Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring…...
工具类-基于 axios 的 http 请求工具 Request
基于 axios 的 http 请求工具 基于 axios 实现一个 http 请求工具,支持设置请求缓存和取消 http 请求等功能 首先实现一个 简单的 http 请求工具 import axios, {AxiosError,AxiosInterceptorManager,AxiosRequestConfig,AxiosResponse, } from axios;// 接口返回…...
WPF的基础控件详解
WPF的基础控件详解 在WPF学习中 基本控件是最简单也是最基础的东西。也是很初学者容易忽略的 本此笔记教程主要针对WPF中基础控件使用和应用进行手把手教学,如果学习了此笔记对你有帮助记得一键三连哦~~~~ TextBlock 基本用法 长字串处理 LineBreak标籤在指定的地…...
qt学习:截图+键盘事件
效果 生成一个透明无边框全屏的窗口,然后按ctrlb键就可以选择区域进行截图保存 步骤 新建一个项目新建一个ctrlb类继承QMainWindow新建一个CaptureScreen类继承QWidget在main中启动ctrlb类 代码 ctrlb类.cpp #include "ctrlb.h" #include "cap…...
Scala中Arry
import scala.collection.mutable.ArrayBuffer //Arry:数组 //可修改的:ArryBuffer //不可修改的:Arryobject Test_1118_2 {//可修改的:ArrayBufferdef main(args: Array[String]): Unit {//1.新建val arr1ArrayBuffer(1,2,3)//2.添加arr14a…...
学习threejs,使用AnimationMixer实现变形动画
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.AnimationMixer 动画…...
两大新兴开发语言大比拼:Move PK Rust
了解 Move 和 Rust 的差异有助于开发者根据项目的具体需求选择最合适的语言。选择不恰当的语言可能会导致项目后期出现技术债务。不同语言有其独特的优势。了解 Move 和 Rust 的差异可以帮助开发者拓展技术视野,发现不同语言在不同领域的应用潜力。 咱们直奔主题&a…...
基于一种基于OCR图像识别技术的发票采集管理系统及方法
本发明涉及了一种基于OCR图像识别技术的发票采集管理系统及方法,该系统的发票信息采集单元采集发票图片信息数据,OCR图像识别单元基于OCR图像识别技术并结合人工智能深度学习算法对发票图片信息数据进行识别读取以获得OCR图像识别结果,发票信…...
基于深度学习的车牌检测系统的设计与实现(安卓、YOLOV、CRNNLPRNet)+文档
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
JavaWeb——JS、Vue
目录 1.JavaScript a.概述 b.引入方式 c.JS的基础语法 d.JS函数 e.JS对象 f.JS事件监听 2.Vue a.概述 b.Vue常用指令 d.生命周期 1.JavaScript a.概述 JavaScript是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能使网页可交互。JavaScript和…...
Springboot 整合 Java DL4J 构建股票预测系统
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
ATmaga8单片机Pt100温度计源程序+Proteus仿真设计
目录 1、项目功能 2、仿真图 3、程序 资料下载地址:ATmaga8单片机Pt100温度计源程序Proteus仿真设计 1、项目功能 设计Pt100铂电阻测量温度的电路,温度测量范围是0-100摄氏度,要求LCD显示。画出电路图,标注元器件参数&am…...
FPGA通过MIPI CSI-2发送实时图像到RK3588,并HDMI显示
介绍FPGA通过MIPI CSI-2发送实时图像到RK3588,并HDMI显示。 FPGA本地产生动态图像模板,通过MIPI CSI-2接口发送到RK3588 MIPI CSI接口。RK3588注册成相机后,调用接口并在HDMI显示器上显示。 1、RK3588驱动调试 查看Media controller信息 Med…...
ELK8.15.4搭建开启安全认证
安装 Elastic :Elasticsearch,Kibana,Logstash 另外安装一个收集器filebeat 通过二进制安装包进行安装 创建一个专门放elk目录 mkdir /elk/ mkdir /elk/soft下载 es 、kibana、Logstash、filebeat二进制包 cd /elk/softwget https://art…...
原生微信小程序中封装一个模拟select 下拉框组件
1.首先在components 里面设置组件名称:van-select(随便取名字); 2.新建文件写代码: wxml: <view class"w100 select_all_view"><!-- 标题,可以没有 --><view class…...
商品管理系统引领时尚零售智能化升级 降价商品量锐减30%
根据贝恩咨询公司2024年发布的消费品报告,当前消费品行业正面临增长放缓、全球市场波动及消费者期望变化的巨大压力。为保持市场竞争力,企业需要重新审视其增长战略,重视可持续创新、数字化转型和运营敏捷性。企业必须灵活应对供应链中断和消…...
企业网站空间购买/电子商务是干什么的
本文默认读者已经对Docker有一定了解,且清楚使用Docker进行部署的优势。 1.安装Docker(Mac) 官网:https://docs.docker.com/docker-for-mac/install/ 1.1 下载 Docker for Mac 地址:https://store.docker.com/editions…...
网站建设前置审批/新媒体运营需要哪些技能
在报表的开发当中,难免会遇到行转列的问题。以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”:scott的emp的原始数据为:EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO7369SMITHCLERK790…...
建站公司怎么获客/今日油价92汽油
并发程序-1 实验目标: 学习使用Linux命令wc(1)基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端客户端传一个文本文件给服务器服务器返加文本文件中的单词数客户端代码: #include <stdlib.h> #include <stdio.h> #i…...
银行营销案例100例/怎么做网络推广优化
有现成的配置资料,但在配置过程中还是出现了好多问题,这里把自己的配置过程详细记录一下:原来的文档,大部分都是正确的,关键是java版本和Tomcat的版本问题。原文加上我自己的改动:一、简介 IBM 发布的 udd…...
给女友做的网站 源码/网站关键词优化公司
1332. 删除回文子序列 难度简单126收藏分享切换为英文接收动态反馈 给你一个字符串 s,它仅由字母 a 和 b 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符(字符串为空)的最小删除次数。 「子序列」…...
做网站设计需要办理icp/东莞网络营销全网推广
代码https://resources.oreilly.com/examples/9780596005559/ 移动模式是制造智能行为幻觉的简单方式。 实现移动模式的标准做法是选取想要的模式,再将控制数据填入某个数组或多个数组。控制数据由特定的移动指令组成,比如向前移动再转弯,借…...