【问题标题】:Flink-SQL: Extract values from nested objectsFlink-SQL:从嵌套对象中提取值
【发布时间】:2021-12-23 10:18:13
【问题描述】:

我正在使用 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 作业?

提前致谢。

【问题讨论】:

    标签: apache-flink flink-sql


    【解决方案1】:

    您可以定义computed row 或视图,然后使用点符号提取主题标签字段。例如:

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

    【讨论】:

    • 这个视图没有解决访问数组各个字段的问题。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2015-02-18
      • 2022-01-07
      • 2021-07-18
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      相关资源
      最近更新 更多