Flink-SQL:从嵌套对象中提取值

Flink-SQL: Extract values from nested objects

我正在使用 Flink SQL 并且以下方案显示了我的源数据(属于一些 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 (...);

我只想获取集合中的主题标签。因此,我必须将构造对象的集合 (ROW) 映射到字符串数组。

喜欢这个方案:

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

如何使用 Flink-SQL 实现此目的?也许是内置函数(JSON-函数?)或自己的 UDF,还是我必须编写 DataStream 作业?

提前致谢。

您可以定义一个 computed row 或一个 VIEW,然后使用点表示法提取主题标签字段。例如:

CREATE VIEW hashtags_raw (hashtags) AS 
  SELECT entities.hashtags AS hashtags FROM twitter_raw

SQL 命令 UNNEST 在这种情况下会有所帮助。它就像 Spark 中的 EXPLODE

您可以通过为 hashtags 数组中的每个主题标签创建一个新行来解决它:

SELECT hashtag, index
FROM twitter_raw 
CROSS JOIN UNNEST(hashtags) AS t (hashtag, index)