No se puede obtener el tipo JDBC para la estructura < fecha: int, día: int, horas: int, minutos: int, mes: int, segundos: int, hora: grande

Se informó un error durante el proceso de uso de Spark para guardar datos de tipo DataFrame en Oracle:

Exception in thread "main" java.lang.IllegalArgumentException: Can't get JDBC type for struct <data:int, day:int, hours:int, minutes:int, month:int, seconds:int, time:bigint, timeZoneOffset:int, year:int>

La estructura de datos de la tabla de Oracle es así:

pd_id-->varchar
ywxtmc-->varchar
sqljb-->varchar
rzlx-->varchar
cjbbh-->varchar
rzsj-->date
rksj-->date

La clase pojo que creé al principio es así:
Inserte la descripción de la imagen aquí
rzsj y rksj son tipos de cadena, lo que hace que el guardado falle y se informe un error.

Luego, el tipo de cadena se cambió al tipo de fecha y se informó el error de título:

java.lang.IllegalArgumentException: Can't get JDBC type for struct<date:int,day:int,hours:int,minutes:int,month:int,seconds:int,time:bigint,timezoneOffset:int,year:int>

Solución:
Idea: el campo de hora se guarda en formato de marca de tiempo

1. Primero, sigue usando el tipo de cadena
Inserte la descripción de la imagen aquí

2. Después de obtener el marco de datos, use las funciones integradas de sparkSQL para convertir al formato de marca de tiempo

RDD<String> stringRDD = sparkContext.textFile("C:\\Users\\yanni\\Documents\\WeChat Files\\yanning1994-4\\FileStorage\\File\\2020-07\\catalina.out", 5);
JavaRDD<String> stringJavaRDD = stringRDD.toJavaRDD();

JavaRDD<MGOutput> rowRDD = stringJavaRDD .map(line -> {
    
    
            String parts[] = line.split("&##&");

            MGOutput stu = new MGOutput();
            stu.setPd_id(parts[0]);
            stu.setSqljb(parts[1]);
            stu.setRzsj(parts[2]);
            stu.setYwxtmc("业务系统");
            stu.setRzlx("采集类型");
            stu.setCjbbh("版本号");

            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = df.format(new Date());
            stu.setRksj(format);
            return stu;
});

//完整数据的DataFrame
Dataset<Row> dataFrame = sparkSession.createDataFrame(rowRDD, MGOutput.class);
dataFrame.createTempView("rowDataset");
Dataset<Row> result = sparkSession.sql("select pd_id ,to_timestamp(rzsj) as rzsj,to_timestamp(rzsj) as rzsj from rowDataset");

//保存数据
result.write().mode("overwrite").format("jdbc")
                .option("url","jdbc:oracle:thin:@//192.168.1.xxx:11521/xxx")
                .option("user","xxx")
                .option("password","xxx")
                .option("dbtable","xxx")
                .option("batchsize","10").save();

3. Obtenga un nuevo marco de datos para guardarlo correctamente.

Supongo que te gusta

Origin blog.csdn.net/weixin_44455388/article/details/107462263
Recomendado
Clasificación