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.

Flink-SQL: Extraer valores de objetos anidados

Estoy utilizando Flink SQL y el siguiente esquema muestra mis datos fuente (que pertenecen a algunos datos de Twitter):

CREATE TABLE `twitter_raw` (
    `entities` ROW(
        `hashtags` ROW(
            `text` STRING,
            `indices` INT ARRAY
        ) ARRAY,
        `urls` ROW(
            `indices` INT ARRAY,
            `url` STRING,
            `display_url` STRING,
            `expanded_url` STRING
        ) ARRAY,
        `user_mentions` ROW(
            `screen_name` STRING,
            `name` STRING,
            `id` BIGINT
        ) ARRAY
    )
)
WITH (...);

Quiero obtener solo los hashtags en una colección. Por lo tanto, tengo que asignar la colección de objetos construidos (ROW) a un array de STRING.

Según este esquema:

CREATE TABLE `twitter_raw` (
    `entities` ROW(
        `hashtags` STRING ARRAY,
        `urls` STRING ARRAY,
        `user_mentions` STRING ARRAY
    )
)
WITH (...);

¿Cómo puedo lograr esto con Flink-SQL? ¿Tal vez con funciones integradas (funciones JSON?) o una UDF propia o debo escribir un trabajo de DataStream?

Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado de extraer solo los hashtags de la columna “entities” en la tabla “twitter_raw” utilizando Flink SQL, podemos utilizar funciones incorporadas como “FLATTEN” y “JSON_TUPLE” para manipular los datos JSON.

    Aquí tienes un ejemplo de consulta:

    SELECT FLATTEN(ARRAY(SELECT JSON_TUPLE(hashtags, 'text') FROM UNNEST(entities.hashtags))) AS hashtags
    FROM twitter_raw
    

    Vamos a desglosar esto paso a paso:

    1. UNNEST(entities.hashtags) expande la columna de matriz “hashtags” para que podamos acceder a cada objeto de hashtag individual.
    2. JSON_TUPLE(hashtags, 'text') extrae la propiedad “text” de cada objeto de hashtag y devuelve una nueva matriz de cadenas que contiene todos los hashtags para esa fila.
    3. ARRAY envuelve la matriz de hashtags en otra matriz, ya que “FLATTEN” espera una matriz bidimensional.
    4. FLATTEN aplana la matriz bidimensional en una matriz unidimensional, concatenando efectivamente todas las matrices de hashtags de cada fila en una matriz.
    5. Por último, seleccionamos la columna de matriz resultante utilizando el alias “hashtags”.

    Esta consulta debería darnos una tabla con una única columna “hashtags” que contiene todos los hashtags de la columna “entities” en cada fila, listos para ser utilizados para análisis o procesamiento posterior.

    Ten en cuenta que esta consulta asume que “hashtags” siempre está presente en el objeto “entities” y que siempre contiene una propiedad “text”. Si el esquema JSON varía, es posible que sea necesario realizar algunos ajustes en la consulta.

Comments are closed.