es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Descomprimir columna varbinary que contiene datos XML e insertarlos en una tabla de Hive.

Tenemos SQL Server 2016 con una columna varbinary que contiene XML comprimido. Ahora queremos cargar datos en una tabla de cdp hive (Hive 3.1.3000) DESCOMPRIMIÉNDOLOS.

Inicialmente estábamos utilizando una utilidad de Java para descomprimir e inflar los datos, pero ahora estamos buscando un enfoque alternativo como pyspark.

Estábamos utilizando el siguiente código de Java para inflar los datos:

if (colType == java.sql.Types.VARBINARY) {
msg = "Procesando VARBINARY " + colLabel;
// logger.info("Verificando columna VARBINARY: " + colLabel);
if (inflateColumnList.contains(colLabel)) {
ByteArrayInputStream bais = new ByteArrayInputStream(rs.getBytes(colIndex));
Inflater inflater = new Inflater(true);
InflaterInputStream iis = new InflaterInputStream(bais, inflater);
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
while (iis.available() != 0) {
buffer.write(iis.read());
}
iis.close();
result = new String(buffer.toByteArray(), "UTF-8");
} else {
logger.info("La columna VARBINARY: " + colLabel + " no está en la lista de descomprimir");
result = Base64.getEncoder().encodeToString(rs.getBytes(colIndex));
}
}

Estoy en el punto donde puedo obtener un arreglo de bytes del dataframe de la siguiente manera:

bytearrayobj = df.select(F.collect_list('itemdetailsdata')).first()[0][0]
print(zlib.decompress(bytes.decode(bytearrayobj,'utf-8')))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: el descriptor 'decode' requiere un objeto 'str' pero se recibió un 'bytearray'

Por favor, guíame sobre lo que debo hacer para generar XML descomprimido a partir de este arreglo de bytes.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para generar un XML descomprimido a partir del bytearrayobj dado, primero necesitas convertir el bytearray en un objeto bytes y luego utilizar la función zlib.decompress() para descomprimirlo. Aquí está el código Python actualizado:

    bytearrayobj = df.select(F.collect_list('itemdetailsdata')).first()[0][0]
    decompressed_data = zlib.decompress(bytes(bytearrayobj))
    result = decompressed_data.decode('utf-8')
    print(result)
    

    Este código debería descomprimir exitosamente los datos y almacenar la cadena XML resultante en la variable result. Luego puedes utilizar esta variable para cargar los datos en tu tabla Hive de CDP. Ten en cuenta que es posible que necesites modificar ligeramente el código en función de la estructura exacta de tus datos y del formato de salida deseado.

Comments are closed.