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.
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:
Vamos a desglosar esto paso a paso:
UNNEST(entities.hashtags)
expande la columna de matriz “hashtags” para que podamos acceder a cada objeto de hashtag individual.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.ARRAY
envuelve la matriz de hashtags en otra matriz, ya que “FLATTEN” espera una matriz bidimensional.FLATTEN
aplana la matriz bidimensional en una matriz unidimensional, concatenando efectivamente todas las matrices de hashtags de cada fila en una matriz.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.